Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Zorg ervoor dat u bekend bent met de basisuitvoering van TAEF en weet hoe u tests kunt schrijven die deze gebruiken, voordat u doorgaat met deze sectie.
Achtergrond
"WMI" staat voor "Windows Management Instrumentation". Door het gebruik van het Common Information Model (CIM), dat de industriestandaard is voor het weergeven van systemen. Windows Management Instrumentation biedt een uniforme manier voor toegang tot systeembeheerinformatie.
Hoe helpt het mijn tests?
Met behulp van de WMI-queryondersteuning die beschikbaar is als WMI DataSource in TAEF, kunt u een voorwaarde toevoegen aan uw test en informatie krijgen over de resources op de testmachine voordat u de test uitvoert. Hier volgen enkele voorbeelden van het type query dat u kunt maken met WMI:
- Controleer of de machine waarop de test wordt uitgevoerd een laptop is en voer de test alleen uit als het een laptop is.
- Controleer of een servicepack is geïnstalleerd op de testmachine en voer de test alleen uit als dit is gebeurd.
- Haal alle verwisselbare stations en lokale harde schijven op de testmachine op en voer de test uit voor elk van de stations die overeenkomen met de query.
- Voer de test alleen uit als de testmachine geen lid is van een domein of
- Voer de test alleen uit als de testmachine lid is van een domein en de domeinnaam ophaalt.
Dat zou u hopelijk een idee hebben gegeven over waar en hoe u WMI DataSource kunt gebruiken voor uw tests. Laten we eens kijken hoe u deze WMI-queryondersteuning toevoegt tijdens het ontwerpen van een TAEF-test.
De enige speciale metagegevens die u nodig hebt om uw test een WMI DataSource-test te maken, is de 'DataSource'. De syntaxis van datasource moet er als volgt uitzien:
[DataSource("WMI:<WQL query>")]
Of in systeemeigen code:
TEST_METHOD_PROPERTY(L"DataSource", L"WMI:<WQL query>")]
U moet hebben gemerkt dat de DataSource-waarde begint met 'WMI:', waarmee TAEF weet dat dit inderdaad de gegevensbron is voor een test die afhankelijk is van het WMI-queryresultaat en deze ook onderscheidt van gegevensgestuurde tests. Dit is een goede gelegenheid om te vermelden dat TAEF momenteel geen ondersteuning biedt voor een test die zowel een gegevensgestuurde test als een test ondersteunt die afhankelijk is van het WMI-queryresultaat.
De volgende vraag is natuurlijk hoe u WQL-query's schrijft voor wat u zoekt? De syntaxis van WQL-query's is vergelijkbaar met vereenvoudigde SQL-query's. Er zijn enkele zeer goede voorbeelden van query's in WMI-taken voor scripts en toepassingen. Enkele voorbeelden:
SELECTeer Beschrijving, DesktopInteractie, ProcessId VAN Win32_Service WAAR Naam='Themes'
Voer de test uit op de service Thema's nadat u de eigenschappen Description, DesktopInteract en ProcessId hebt gevonden die u in uw test wilt gebruiken.
SELECT Capabilities, CapabilityDescriptions FROM Win32_Printe
Voer de test uit voor elke printer die is verbonden met deze computer. Hiermee staat u toe dat de test toegang heeft tot de Capabilities en CapabilityDescriptions voor elke printer.
SELECT Name, User, Location FROM Win32_StartupCommand
Voer de test uit voor elk proces dat wordt uitgevoerd bij het opstarten van Windows. Laat voor elk proces de test weten wat de naam van het proces is, waar het zich bevindt (locatie) en welke gebruiker het proces uitvoert.
Meer voorbeelden vindt u in de bovenstaande documentatie en in het .cs bestand en headerbestand in de voorbeelden die u hebt geopend. De algemene, vereenvoudigde syntaxis is als volgt:
SELECT <comma separated properties> FROM <WMI Class name> [WHERE <add condition on some properties>]
In de voorbeelden die u zojuist hebt gezien, zijn Win32_Service, Win32_Printer en Win32_StartupCommand alle WMI-klassen. U kunt de WMI-klassen opzoeken in WMI-klassen.
TAEF biedt geen ondersteuning voor het ophalen van systeemeigenschappen.
Achter de schermen voert TAEF de query voor u uit en bevestigt u het resultaat. Als ten minste één object wordt geretourneerd als gevolg van de query, wordt de test uitgevoerd voor elk geretourneerd object. Als de WQL-query geen objecten retourneert, wordt de test geregistreerd als Geblokkeerd met deze informatie en wordt de uitvoering verplaatst naar de volgende test.
Het controleren of verifiëren van uw query voordat u uw test ontwerpt, lijkt een goed idee en is een zeer eenvoudig proces:
- Vanuit het dialoogvenster Uitvoeren of een opdrachtprompt aanroepen "wbemtest.exe"
- Klik op de knop Verbinding maken in de rechterbovenhoek.
- Zorg ervoor dat uw naamruimte root\cimv2 is voordat u opnieuw op Verbinding maken klikt in de rechterbovenhoek.
- Klik onder 'IWbemServices' op Query
- Voer uw query in het invoervak in dat wordt weergegeven en klik op Toepassen
OPMERKING: De 'IWbemService' heeft verschillende andere opties die u kunnen helpen met uw query. Als u bijvoorbeeld 'Enum Classes' gebruikt en de radioknop aanpast naar 'recursief', kunt u alle WMI-klassen op het systeem bekijken.
Eigenschappen ophalen die zijn opgevraagd met behulp van de WMI-query
U hebt nu een idee hoe u een WMI-query kunt maken voor een testmethode en hoe u deze kunt toepassen als metagegevens tijdens het ontwerpen van een test. U weet ook hoe u kunt bevestigen dat de query geldig is met behulp van wbemtest.exe. Laten we nu kijken hoe u de gewenste eigenschapswaarden kunt ophalen.
De basisbeginselen voor het ophalen van deze informatie zijn vergelijkbaar met het ophalen van waarden voor uw gegevensgestuurde test. In beheerde code ziet dit er bijvoorbeeld als volgt uit:
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}
Regels 24-30 in het bovenstaande voorbeeld zijn precies wat vereist is voor een beheerde gegevensgestuurde test. U hebt een persoonlijke TestContext-eigenschap gedefinieerd en openbare getter en setter opgegeven voor TAEF om de juiste waarden in te stellen. Met behulp van de eigenschap Private TestContext kunt u de huidige waarde ophalen voor de eigenschappen van het WMI-queryresultaatobject die u hebt opgehaald uit TAEF.
De systeemeigen code voor het ophalen van de WMI-eigenschappen is vergelijkbaar. Net als bij systeemeigen gegevensgestuurde tests gebruikt u TestData om de eigenschapswaarden op te halen. Laten we bijvoorbeeld eens kijken naar de test voor het ophalen van eigenschappen van de standaardprinter. De auteurs van het headerbestand schrijven deze test als volgt:
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()
Hiervoor ziet onze ophaalcode in het cpp-bestand er als volgt uit:
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 }
Rekening houdend met mogelijke NULL-waarden van eigenschappen
Het deel waarmee u rekening moet houden, is dat de WMI-query mogelijk niet altijd een niet-null-eigenschap retourneert. Het kan voorkomen dat de geretourneerde WMI-eigenschapswaarde null is. Als u denkt dat de eigenschap die u zoekt in sommige scenario's null kan zijn, controleert u deze voordat u deze verifieert of probeert te gebruiken.
In beheerde testcode worden bijvoorbeeld de null-waarden opgeslagen als object van het type DBNull. U moet controleren of het object van het type DBNull is voordat u de resulterende waarde probeert te casten naar het type dat u verwacht. Laten we eens kijken:
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}
In de bovenstaande test kunnen bijvoorbeeld 'Gecomprimeerd', 'MaximumComponentLength', en 'Beschikbaarheid' null zijn in sommige scenario's (wanneer de query verwisselbare stations retourneert, zoals diskettestations). U wilt ervoor zorgen dat de test zich in dergelijke gevallen op de juiste wijze gedraagt. Hiermee haalt u de eigenschapswaarde op als een object en controleert u of het van het type DBNull is. Als dat zo is, betekent dit dat de geretourneerde eigenschapswaarde null is. Als dit niet het geval is, is de geretourneerde waarde niet null en dus geldig. Cast deze dus naar de juiste typen en gebruik deze voor de test.
Hetzelfde geldt voor systeemeigen ophaal-API's. De geretourneerde eigenschapswaarde kan NULL zijn. Dit betekent dat u moet controleren of de TestData de waarde heeft opgehaald zonder een verificatie-aanroep te gebruiken (omdat de waarde niet kan worden opgehaald omdat de waarde null is). U hebt bijvoorbeeld een testmethode die afhankelijk is van een WMI-query:
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()
Mogelijk hebt u 'Beschikbaarheid en 'MaximumComponentLength' geretourneerd als NULL-waarden. Schrijf dus de test om dit als volgt te doen:
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 }