Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölüme geçmeden önce lütfen TAEF'in temel kullanımını bildiğinizden ve TAEF'i kullanarak testleri nasıl yazabileceğinizi bildiğinizden emin olun.
Arka plan
"WMI", "Windows Yönetim Araçları" anlamına gelir. Sistemleri temsil eden endüstri standardı olan Ortak Bilgi Modeli'ni (CIM) kullanma. Windows Yönetim Araçları, sistem yönetimi bilgilerine erişmek için birleşik bir yol sağlar.
Testlerime nasıl yardımcı olur?
TAEF'de WMI DataSource olarak sağlanan WMI sorgu desteğini kullanarak, testinize bir önkoşul ekleyebilir ve testinizi çalıştırmadan önce test makinesindeki kaynaklar hakkında bilgi alabilirsiniz. WMI kullanarak yapabileceğiniz sorgu türüne ilişkin örneklerden bazıları şunlardır:
- Testin üzerinde çalıştığı makinenin bir dizüstü bilgisayar olup olmadığını denetleyin ve testi yalnızca dizüstü bilgisayarsa çalıştırın.
- Bir hizmet paketinin test makinesine yüklenip yüklenmediğini denetleyin ve testi yalnızca yüklüyse çalıştırın.
- Test makinesindeki tüm çıkarılabilir sürücüleri ve yerel sabit disk sürücülerini alın ve sorguyla eşleşen sürücülerin her biri için testi çalıştırın.
- Testi yalnızca test makinesi etki alanına katılmadıysa çalıştırın VEYA
- Testi yalnızca test makinesi etki alanına katılmışsa çalıştırın ve etki alanı adını elde edin.
Bu, testiniz için WMI DataSource'un nereden ve nasıl yararlanabileceğiniz konusunda size bir fikir verebilirdi. Şimdi TAEF testi yazarken bu WMI sorgu desteğini nasıl ekleyebileceğinize bakalım.
Testinizi WMI DataSource testi yapmak için ihtiyacınız olan tek özel meta veriler "DataSource" testidir. DataSource söz dizimi aşağıdaki gibi görünmelidir:
[DataSource("WMI:<WQL query>")]
Veya yerel kodda:
TEST_METHOD_PROPERTY(L"DataSource", L"WMI:<WQL query>")]
DataSource değerinin "WMI:" ile başladığını fark etmiş olmanız gerekir. Bu değer, TAEF'nin bunun gerçekten WMI sorgu sonucuna bağlı olan ve veri temelli testten ayıran bir test için veri kaynağı olduğunu bilmesini sağlar. Bu, şu anda TAEF'in, bir testin hem veri temelli hem de WMI sorgu sonucuna bağlı olmasını desteklemediğini belirtmek için iyi bir fırsattır.
Bir sonraki soru doğal olarak aradığınız şey için WQL sorguları nasıl yazabileceğinizdir? WQL sorgu söz dizimi, basitleştirilmiş SQL sorgularına çok benzer. Betikler ve Uygulamalar için WMI Görevleri'nde sağlanan sorguların bazı iyi örnekleri vardır. Aşağıda birkaç örnek verilmiştir:
SELECT Açıklama, DesktopInteract, ProcessId FROM Win32_Service WHERE Name='Temalar'
Testinizde kullanmayı planladığınız Açıklama, DesktopInteract ve ProcessId özelliklerini bulduktan sonra testi "Temalar" hizmetinde çalıştırın.
SELECT Kapasiteler, CapabilityDescriptions FROM Win32_Printer
Bu bilgisayara bağlı her yazıcı için testi çalıştırın. Testin, her yazıcı için Capabilities ve CapabilityDescriptions'e erişmesine izin verin.
SELECT İsim, Kullanıcı, Konum FROM Win32_StartupCommand
Windows başlangıcında çalıştırılacak her işlem için testi çalıştırın. Her işlem için teste işlemin adının ne olduğunu, nerede bulunduğunu (Konum) ve işlemin hangi Kullanıcı olarak çalıştığını bildirin.
Yukarıda bahsedilen belgelerde ve açtığınız örneklerde .cs dosyasında ve üst bilgi dosyasında daha fazla örnek bulabilirsiniz. Genel, fazla basitleştirilmiş söz dizimi aşağıdaki gibidir:
SELECT <comma separated properties> FROM <WMI Class name> [WHERE <add condition on some properties>]
Az önce gördüğünüz örneklerde Win32_Service, Win32_Printer ve Win32_StartupCommand tüm WMI Sınıfları'dır. WMI sınıflarında WMI sınıflarını arayabilirsiniz.
TAEF, Sistem Özelliklerinin alınmasını desteklemez.
Sahne arkasında TAEF sizin için sorguyu yürütür ve sonucu onaylar. Sorgu sonucunda en az bir nesne döndürülürse, döndürülen her nesne için test yürütülür. WQL sorgusu herhangi bir nesne döndürmezse, test bu bilgilerle Engellendi olarak günlüğe kaydedilir ve yürütme bir sonraki teste geçer.
Testinizi yazmadan önce sorgunuzu denetlemek veya doğrulamak harika bir fikirdir ve çok basit bir işlemdir:
- Çalıştır iletişim kutusundan veya komut isteminden "wbemtest.exe" çağrısı yapın
- Sağ üst köşedeki "Bağlan" düğmesine tıklayın.
- Sağ üst köşedeki "Bağlan" düğmesine yeniden tıklamadan önce ad alanınızın "root\cimv2" olduğundan emin olun.
- "IWbemServices" altında "Sorgu" seçeneğine tıklayın
- Görüntülenen düzenleme kutusuna sorgunuzu girin ve "Uygula" seçeneğine tıklayın
NOT: "IWbemService" sorgunuzda size yardımcı olabilecek başka seçeneklere sahiptir. Örneğin, "Enum Sınıfları"nı kullanmak ve radyo düğmesini "özyinelemeli" olarak değiştirmek, sistemdeki tüm WMI sınıflarını görmenize yardımcı olur.
WMI sorgusu kullanılarak sorgulanan özellikleri alma
Artık bir test yöntemi için WMI sorgusunun nasıl bulunacağı ve test yazarken meta veri olarak nasıl uygulanacağı hakkında bir fikriniz vardır. Ayrıca wbemtest.exekullanarak sorgunun geçerli olduğunu nasıl doğrulayabileceğinizi de biliyorsunuz. Şimdi aradığınız özellik değerlerinin nasıl alındığını görelim.
Bu bilgileri almayla ilgili temel bilgiler, veri temelli testinizin değerlerini almaya çok benzer. Örneğin, yönetilen kodda bu aşağıdaki gibi görünür:
1 namespace WEX.Examples
2 {
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using System;
5 using System.Collections;
6 using System.Data;
7 using WEX.Logging.Interop;
8 using WEX.TestExecution;
9
10 [TestClass]
11 public class CSharpWmiDataSourceExample
12 {
13 [TestMethod]
14 [DataSource("WMI:SELECT Description, DesktopInteract, ProcessId FROM Win32_Service WHERE Name='Themes'")]
15 public void ThemesTest()
16 {
17 String description = (String)m_testContext.DataRow["Description"];
18 Boolean desktopInteract = (Boolean)m_testContext.DataRow["DesktopInteract"];
19 UInt32 processId = (UInt32)m_testContext.DataRow["ProcessId"];
20 Log.Comment("Themes service is running on process " + processId.ToString() + " with desktop interact set to "
+ desktopInteract.ToString());
21 Log.Comment("Themes service description: " + description);
22 }
23 ...
24 public TestContext TestContext
25 {
26 get { return m_testContext; }
27 set { m_testContext = value; }
28 }
29
30 private TestContext m_testContext;
31 }
32}
Yukarıdaki örnekteki 24-30 arası satırlar, yönetilen veri temelli test için tam olarak gerekenlerdir. TAEF'nin doğru değerleri ayarlayabilmesi için, özel bir TestContext özelliği tanımlayıp, bunun için genel erişim ve değiştirme yöntemleri sağladınız. Özel TestContext özelliğini kullanarak, TAEF'den aldığınız WMI sorgu sonuç nesnesinin özelliklerinden herhangi birinin geçerli değerini alabilirsiniz.
WMI özelliklerini almak için yerel kod çok benzerdir. Yerel veri temelli testlerde olduğu gibi, özellik değerlerini almak için TestData kullanacaksınız. Örneğin, varsayılan yazıcının özelliklerini alma testini ele alalım. Üst bilgi dosyası bu testi şöyle yazar:
1 // Test on the default printer and its driver name
2 BEGIN_TEST_METHOD(DefaultPrinterTest)
3 TEST_METHOD_PROPERTY(L"DataSource",
L"WMI:SELECT DriverName, DeviceId, LanguagesSupported FROM Win32_Printer WHERE Default = True")
4 END_TEST_METHOD()
Bunun için cpp dosyasındaki alma kodumuz aşağıdaki gibi görünür:
1 void WmiExample::DefaultPrinterTest()
2 {
3 String deviceId;
4 VERIFY_SUCCEEDED(TestData::TryGetValue(L"DeviceId", deviceId));
5
6 String driverName;
7 VERIFY_SUCCEEDED(TestData::TryGetValue(L"DriverName", driverName));
8
9 TestDataArray<unsigned int> languagesSupported;
10 VERIFY_SUCCEEDED(TestData::TryGetValue(L"LanguagesSupported", languagesSupported));
11
12 Log::Comment(L"The default driver is " + deviceId + L" which is a " + driverName);
13 size_t count = languagesSupported.GetSize();
14 for (size_t i = 0; i < count; i++)
15 {
16 Log::Comment(String().Format(L"Language supported: %d", languagesSupported[i]));
17 }
18 }
Olası NULL özellik değerlerini hesaplama
Akılda tutulması gereken bölüm, WMI sorgusunun her zaman null olmayan bir özellik döndürmeyebileceğidir. Döndürülen WMI özellik değerinin "null" olduğu zamanlar olabilir. Aradığınız özelliğin bazı senaryolarda "null" olabileceğini düşünüyorsanız, doğrulamadan veya kullanmaya çalışmadan önce bu özelliği denetleyin.
Örneğin yönetilen test kodunda TestContext null değerleri DBNull türünde bir nesne olarak depolar. Sonuç değerini beklediğiniz türe dönüştürmeye çalışmadan önce nesnenin DBNull türünde olup olmadığını denetlemeniz gerekir. Şimdi bir göz atalım:
1 namespace WEX.Examples
2 {
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using System;
5 using System.Collections;
6 using System.Data;
7 using WEX.Logging.Interop;
8 using WEX.TestExecution;
9
10 [TestClass]
11 public class CSharpWmiDataSourceExample
12 {
13 [TestMethod]
14 [DataSource("WMI:SELECT MaximumComponentLength, Availability, DeviceId, DriveType, Compressed
FROM Win32_LogicalDisk WHERE DriveType=2 Or DriveType=3")]
15 public void LogicalDiskTest()
16 {
17 UInt32 driveType = (UInt32)m_testContext.DataRow["DriveType"];
18 Log.Comment("DeviceId is " + m_testContext.DataRow["DeviceId"]);
19 Log.Comment("DriveType is " + driveType.ToString());
20
21 object nullCheckCompressed = m_testContext.DataRow["Compressed"];
22 Log.Comment("Compressed's type is: " + nullCheckCompressed.GetType().ToString());
23 if (nullCheckCompressed.GetType() == typeof(DBNull))
24 {
25 Log.Comment("Compressed is NULL");
26 }
27 else
28 {
29 Boolean compressed = (Boolean)nullCheckCompressed;
30 Log.Comment("Compressed is " + compressed.ToString());
31 }
32
33 object nullCheckMaxComponentLength = m_testContext.DataRow["MaximumComponentLength"];
34 if (nullCheckMaxComponentLength.GetType() == typeof(DBNull))
35 {
36 Log.Comment("MaxComponentLength is NULL");
37 }
38 else
39 {
40 UInt32 maxComponentLength = (UInt32)nullCheckMaxComponentLength;
41 Log.Comment("MaxComponentLength is " + maxComponentLength.ToString());
42 }
43
44 object nullCheckAvailability = m_testContext.DataRow["Availability"];
45 if (nullCheckAvailability.GetType() == typeof(DBNull))
46 {
47 Log.Comment("Availability is NULL");
48 }
49 else
50 {
51 UInt32 availability = (UInt32)nullCheckAvailability;
52 Log.Comment("Availability is " + availability.ToString());
53 }
54 }
55 ...
56 public TestContext TestContext
57 {
58 get { return m_testContext; }
59 set { m_testContext = value; }
60 }
61
62 private TestContext m_testContext;
63 }
64}
Örneğin, yukarıdaki testte "Sıkıştırılmış", "MaximumComponentLength" ve "Kullanılabilirlik" bazı senaryolarda boş olabilir (sorgu, disket sürücüler gibi çıkarılabilir sürücüleri döndürdüğünde). Bu gibi durumlarda testin uygun şekilde davrandığından emin olmak istiyorsunuz. Bu amaçla, özelliğin değerini bir nesne olarak alın ve "DBNull" türünde olup olmadığını kontrol edin. Ise, döndürülen özellik değerinin null olduğu anlamına gelir. Değilse, döndürülen değer null değildir ve bu nedenle geçerli değildir; bu nedenle bunu uygun türlere yayınlayın ve test için kullanın.
Aynı durum yerel alma API'lerinde de geçerlidir. Döndürülen özellik değeri NULL olabilir. Bu, TestData'nın doğrulama çağrısı kullanmadan değeri başarıyla alıp almadığını denetlemeniz gerektiği anlamına gelir (alınamamasının nedeni değerin null olması olabilir). Örneğin, WMI sorgusuna bağlı bir test yönteminiz olabilir:
1 // Test on only local (drive type = 3) or removable (drive type = 2) harddrive
2 BEGIN_TEST_METHOD(LocalOrRemovableHardDriveTest)
3 TEST_METHOD_PROPERTY(L"DataSource", L"WMI:SELECT DeviceId, DriveType, Availability,
MaximumComponentLength FROM Win32_LogicalDisk WHERE DriveType=2 OR DriveType=3")
4 END_TEST_METHOD()
"Availability" ve "MaximumComponentLength" NULL değerler olarak döndürülebilir. Bu nedenle, bunu hesaba katmak için testi şu şekilde yazın:
1 void WmiExample::LocalOrRemovableHardDriveTest()
2 {
3 String deviceId;
4 VERIFY_SUCCEEDED(TestData::TryGetValue(L"DeviceId", deviceId));
5 int driveType;
6 VERIFY_SUCCEEDED(TestData::TryGetValue(L"DriveType", driveType));
7
8 unsigned int maxComponentLength;
9 if (SUCCEEDED(TestData::TryGetValue(L"MaximumComponentLength", maxComponentLength)))
10 {
11 Log::Comment(String().Format(L"MaximumComponentLength: %d", maxComponentLength));
12 }
13
14 unsigned int availability;
15 if (SUCCEEDED(TestData::TryGetValue(L"Availability", availability)))
16 {
17 Log::Comment(String().Format(L"Availability: %d", availability));
18 }
19
20 Log::Comment(L"DeviceId: " + deviceId);
21 Log::Comment(String().Format(L"DriveType: %d", driveType));
22 }