Dukungan Perangkat
Jika otomatisasi pengujian Anda bergantung pada keberadaan perangkat atau sumber daya pengujian, lihat contoh, TestResourceExample, dan ikuti cara memanfaatkan dukungan perangkat atau dukungan sumber daya pengujian yang tersedia di TAEF. Pastikan Anda terbiasa dengan cara menulis pengujian dasar menggunakan TAEF dan eksekusi dasar TAEF sebelum melanjutkan.
Penulisan untuk dukungan perangkat - File sumber
Te.Common.lib diperlukan selain pustaka lain yang diperlukan penulis pengujian di TAEF.
Penulisan untuk dukungan perangkat - Uji Definisi sumber daya
Pengguna bertanggung jawab untuk membuat definisi Sumber Daya Pengujian (perangkat) mereka sendiri. Untuk melakukan ini, Anda perlu mengimplementasikan ITestResource. ITestResource didefinisikan dalam file header yang diterbitkan ITestResource.h dan terlihat sebagai berikut:
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*/
Dalam contoh kami, kelas MyTestResource mengimplementasikan Antarmuka COM ITestResource. Di ITestResource.h, Anda juga akan menemukan daftar properti "harus dimiliki" yang ditentukan. Dimungkinkan untuk mendapatkan GUID untuk sumber daya pengujian menggunakan GetGuid(..) dan Nama, Id, dan Jenis sumber daya menggunakan GetValue(...). Jika salah satu dari ini hilang dalam TestResource, TAEF akan menganggapnya tidak valid dan tidak mempertahankan informasinya. (Lihat bagian "Membangun daftar sumber daya" yang mengikuti).
Penulisan untuk dukungan perangkat - Menentukan metadata dependen sumber daya
Untuk menentukan bahwa modul pengujian memiliki metode pengujian dependen sumber daya pengujian, properti metadata tingkat modul 'TestResourceDependent" harus diatur ke "true". Properti akan diwariskan oleh semua kelas dalam modul pengujian dan oleh semua metode pengujian di kelas-kelas ini. Jika salah satu metode pengujian dalam modul tidak menguji dependen sumber daya, maka harus secara eksplisit mengatur ulang nilai metadata ke false. Semua metode pengujian lain yang bergantung pada sumber daya pengujian harus menyediakan kueri pemilihan menggunakan "Id" dan/atau "Jenis" sumber daya pengujian.
Berikut adalah beberapa sampel cepat "ResourceSelection" untuk daftar sumber daya contoh kami dan apa yang masing-masing menyiratkan:
- "@Id='HD*'": cocok dengan setiap sumber daya dengan Id yang dimulai dengan "HD"
- "@Type='PCI'": cocok dengan setiap sumber daya Jenis "PCI"
- "@Id='PCI*' OR @Id='HD*'": cocok dengan setiap sumber daya yang dimulai dengan "PCI" atau dimulai dengan "HD"
- "@Type='PCI' dan @id='*37'": cocok dengan setiap sumber daya salah satu jenis "PCI" dengan nama yang berakhiran "37"
Dalam contoh kode kami, ini terlihat sebagai berikut:
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()
...
};
Dalam contoh di atas, Anda akan melihat bahwa modul ditandai sebagai "TestResourceDependent". NoTestResourceTest secara eksplisit ditandai sebagai tidak bergantung pada sumber daya pengujian apa pun dengan mengatur metadata "TestRssourceDependent" ke "false". Semua metode pengujian lainnya menentukan kriteria pilihan untuk sumber daya pengujian yang mereka minati untuk dieksekusi.
Tata bahasa Kriteria pemilihan sangat mirip dengan tata bahasa kueri pemilihan perintah yang tersedia untuk TAEF. Namun, dalam kasus pemilihan sumber daya, itu dibatasi untuk penggunaan Id dan jenis sumber daya. Karena ID sumber daya adalah String, itu perlu diapit dalam tanda kutip tunggal. Anda dapat menggunakan karakter kartubebas "*" atau "?" dalam spesifikasi nilai Id. Dalam contoh kami di atas, di OneHDAudioTest, pilihan sumber daya menentukan kecocokan dengan sumber daya apa pun di mana Id dimulai dengan 'HD'. Demikian pula, dalam kasus HDorPCITest, pemilihan sumber daya akan cocok dengan sumber daya apa pun di mana Id dimulai dengan 'HD' atau dimulai dengan 'PCI'. Penting untuk dicatat bahwa pemilihan sumber daya tidak peka huruf besar/kecil - yaitu, 'pci', 'Pci' dan 'PCI' semuanya akan diperlakukan sama.
Berdasarkan pemilihan sumber daya, TAEF akan memanggil kembali metode pengujian bersama dengan metode penyiapan tingkat pengujian dan pembersihan (jika ditentukan) sekali untuk setiap sumber daya pengujian yang cocok dengan pilihan. Bagian berikut akan memeriksa detail tentang cara menentukan daftar sumber daya dan menyediakannya ke TAEF dan bagaimana metode pengujian dapat mengambil sumber daya di bagian berikutnya.
Penulisan untuk dukungan perangkat - Membangun daftar sumber daya
Segera setelah TAEF menemukan modul pengujian TestResourceDependent, taEF akan mencari dan memanggil metode yang diekspor dll BuildResourceList. Hal ini dalam implementasi BuildResourceList di mana pengguna dapat membuat sumber daya pengujian baru dan menambahkannya ke antarmuka yang diteruskan sebagai parameter ke BuildResourceList. Mari kita lihat implementasi metode ini dalam contoh kita:
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 menerima referensi ke WEX::TestExecution::ResourceList sebagai parameternya. ResourceList didefinisikan dalam file header yang diterbitkan ResourceList.h. Dengan menggunakan metode Add(...) pada ResourceList, pengguna dapat menambahkan semua sumber daya pengujian yang ditemukan atau dibuat agar TAEF dapat dikelola dan dikerjakan. Contoh di atas menambahkan 5 sumber daya pengujian tersebut.
Metode Tambahkan akan gagal jika sumber daya pengujian yang akan ditambahkan gagal mengembalikan "Nama", "Id", "Jenis" atau GUID untuk sumber daya.
ResourceList akan dipertahankan selama masa pakai modul pengujian - yaitu, sampai semua metode pengujian dan metode pembersihan dilakukan eksekusi. Jika BuildResourceList mengembalikan nilai HRESULT YANG GAGAL, semua metode pengujian dependen sumber daya dalam modul pengujian dicatat sebagai diblokir tanpa dieksekusi. Semua sumber daya non-pengujian akan dieksekusi terlepas dari itu.
BuildResourceList dipanggil sebelum metode lain dalam modul pengujian. Setelah daftar sumber daya dibuat (di BuildResourceList), metadata "ResourceSelection" digunakan untuk mencocokkan sumber daya yang tersedia dalam daftar sumber daya. Jika kecocokan ditemukan, semua metode penyiapan (modul, kelas, urutan pengujian) dipanggil diikuti dengan metode pengujian itu sendiri. Metode pembersihan tingkat pengujian dipanggil setelah setiap pemanggilan pengujian.
Di balik layar, TAEF mempertahankan ResourceList tempat pemilihan sumber daya diterapkan. Misalnya, untuk metode pengujian OneHDAudioTest, sumber daya pengujian dengan Id "HDAudio-deviceid-1" dan "HDAudio-deviceid-2" akan cocok dengan 'HD*' dan untuk masing-masing, metode pengujian akan dipanggil kembali oleh TAEF (sekali untuk masing-masing). Juga akan ada indeks implisit yang terkait dengan setiap pemanggilan pengujian. Jadi Anda akan melihat <kualifikasi>namespace OneHDAudioTest#0 dan <kualifikasi>namespace OneHDAudioTest#1 sebagai dua pemanggilan.
Penulisan untuk dukungan perangkat - Mengambil perangkat dalam metode pengujian
Bagian sebelumnya melihat cara menambahkan metadata yang diperlukan pada tingkat modul, kelas, dan metode pengujian. Mereka juga melihat cara menentukan sumber daya pengujian kustom dan cara menambahkannya ke ResourceList dalam implementasi BuildResourceList. Bagian berikutnya yang mengikuti adalah mengambil sumber daya dalam metode pengujian. Mari kita lihat salah satu metode pengujian sederhana dalam contoh kita:
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 }
Di OneHDAudioTest, pemilihan sumber daya memilih satu sumber daya pengujian pada satu waktu di mana Id sumber daya dimulai dengan 'HD'. Sumber daya kelas statis yang ditentukan dalam ResourceList.h menyediakan API untuk mengambil hitungan serta sumber daya aktual yang tersedia selama pemanggilan pengujian tertentu. Dalam hal ini, seperti yang Anda lihat di baris 4, 9, dan 13 dalam contoh di atas, Resources::Count() memberikan jumlah sumber daya pengujian yang tersedia selama pemanggilan metode pengujian saat ini. Dalam metode pengujian ini, ini harus 1. Anda dapat memverifikasi nilai ini dengan menggunakan makro VERIFY yang tersedia di TAEF (Verify.h). Seperti yang Anda ketahui, jika salah satu panggilan verifikasi gagal dalam pengujian TAEF berbasis pengecualian, eksekusi akan berakhir pada saat itu dan metode pengujian akan ditandai sebagai Gagal.
Selanjutnya, menggunakan Sumber Daya::Item(...) API dan meneruskan indeks untuk mengambil sumber daya (dalam hal ini karena hanya satu sumber daya pengujian yang akan tersedia selama pemanggilan, indeks akan selalu 0), Anda dapat mengambil sumber daya pengujian. Metode pengujian selanjutnya dapat menggunakan sumber daya pengujian yang diambil sesuai kebutuhan untuk pengujiannya.
Prinsip dasar yang sama diikuti dalam semua metode pengujian. Lihat metode pengujian lain dalam contoh untuk mendapatkan pemahaman yang lebih baik.
Menjalankan modul pengujian dependen sumber daya pengujian
Dengan pengujian dependen sumber daya pengujian yang sekarang ditulis dan dibuat, Anda sekarang dapat menjalankannya menggunakan TAEF. Poin kunci yang perlu diperhatikan adalah bahwa pengujian TestResourceDependent hanya dapat dijalankan secara inproc. Ini berarti bahwa bahkan jika Anda tidak secara eksplisit menentukan sakelar "/inproc" , sakelar akan ditambahkan segera setelah TAEF menemukan modul pengujian dependen sumber daya pengujian. Seperti yang Anda ketahui, pengujian hanya dari satu modul pengujian dapat dijalankan dalam eksekusi TAEF tertentu ketika sakelar "/inproc" ada. Ini berarti Anda tidak dapat menentukan lebih dari satu modul pengujian di commandline jika modul pengujian Anda bergantung pada sumber daya.
Untuk benar-benar menjalankan semua pengujian dalam modul pengujian kami, Anda cukup menjalankan:
te Examples\Cpp.TestResource.Example.dll
Cara yang berguna untuk hanya mendapatkan daftar semua pemanggilan metode pengujian dan kombinasi data dan metadata tanpa benar-benar menjalankan metode pengujian, adalah dengan menggunakan sakelar /listproperties di baris perintah. Mari kita lihat outputnya.
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
Perhatikan indeks implisit yang ditambahkan ke nama metode pengujian selama setiap pemanggilan metode pengujian depent sumber daya pengujian. Properti ResourceSelection ditampilkan diikuti dengan daftar semua sumber daya yang akan tersedia untuk metode pengujian dalam urutan yang akan tersedia. Misalnya, dalam kasus pemanggilan ketiga HDAudioHDAudioPCITest (HDAudioHDAudioPCITest#2), HDAudio-deviceid-1 akan menjadi sumber daya yang tersedia di indeks 0 di Resources::Item(...).
Anda dapat lebih spesifik tentang pemanggilan pengujian mana yang Anda minati dengan menggunakan bahasa kueri pemilihan perintah yang tersedia di TAEF. Misalnya untuk memilih semua pemanggilan metode pengujian di mana sumber daya pengujian 'PCI-deviceid-3' tersedia, Anda dapat menggunakan kriteria pemilihan:
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
Demikian pula, untuk memilih metode pengujian tertentu berdasarkan nama (nama metode pengujian catatan sepenuhnya memenuhi syarat bersama dengan indeks pemanggilan yang ditambahkan pada akhirnya), Anda dapat menggunakan kueri pemilihan sebagai berikut:
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
Perhatikan peringatan tambahan inproc implisit di baris ketiga dari contoh di atas. Kueri pilihan di atas memiliki efek yang sama dengan kueri pilihan:/select:"@Name='*OneHDAudio*' Dan @Resource:Index=1". Dimungkinkan juga untuk memilih sumber daya menggunakan Nama atau Jenisnya (atau Id seperti yang ditunjukkan di atas). Misalnya, /select:"@Name='*PCIHDAudioTest*' dan @Resource:Name='PCI3'" akan memilih metode pengujian PCIHDAudioTest#4 dan PCIHDAudioTest#5.
Mencoba kueri pilihan ini dan lainnya di prompt perintah dibiarkan sebagai latihan untuk pembaca.