Dela via


Enhetsstöd

Om din testautomatisering förlitar sig på närvaro av enheter eller testresurser kan du läsa exemplet TestResourceExample och följa med i hur du använder enhetsstöd eller testresursstöd som är tillgängligt i TAEF. Kontrollera att du är bekant med hur du skapar grundläggande tester med hjälp av TAEF och den grundläggande körningen av TAEF innan du fortsätter.

Redigering för enhetsstöd – källfil

Te.Common.lib krävs utöver andra bibliotek som behövs för att skapa ett test i TAEF.

Redigering för enhetsstöd – Testa resursdefinition

Användarna ansvarar för att skapa en egen testresursdefinition (enhet). För att göra detta måste du implementera ITestResource. ITestResource definieras i den publicerade huvudfilen ITestResource.h och ser ut så här:

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*/

I vårt exempel implementerar klassen MyTestResource ITestResource COM Interface. I ITestResource.h hittar du också en lista över definierade egenskaper för "måste ha". Det bör vara möjligt att hämta GUID för testresursen med hjälp av GetGuid(..) och namn, ID och typ av resurs med hjälp av GetValue(...). Om något av detta saknas i en TestResource anser TAEF att det är ogiltigt och inte underhåller informationen. (Se avsnittet "Skapa resurslistan" som följer).

Redigering för enhetsstöd – Ange resursberoende metadata

För att kunna ange att testmodulen har testresursberoende testmetoder måste metadataegenskapen TestResourceDependent på modulnivå anges till "true". Egenskapen ärvs av alla klasser i testmodulen och av alla testmetoder i dessa klasser. Om någon av testmetoden i modulen inte är beroende av en testresurs bör den uttryckligen ange värdet för metadata till false. Alla andra testmetoder som är beroende av testresursen måste ange en urvalsfråga med testresursens "ID" och/eller "Typ".

Här är några snabba exempel på "ResourceSelection" för vår exempelresurslista och vad var och en av dem antyder:

  • "@Id='HD*'": matchar varje resurs med ett ID som börjar med "HD"
  • "@Type='PCI'": matchar varje resurs av typen "PCI"
  • "@Id='PCI*' ELLER @Id='HD*'": matchar varje resurs som börjar med "PCI" eller börjar med "HD"
  • "@Type='PCI' och @id='*37'": matchar varje resurs en av typen "PCI" med ett namn som slutar på "37"

I vår exempelkod ser det ut så här:

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()
        ...
    };

I exemplet ovan ser du att modulen är markerad som "TestResourceDependent". NoTestResourceTest markeras uttryckligen som inte beroende av någon testresurs genom att ange "TestRssourceDependent"-metadata till "false". Alla andra testmetoder anger ett urvalsvillkor för de testresurser som de är intresserade av att köra för.

Grammatiken för urvalskriterier liknar den kommandoradsvalsfråga som är tillgänglig för TAEF. När det gäller resursval är det dock begränsat till användning av resurs-ID och typer. Eftersom resurs-ID är en sträng måste den omges av enkla citattecken. Du kan använda jokertecknet "*" eller "?" i specifikationen av ID-värdet. I vårt exempel ovan, i OneHDAudioTest, anger resursvalet en matchning till alla resurser där ID börjar med "HD". När det gäller HDorPCITest matchar resursvalet alla resurser där ID:t börjar med "HD" eller börjar med "PCI". Det är viktigt att observera att resursvalet är skiftlägesokänsligt – det vill säga att "pci", "Pci" och "PCI" alla behandlas på samma sätt.

Baserat på resursvalet anropar TAEF testmetoden igen tillsammans med testnivåkonfigurations- och rensningsmetoderna (om de anges) en gång för varje testresurs som matchar markeringen. I följande avsnitt går vi igenom informationen om hur du anger listan över resurser och anger den för TAEF och hur testmetoden kan hämta resurserna i nästa avsnitt.

Redigering för enhetsstöd – Skapa resurslistan

Så snart TAEF stöter på en TestResourceDependent-testmodul letar den efter och anropar den dll-exporterade metoden BuildResourceList. Det är i implementeringen av BuildResourceList där användare kan skapa nya testresurser och lägga till dem i gränssnittet som skickas som en parameter till BuildResourceList. Låt oss ta en titt på implementeringen av den här metoden i vårt exempel:

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 accepterar en referens till WEX::TestExecution::ResourceList som parameter. ResourceList definieras i den publicerade huvudfilen ResourceList.h. Med hjälp av metoden Lägg till(...) på ResourceList kan användarna lägga till alla testresurser som identifierats eller skapats för TAEF att hantera och arbeta med. Exemplet ovan lade till 5 sådana testresurser.

Metoden Lägg till misslyckas om testresursen som ska läggas till inte returnerar antingen "Namn", "ID", "Typ" eller GUID för resursen.

ResourceList behålls under testmodulens livslängd, dvs. tills alla testmetoder och rensningsmetoder har körts. Om BuildResourceList returnerar ett FAILED HRESULT-värde loggas alla resursberoende testmetoder i testmodulen som blockerade utan att köras. Alla icke-testresurser körs oavsett.

BuildResourceList anropas före andra metoder i testmodulen. När resurslistan har skapats (i BuildResourceList) används metadatan "ResourceSelection" för att matcha tillgängliga resurser i resurslistan. Om en matchning hittas anropas alla installationsmetoder (modul, klass, testordning) följt av själva testmetoden. Rensningsmetoden på testnivå anropas efter varje testanrop.

I bakgrunden behåller TAEF den "ResourceList" som valet av resurser tillämpas på. För OneHDAudioTest-testmetoden matchar testresurserna med ID:n "HDAudio-deviceid-1" och "HDAudio-deviceid-2" båda "HD*" och för var och en av dessa anropas testmetoden igen av TAEF (en gång för varje). Det kommer också att finnas ett implicit index som är associerat med varje anrop av testet. Så du ser <namnområdeskvalificeraren>OneHDAudioTest#0 och <namnområdeskvalificeraren>OneHDAudioTest#1 som de två anropen.

Redigering för enhetsstöd – Hämta enheten i en testmetod

I föregående avsnitt tittade vi på hur du lägger till nödvändiga metadata på modul-, klass- och testmetodnivå. De tittade också på hur du definierar anpassade testresurser och hur du lägger till dem i ResourceList i implementeringen av BuildResourceList. Nästa del som följer är att hämta resurserna i testmetoden. Låt oss ta en titt på en av de enkla testmetoderna i vårt exempel:

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  }

I OneHDAudioTest väljer resursvalet en testresurs i taget där resurs-ID:t börjar med "HD". Den statiska klassen Resurser som definierats i ResourceList.h tillhandahåller API:er för att hämta antalet samt den faktiska resursen som är tillgänglig under ett givet anrop av testet. I det här fallet, som du kan se i raderna 4, 9 och 13 i exemplet ovan, ger Resources::Count() antalet tillgängliga testresurser under testmetodens aktuella anrop. I den här testmetoden ska detta vara 1. Du kan verifiera det här värdet med hjälp av VERIFIERA makron som är tillgängliga i TAEF (Verify.h). Om något av verifieringsanropen misslyckas i ett undantagsbaserat TAEF-test avslutas körningen vid den tidpunkten och testmetoden markeras som Misslyckad.

Sedan använder du Resurser::Item(...) API och skicka in ett index där du kan hämta resursen (i det här fallet eftersom endast en testresurs kommer att vara tillgänglig under ett anrop, indexet alltid är 0), kan du hämta testresursen. Testmetoden kan ytterligare använda den hämtade testresursen när den behövs för testningen.

Samma grundläggande princip följs i alla testmetoder. Ta en titt på andra testmetoder i exemplet för att få en bättre förståelse.

Körning av en testresurs-beroende testmodul

När tester som är beroende av testresurser nu har författats och byggts kan du nu köra dem med TAEF. Den viktigaste punkten att notera är att TestResourceDependent-tester endast kan köras inproc. Det innebär att även om du inte uttryckligen anger växeln "/inproc", kommer den att läggas till så snart TAEF upptäcker testmodulen som är beroende av testresurser. Som du kanske vet kan tester från endast en testmodul köras i en viss TAEF-körning när växeln "/inproc" finns. Det innebär att du inte kan ange fler än en testmodul på kommandoraden om testmodulen är resursberoende.

Om du vill köra alla tester i vår testmodul kan du helt enkelt köra:

te Examples\Cpp.TestResource.Example.dll

Ett användbart sätt att bara få en lista över alla testmetodanrop och kombinationer av data och metadata utan att faktiskt köra testmetoderna är att använda /listproperties-växeln på kommandoraden. Låt oss ta en titt på utdata.

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

Observera det implicita index som läggs till i testmetodens namn under varje anrop av en testresursavanvänd testmetod. Egenskapen ResourceSelection visas följt av en lista över alla resurser som ska vara tillgängliga för testmetoden i den ordning de är tillgängliga. Om det till exempel gäller det tredje anropet av HDAudioHDAudioPCITest (HDAudioHDAudioPCITest#2) är HDAudio-deviceid-1 resursen som är tillgänglig vid index 0 i Resurser::Objekt(...).

Du kan vara mer specifik om vilket testanrop du är intresserad av med hjälp av frågespråket för kommandoradsval som är tillgängligt i TAEF. Om du till exempel vill välja alla anrop av testmetoder där testresurserna "PCI-deviceid-3" är tillgängliga kan du använda urvalskriterierna:

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

Om du vill välja en viss testmetod efter namn (observera att testmetodnamnen är fullständigt kvalificerade tillsammans med det anropsindex som läggs till i slutet) kan du använda en urvalsfråga på följande sätt:

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

Observera den implicita inproc-varning som lagts till på den tredje raden i exemplet ovan. Urvalsfrågan ovan hade samma effekt som urvalsfrågan:/select:"@Name='*OneHDAudio*' och @Resource:Index=1". Det går också att välja en resurs med hjälp av dess namn eller typ (eller ID som visas ovan). Till exempel väljer /select:"@Name='*PCIHDAudioTest*' och @Resource:Name='PCI3'" testmetoderNA PCIHDAudioTest#4 och PCIHDAudioTest#5.

Du kan som en övning för läsaren prova dessa och andra urvalsförfrågningar i kommandotolken.