Aracılığıyla paylaş


Cihaz Desteği

Test otomasyonunuz cihazların veya test kaynaklarının varlığına bağlıysa TestResourceExample örneğine bakın ve TAEF'de sağlanan cihaz desteğinden veya test kaynağı desteğinden nasıl yararlandığınızı izleyin. Devam etmeden önce TAEF kullanarak temel testler yazma ve TAEF'nin temel yürütmesi hakkında bilgi sahibi olduğunuzdan emin olun.

Cihaz desteği için yazma - Kaynaklar dosyası

Te.Common.lib, TAEF'de bir test yazmak için gereken diğer kitaplıklara ek olarak gereklidir.

Cihaz desteği için yazma - Test Kaynağı tanımı

Kullanıcılar kendi Test Kaynağı (cihaz) tanımlarını oluşturmakla sorumludur. Bunu yapmak için ITestResource uygulamanız gerekir. ITestResource, yayımlanan ITestResource.h üst bilgi dosyasında tanımlanır ve aşağıdaki gibi görünü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*/

Örneğimizde MyTestResource sınıfı ITestResource COM Arabirimini uygular. ITestResource.h'de, tanımlanmış "must-have" özelliklerinin listesini de bulabilirsiniz. GetGuid(..) kullanarak test kaynağının GUID değerini ve GetValue(...) kullanarak kaynağın Adını, Kimliğini ve Türünü elde etmek mümkün olmalıdır. TestResource'ta bunlardan herhangi biri eksikse, TAEF bunu geçersiz olarak değerlendirir ve bilgileri korumaz. (Aşağıdaki "Kaynak listesini oluşturma" bölümüne bakın).

Cihaz desteği için yazma - Kaynağa bağımlı meta verileri belirtme

Test modülünün test kaynağına bağımlı test yöntemlerine sahip olduğunu belirtmek için ,'TestResourceDependent' modül düzeyi meta veri özelliğinin "true" olarak ayarlanması gerekir. özelliği, test modülündeki tüm sınıflar ve bu sınıflardaki tüm test yöntemleri tarafından devralınır. Modüldeki test yöntemlerinden herhangi biri test kaynağına bağımlı değilse meta veri değerini açıkça false olarak yeniden ayarlaması gerekir. Test kaynağına bağımlı diğer tüm test yöntemleri, test kaynağının "Kimlik" ve/veya "Tür" değerlerini kullanarak bir seçim sorgusu sağlamalıdır.

Örnek kaynak listemiz için bazı hızlı "Kaynak Seçimi" örnekleri ve bunların her birinin ne ifade ettiğini belirtmek için:

  • "@Id='HD*'": her kaynağı "HD" ile başlayan bir kimlikle eşleştirir
  • "@Type='PCI'": "PCI" Türünün her kaynağıyla eşleşir
  • "@Id='PCI*' VEYA @Id='HD*'": "PCI" ile başlayan veya "HD" ile başlayan her kaynakla eşleşir
  • "@Type='PCI' ve @id='*37'": "PCI" türündeki her kaynağı "37" ile biten bir adla eşleştirir

Örnek kodumuzda şu şekilde görünü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()
        ...
    };

Yukarıdaki örnekte, modülün "TestResourceDependent" olarak işaretlendiğini göreceksiniz. NoTestResourceTest açıkça "TestRssourceDependent" meta verileri "false" olarak ayarlanarak herhangi bir test kaynağına bağımlı değil olarak işaretlenir. Diğer tüm test yöntemleri, yürütmek istedikleri test kaynakları için bir seçim ölçütü belirtir.

Seçim ölçütü dil bilgisi, TAEF için kullanılabilen komut satırı seçim sorgusu dil bilgisi ile çok benzer. Ancak kaynak seçimi söz konusu olduğunda, kaynak kimliğinin ve türlerinin kullanımıyla sınırlıdır. Kaynak kimliği bir "String" olduğundan tek tırnak içine alınması gerekir. Kimlik değerinin belirtiminde "*" veya "?" joker karakterlerini kullanabilirsiniz. Yukarıdaki örneğimizde, OneHDAudioTest'te kaynak seçimi, kimliğin 'HD' ile başladığı herhangi bir kaynakla eşleşme belirtir. Benzer şekilde, HDorPCITest söz konusu olduğunda, kaynak seçimi kimliğin 'HD' ile veya 'PCI' ile başladığı tüm kaynaklarla eşleşecektir. Kaynak seçiminin büyük/küçük harfe duyarsız olduğunu, yani 'pci', 'Pci' ve 'PCI' değerlerinin aynı şekilde ele alınacağını unutmayın.

Kaynak seçimine bağlı olarak TAEF, seçimle eşleşen her test kaynağı için test düzeyi kurulum ve temizleme yöntemleriyle (belirtilmişse) test yöntemini bir kez yeniden çağırır. Aşağıdaki bölümlerde, kaynak listesini belirtme ve TAEF'ye sağlama ve test yönteminin sonraki bölümde kaynakları nasıl alabildiğiyle ilgili ayrıntılar incelenir.

Cihaz desteği için yazma - Kaynak listesini oluşturma

TAEF bir TestResourceDependent test modülüyle karşılaştığında dll dışarı aktarılan BuildResourceList yöntemini arar ve çağırır. Kullanıcıların yeni test kaynakları oluşturabileceği ve bunları BuildResourceList'e parametre olarak verilen arabirime ekleyebileceği yer, BuildResourceList uygulamasıdır. Örneğimizde bu yöntemin uygulanmasına göz atalım:

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 parametresi olarak WEX::TestExecution::ResourceList başvurusunu kabul eder. ResourceList, yayımlanan resourceList.h üst bilgi dosyasında tanımlanır. ResourceList'te Add(...) yöntemini kullanarak, kullanıcılar taef için bulunan veya oluşturulan tüm test kaynaklarını yönetip çalışmak üzere ekleyebilir. Yukarıdaki örnekte bu tür 5 test kaynağı eklenmiştir.

Eklenecek test kaynağı kaynak için "Ad", "Kimlik", "Tür" veya GUID döndüremezse Add yöntemi başarısız olur.

ResourceList, tüm test yöntemleri ve temizleme yöntemleri yürütülene kadar test modülünün ömrü boyunca korunur. BuildResourceList FAILED HRESULT değeri döndürürse, test modülündeki tüm kaynağa bağımlı test yöntemleri yürütülmeden engellenmiş olarak günlüğe kaydedilir. Test dışı tüm kaynaklar ne olursa olsun yürütülür.

BuildResourceList, test modülündeki diğer yöntemlerden önce çağrılır. Kaynak listesi oluşturulduktan sonra (BuildResourceList'te), kaynak listesindeki kullanılabilir kaynakları eşleştirmek için "ResourceSelection" meta verileri kullanılır. Eşleşme bulunursa, tüm kurulum yöntemleri (modül, sınıf, test sırası) ve ardından test yönteminin kendisi çağrılır. Test düzeyi temizleme yöntemi her test çağrısından sonra çağrılır.

Arka planda TAEF, kaynak seçiminin uygulandığı ResourceList'i korur. Örneğin, OneHDAudioTest test yöntemi için"HDAudio-deviceid-1" ve "HDAudio-deviceid-2" kimliklerine sahip test kaynakları 'HD*' ile eşleşir ve bunların her biri için test yöntemi TAEF tarafından yeniden çağrılır (her biri için bir kez). Ayrıca, testin her çağrısıyla ilişkili örtük bir dizin de olacaktır. Bu nedenle, ad alanı niteleyicisi>OneHDAudioTest#0 ve <ad alanı niteleyicisi>OneHDAudioTest#1'i iki çağrı olarak görürsünüz<.

Cihaz desteği için oluşturma - Cihazı test yönteminde alma

Önceki bölümlerde modül, sınıf ve test yöntemi düzeyinde gerekli meta verilerin nasıl ekleneceği incelenmişti. Ayrıca özel test kaynaklarını tanımlamayı ve BuildResourceList uygulamasında ResourceList'e eklemeyi de incelediler. Sonraki bölüm, test yöntemindeki kaynakları almaktır. Örneğimizdeki basit test yöntemlerinden birine göz atalım:

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  }

OneHDAudioTest'te kaynak seçimi, kaynak kimliğinin 'HD' ile başladığı tek seferde bir test kaynağı seçer. ResourceList.h dosyasında tanımlanan Resources statik sınıfı, sayımın yanı sıra testin herhangi bir çağrısı sırasında kullanılabilir gerçek kaynağı almak için API'leri sağlar. Bu durumda, yukarıdaki örnekte 4, 9 ve 13. satırlarda görebileceğiniz gibi Resources::Count() test yönteminin geçerli çağrıları sırasında kullanılabilir test kaynaklarının sayısını verir. Bu test yönteminde 1 olmalıdır. TAEF(Verify.h) içinde kullanılabilen VERIFY makrolarını kullanarak bu değeri doğrulayabilirsiniz. Bildiğiniz gibi, doğrulama çağrılarından herhangi biri özel durum tabanlı TAEF testinde başarısız olursa yürütme bu noktada sonlandırılır ve test yöntemi Başarısız olarak işaretlenir.

Ardından, Resources::Item(...) öğesini kullanarak API ve kaynağın alınacağı dizini geçirme (bu durumda çağrı sırasında yalnızca bir test kaynağı kullanılabilir olacağından dizin her zaman 0 olur), test kaynağını alabilirsiniz. Test yöntemi, alınan test kaynağını test için gerektiğinden daha fazla kullanabilir.

Tüm test yöntemlerinde aynı temel ilkeye uyulur. Daha iyi anlamak için örnekteki diğer test yöntemlerine göz atın.

Test kaynağına bağımlı test modülünü yürütme

Test kaynağına bağımlı testler artık yazılıp oluşturulduktan sonra TAEF kullanarak yürütebilirsiniz. Dikkat edilmesi gereken önemli nokta, TestResourceDependent testlerinin yalnızca inproc olarak yürütülebileceğidir. TAEF, test kaynağına bağımlı test modülünü bulur bulmaz, "/inproc" anahtarı otomatik olarak eklenir, yani sizin bunu açıkça belirtmenize gerek yoktur. Bildiğiniz gibi, "/inproc" anahtarı mevcut olduğunda belirli bir TAEF yürütmesinde yalnızca bir test modülünden testler yürütülebilir. Bu, test modülünüzün kaynağa bağımlı olması durumunda komut satırında birden fazla test modülü belirtemezsiniz.

Test modülümüzdeki tüm testleri yürütmek için şunları çalıştırmanız yeterlidir:

te Examples\Cpp.TestResource.Example.dll

Test yöntemlerini çalıştırmadan tüm test yöntemi çağrılarının ve veri ve meta veri bileşimlerinin listesini almanın kullanışlı bir yolu, komut satırında /listproperties anahtarını kullanmaktır. Çıktıya bir göz atalım.

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

Bir test kaynağı depent test yönteminin her çağrıları sırasında test yöntemi adına eklenen örtük dizine dikkat edin. ResourceSelection özelliği, test yöntemine sunulma sırasına göre kullanılabilir olacak tüm kaynakların listesiyle birlikte gösterilir. Örneğin, HDAudioHDAudioPCITest'in (HDAudioHDAudioPCITest#2) üçüncü çağrısında HDAudio-deviceid-1, Resources::Item(...) dizininde 0 dizininde bulunan kaynak olacaktır.

TAEF'de kullanılabilen komut satırı seçim sorgu dilini kullanarak hangi test çağrısıyla ilgilendiğiniz konusunda daha ayrıntılı olabilirsiniz. Örneğin, 'PCI-deviceid-3' test kaynaklarının kullanılabildiği test yöntemlerinin tüm çağrılarını seçmek için seçim ölçütlerini kullanabilirsiniz:

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

Benzer şekilde, ada göre, belirli bir test yöntemini seçmek için (not: test yöntemi adları, sonuna eklenen çağırma diziniyle birlikte eksiksiz bir şekilde nitelenir), aşağıdaki gibi bir seçim sorgusu kullanabilirsiniz:

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

Yukarıdaki örneğin üçüncü satırındaki örtük inproc ekleme uyarısına dikkat edin. Yukarıdaki seçim sorgusu, seçim sorgusuyla aynı etkiye sahipti:/select:"@Name='*OneHDAudio*' And @Resource:Index=1". Ayrıca, Adı veya Türü (veya yukarıda gösterildiği gibi Kimlik) kullanarak bir kaynak seçmek de mümkündür. Örneğin, /select:"@Name='*PCIHDAudioTest*' ve @Resource:Name='PCI3'" test yöntemlerini seçer PCIHDAudioTest#4 ve PCIHDAudioTest#5.

Komut isteminde bunları ve diğer seçim sorgularını denemek okuyucu için bir alıştırma olarak bırakılır.