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.
Als uw testautomatisering afhankelijk is van aanwezigheid van apparaten of testresources, raadpleegt u het voorbeeld TestResourceExample en volgt u hoe u de apparaatondersteuning of testresourceondersteuning gebruikt die beschikbaar is in TAEF. Zorg ervoor dat u bekend bent met het ontwerpen van basistests met TAEF en de basisuitvoering van TAEF voordat u doorgaat.
Auteurschap voor apparaatondersteuning - Bronnenbestand
Te.Common.lib is vereist, naast andere bibliotheken die nodig zijn om een test in TAEF te schrijven.
Ontwerpen voor apparaatondersteuning - Resourcedefinitie testen
Gebruikers zijn verantwoordelijk voor het maken van hun eigen definitie van testresource (apparaat). Hiervoor moet u ITestResource implementeren. ITestResource is gedefinieerd in het gepubliceerde headerbestand ITestResource.h en ziet er als volgt uit:
namespace WEX { namespace TestExecution
{
namespace TestResourceProperty
{
// the following are reserved and must have properties for any TestResource definition
static const wchar_t c_szName[] = L"Name";
static const wchar_t c_szId[] = L"Id";
static const wchar_t c_szGuid[] = L"GUID";
static const wchar_t c_szType[] = L"Type";
}
struct __declspec(novtable) __declspec(uuid("79098e4c-b78d-434b-854d-2b59f5c4acc5")) ITestResource : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE GetGuid(GUID* pGuid) = 0;
virtual HRESULT STDMETHODCALLTYPE SetGuid(GUID guid) = 0;
virtual HRESULT STDMETHODCALLTYPE GetValue(BSTR name, BSTR* pValue) = 0;
virtual HRESULT STDMETHODCALLTYPE SetValue(BSTR name, BSTR value) = 0;
};
} /*namespace TestExecution*/ } /*namespace WEX*/
In ons voorbeeld implementeert de klasse MyTestResource de COM-interface ITestResource. In ITestResource.h vindt u ook een lijst met 'must-have'-eigenschappen die zijn gedefinieerd. Het moet mogelijk zijn om de GUID voor de testresource te verkrijgen met behulp van GetGuid(..) en de naam, id en het type van de resource met behulp van GetValue(...). Als een van deze gegevens ontbreekt in een TestResource, zal TAEF deze als ongeldig beschouwen en de informatie niet bijhouden. (Zie de sectie 'De resourcelijst bouwen' die volgt).
Opstellen voor apparaatondersteuning - Resourceafhankelijke metagegevens opgeven
Als u wilt opgeven dat de testmodule testresourceafhankelijke testmethoden heeft, moet de eigenschap TestResourceDependent van metagegevens op moduleniveau worden ingesteld op 'true'. De eigenschap wordt overgenomen door alle klassen in de testmodule en door alle testmethoden in deze klassen. Als een van de testmethode in de module niet afhankelijk is van de testresource, moet de metagegevenswaarde expliciet opnieuw worden ingesteld op false. Alle andere testmethoden die afhankelijk zijn van de testresource, moeten een selectiequery opgeven met behulp van de 'Id' en/of 'Type' van de testresource.
Hier volgen enkele voorbeelden van 'ResourceSelection' voor onze voorbeeldresourcelijst en wat ze allemaal betekenen:
- "@Id='HD*'": komt overeen met elke resource met een id die begint met HD
- "@Type='PCI'': komt overeen met elke resource van het type PCI
- "@Id="PCI*" OF @Id="HD*": komt overeen met elke resource die begint met PCI of begint met "HD"
- "@Type="PCI" en @id="*37": komt overeen met elke resource van het type "PCI" met een naam die eindigt op "37"
In onze voorbeeldcode ziet dit er als volgt uit:
BEGIN_MODULE()
MODULE_PROPERTY(L"TestResourceDependent", L"true")
END_MODULE()
class TestResourceExample
{
TEST_CLASS(TestResourceExample);
BEGIN_TEST_METHOD(NoTestResourceTest)
TEST_METHOD_PROPERTY(L"TestResourceDependent", L"false")
END_TEST_METHOD()
BEGIN_TEST_METHOD(OneHDAudioTest)
TEST_METHOD_PROPERTY(L"ResourceSelection", L"@Id='HD*'")
END_TEST_METHOD()
...
BEGIN_TEST_METHOD(HDorPCITest)
TEST_METHOD_PROPERTY(L"ResourceSelection", L"@Id='PCI*' OR @Id='HD*'")
END_TEST_METHOD()
...
};
In het bovenstaande voorbeeld ziet u dat de module is gemarkeerd als TestResourceDependent. NoTestResourceTest wordt expliciet gemarkeerd als niet afhankelijk van een testresource door metagegevens van TestRssourceDependent in te stellen op 'false'. Alle andere testmethoden geven een selectiecriteria op voor de testbronnen waarvoor ze geïnteresseerd zijn.
De grammatica voor selectiecriteria is vergelijkbaar met de grammatica van de selectiequery op opdrachtregel die beschikbaar is voor TAEF. In het geval van resource-selectie is het echter beperkt tot het gebruik van resource-id's en types. Omdat de resource-id een tekenreeks is, moet deze tussen enkele aanhalingstekens worden geplaatst. U kunt de jokertekens '*' of '?' gebruiken in de specificatie van de id-waarde. In ons bovenstaande voorbeeld geeft de resourceselectie in OneHDAudioTest een overeenkomst op met elke resource waarbij de id begint met HD. Op dezelfde manier komt de resource-selectie in het geval van HDorPCITest overeen met elke resource waarbij de Id begint met 'HD' of begint met 'PCI'. Het is belangrijk om te weten dat de resource-selectie niet hoofdlettergevoelig is. Met andere woorden: 'pci', 'Pci' en 'PCI' worden allemaal hetzelfde behandeld.
Op basis van de resourceselectie roept TAEF de testmethode opnieuw aan, samen met de methoden voor het instellen en opschonen van testniveaus (indien opgegeven) eenmaal voor elke testresource die overeenkomt met de selectie. In de volgende secties worden de details besproken over het opgeven van de lijst met resources en het verstrekken ervan aan TAEF en hoe de testmethode de resources in de volgende sectie kan ophalen.
Auteurschap voor apparaatondersteuning - De lijst met resources bouwen
Zodra TAEF een TestResourceDependent-testmodule tegenkomt, wordt gezocht naar de dll-geëxporteerde methode BuildResourceList en deze aangeroepen. Het bevindt zich in de implementatie van BuildResourceList, waar gebruikers nieuwe testresources kunnen maken en ze kunnen toevoegen aan de interface die wordt doorgegeven als parameter voor BuildResourceList. Laten we eens kijken naar de implementatie van deze methode in ons voorbeeld:
using namespace WEX::TestExecution;
HRESULT __cdecl BuildResourceList(ResourceList& resourceList)
{
Log::Comment(L"In BuildResourceList");
GUID myGuid;
VERIFY_SUCCEEDED(::CoCreateGuid(&myGuid));
CComPtr<ITestResource> spTestResource;
spTestResource.Attach(new MyTestResource(L"HDAudio1", L"HDAudio-deviceid-1", myGuid, L"HD"));
resourceList.Add(spTestResource);
spTestResource.Attach(new MyTestResource(L"HDAudio2", L"HDAudio-deviceid-2", myGuid, L"HD"));
resourceList.Add(spTestResource);
spTestResource.Attach(new MyTestResource(L"PCI1", L"PCI-deviceid-1", myGuid, L"PCI"));
resourceList.Add(spTestResource);
spTestResource.Attach(new MyTestResource(L"PCI2", L"PCI-deviceid-2", myGuid, L"PCI"));
resourceList.Add(spTestResource);
spTestResource.Attach(new MyTestResource(L"PCI3", L"PCI-deviceid-3", myGuid, L"PCI"));
resourceList.Add(spTestResource);
return S_OK;
}
BuildResourceList accepteert een verwijzing naar WEX::TestExecution::ResourceList als parameter. ResourceList is gedefinieerd in het gepubliceerde headerbestand ResourceList.h. Met behulp van de methode Add(...) in de ResourceList kunnen gebruikers alle gedetecteerde of gemaakte testresources toevoegen om TAEF te beheren en ermee te werken. In het bovenstaande voorbeeld zijn vijf dergelijke testbronnen toegevoegd.
De methode Toevoegen mislukt als de te toevoegen testresource de naam, id, type of GUID voor de resource niet retourneert.
De ResourceList wordt gedurende de levensduur van de testmodule onderhouden. Dat wil gezegd, totdat alle testmethoden en opschoningsmethoden worden uitgevoerd. Als BuildResourceList een MISLUKTE HRESULT-waarde retourneert, worden alle resourceafhankelijke testmethoden in de testmodule geregistreerd als geblokkeerd zonder uitvoering. Alle niet-testresources worden in ieder geval uitgevoerd.
BuildResourceList wordt aangeroepen vóór andere methoden in de testmodule. Nadat de resourcelijst is gemaakt (in BuildResourceList), worden de metagegevens ResourceSelection gebruikt om de beschikbare resources in de resourcelijst te matchen. Als er een overeenkomst wordt gevonden, worden alle installatiemethoden (module, klasse, testvolgorde) aangeroepen, gevolgd door de testmethode zelf. De opschoonmethode op testniveau wordt aangeroepen na elke aanroep van de test.
Achter de schermen behoudt TAEF de ResourceList waarop de selectie van resources wordt toegepast. Voor de testmethode OneHDAudioTest komen de testresources met Ids 'HDAudio-deviceid-1' en 'HDAudio-deviceid-2' beide overeen met 'HD*' en voor elk daarvan wordt de testmethode opnieuw aangeroepen door TAEF (één keer voor elk). Er wordt ook een impliciete index gekoppeld aan elke aanroep van de test. Dus ziet u <de naamruimtekwalificatie>OneHDAudioTest#0 en <de naamruimtekwalificatie>OneHDAudioTest#1 als de twee aanroepen.
Opstellen voor apparaatondersteuning - Het apparaat ophalen in een testmethode
In eerdere secties is gekeken naar het toevoegen van de benodigde metagegevens op module-, klasse- en testmethodeniveau. Ze hebben ook gekeken naar het definiëren van aangepaste testresources en hoe ze aan de ResourceList kunnen worden toegevoegd in de implementatie van BuildResourceList. Het volgende deel dat volgt, is het ophalen van de resources in de testmethode. Laten we eens kijken naar een van de eenvoudige testmethoden in ons voorbeeld:
1 void TestResourceExample::OneHDAudioTest()
2 {
3 Log::Comment(L"In HD audio test");
4 size_t count = Resources::Count();
5 size_t index = 0;
6 VERIFY_ARE_EQUAL(count, (index + 1));
7
8 CComPtr<ITestResource> spTestResource;
9 VERIFY_SUCCEEDED(Resources::Item(index, &spTestResource));
10
11 // Get Resource Id
12 CComBSTR value;
13 VERIFY_SUCCEEDED(spTestResource->GetValue(CComBSTR(TestResourceProperty::c_szId), &value));
14 Log::Comment(L"Resource Id is " + String(value));
15 }
In OneHDAudioTest selecteert de resourceselectie één testresource tegelijk waarbij de resource-id begint met HD. De statische klasseResources die zijn gedefinieerd in ResourceList.h, bieden de API's voor het ophalen van het aantal en de werkelijke resource die beschikbaar is tijdens een bepaalde aanroep van de test. In dit geval geeft Resources::Count() het aantal beschikbare testbronnen tijdens de huidige aanroep van de testmethode, zoals u in het bovenstaande voorbeeld ziet in regel 4, 9 en 13. In deze testmethode moet dit 1 zijn. U kunt deze waarde controleren met behulp van de macro's VERIFY die beschikbaar zijn in TAEF (Verify.h). Als een van de verificatieaanroepen mislukt in een TAEF-test op basis van uitzonderingen, wordt de uitvoering op dat moment beëindigd en wordt de testmethode gemarkeerd als Mislukt.
Vervolgens gebruikt u resources::Item(...) API en geeft een index door waarop de resource moet worden opgehaald (in dit geval omdat er slechts één testresource beschikbaar is tijdens een aanroep, is de index altijd 0), kunt u de testresource ophalen. De testmethode kan de opgehaalde testresource verder gebruiken omdat deze nodig is voor het testen ervan.
Hetzelfde basisprincipe wordt gevolgd in alle testmethoden. Bekijk andere testmethoden in het voorbeeld om een beter begrip te krijgen.
Een testmodule die afhankelijk is van een testresource uitvoeren
Nu de testresourceafhankelijke tests zijn gemaakt en gebouwd, kunt u deze nu uitvoeren met behulp van TAEF. Het belangrijkste punt om op te merken is dat TestResourceDependent-tests alleen inproc kunnen worden uitgevoerd. Dit betekent dat zelfs als u de schakeloptie '/inproc' niet expliciet opgeeft, deze wordt toegevoegd zodra TAEF de testmodule ontdekt die afhankelijk is van testresources. Zoals u misschien weet, kunnen tests van slechts één testmodule worden uitgevoerd in een bepaalde TAEF-uitvoering wanneer de schakeloptie '/inproc' aanwezig is. Dit betekent dat u niet meer dan één testmodule op de opdrachtregel kunt opgeven als uw testmodule afhankelijk is van resources.
Als u alle tests in onze testmodule daadwerkelijk wilt uitvoeren, kunt u het volgende uitvoeren:
te Examples\Cpp.TestResource.Example.dll
Een handige manier om alleen een lijst op te halen van alle aanroepen van de testmethoden en de combinaties van gegevens en metagegevens zonder daadwerkelijk de testmethoden uit te voeren, is door de /listproperties schakeloptie te gebruiken op de opdrachtregel. Laten we eens kijken naar de uitvoer.
te Examples\Cpp.TestResource.Example.dll /listproperties
Test Authoring and Execution Framework v2.9.3k for x86
In BuildResourceList
Verify: SUCCEEDED(::CoCreateGuid(&myGuid))
f:\toolsdev.binaries.x86chk\WexTest\CuE\TestExecution\Examples\Cpp.TestResource.Example.dll
Property[TestResourceDependent] = true
WEX::TestExecution::Examples::TestResourceExample
WEX::TestExecution::Examples::TestResourceExample::NoTestResourceTest
Property[TestResourceDependent] = false
WEX::TestExecution::Examples::TestResourceExample::OneHDAudioTest#0
Property[ResourceSelection] = @Id='HD*'
Resource#0
Id = HDAudio-deviceid-1
Name = HDAudio1
Type = HD
WEX::TestExecution::Examples::TestResourceExample::OneHDAudioTest#1
Property[ResourceSelection] = @Id='HD*'
Resource#0
Id = HDAudio-deviceid-2
Name = HDAudio2
Type = HD
WEX::TestExecution::Examples::TestResourceExample::OnePCIDeviceTest#0
Property[ResourceSelection] = @Id='PCI*'
Resource#0
Id = PCI-deviceid-1
Name = PCI1
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::OnePCIDeviceTest#1
Property[ResourceSelection] = @Id='PCI*'
Resource#0
Id = PCI-deviceid-2
Name = PCI2
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::OnePCIDeviceTest#2
Property[ResourceSelection] = @Id='PCI*'
Resource#0
Id = PCI-deviceid-3
Name = PCI3
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#0
Property[ResourceSelection] = @Id='PCI*' OR @Id='HD*'
Resource#0
Id = HDAudio-deviceid-1
Name = HDAudio1
Type = HD
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#1
Property[ResourceSelection] = @Id='PCI*' OR @Id='HD*'
Resource#0
Id = HDAudio-deviceid-2
Name = HDAudio2
Type = HD
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#2
Property[ResourceSelection] = @Id='PCI*' OR @Id='HD*'
Resource#0
Id = PCI-deviceid-1
Name = PCI1
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#3
Property[ResourceSelection] = @Id='PCI*' OR @Id='HD*'
Resource#0
Id = PCI-deviceid-2
Name = PCI2
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#4
Property[ResourceSelection] = @Id='PCI*' OR @Id='HD*'
Resource#0
Id = PCI-deviceid-3
Name = PCI3
Type = PCI
WEX::TestExecution::Examples::TestResourceExample::PCI1AudioTest #0
Property[ResourceSelection] = @Id='PCI*' AND @Id='*1'
Resource#0
Id = PCI-deviceid-1
Name = PCI1
Type = PCI
Let op de impliciete index die tijdens elke aanroep van een testresource wordt toegevoegd aan de naam van de testmethode. De eigenschap ResourceSelection wordt weergegeven, gevolgd door een lijst met alle resources die beschikbaar zijn voor de testmethode in de volgorde waarin ze beschikbaar zijn. In het geval van de derde aanroep van HDAudioHDAudioPCITest (HDAudioHDAudioPCITest#2) is HDAudio-deviceid-1 bijvoorbeeld de resource die beschikbaar is in index 0 in Resources::Item(...).
U kunt specifieker zijn over de test-aanroep waarin u geïnteresseerd bent met behulp van de opdrachtregelquerytaal die beschikbaar is in TAEF. Als u bijvoorbeeld alle aanroepen van testmethoden wilt selecteren waarbij de testbronnen PCI-deviceid-3 beschikbaar zijn, kunt u de selectiecriteria gebruiken:
te Examples\Cpp.TestResource.Example.dll /list
/select:"@Resource:Id='PCI-deviceid-3'"
Test Authoring and Execution Framework v2.9.3k for x86
In BuildResourceList
Verify: SUCCEEDED(::CoCreateGuid(&myGuid))
f: \Examples\Cpp.TestResource.Example.dll
WEX::TestExecution::Examples::TestResourceExample
WEX::TestExecution::Examples::TestResourceExample::OnePCIDeviceTest#2
WEX::TestExecution::Examples::TestResourceExample::HDorPCITest#4
Als u een bepaalde testmethode op naam wilt selecteren (de namen van testmethoden zijn volledig gekwalificeerd, samen met de aanroepindex die aan het einde is toegevoegd), kunt u als volgt een selectiequery gebruiken:
te Examples\Cpp.TestResource.Example.dll /name:*OneHDAudioTest#1
Test Authoring and Execution Framework v2.2 Build 6.1.7689.0 (release.091218-1251) for x86
Discovered a test resource dependent test module. Assuming /InProc execution.
In BuildResourceList
Verify: SUCCEEDED(::CoCreateGuid(&myGuid))
StartGroup: WEX::TestExecution::Examples::TestResourceExample::OneHDAudioTest#1
In HD audio test
Verify: AreEqual(count, (index + 1))
Verify: SUCCEEDED(Resources::Item(index, &spTestResource))
Verify: SUCCEEDED(spTestResource->GetValue(CComBSTR(TestResourceProperty::c_szId), &value))
Resource Id is HDAudio-deviceid-2
WEX::TestExecution::Examples::TestResourceExample::OneHDAudioTest#1 [Passed]
Summary: Total=1, Passed=1, Failed=0, Blocked=0, Not Run=0, Skipped=0
Let op de impliciet toegevoegde inproc-waarschuwing in de derde regel van het bovengegeven voorbeeld. De bovenstaande selectiequery had hetzelfde effect als de selectiequery:/select:"@Name='*OneHDAudio*' en @Resource:Index=1". Het is ook mogelijk om een resource te selecteren met de naam of het type (of id zoals hierboven wordt weergegeven). Als u bijvoorbeeld /select:"@Name="*PCIHDAudioTest*" en @Resource:Name="PCI3" selecteert, worden testmethoden PCIHDAudioTest#4 en PCIHDAudioTest#5 geselecteerd.
Het uitproberen van deze en andere selectiequery's bij de opdrachtprompt is overgelaten als oefening voor de lezer.