Bagikan melalui


Sumber Data WMI

Pastikan Anda terbiasa dengan eksekusi dasar TAEF dan tahu cara membuat pengujian menggunakan perangkat ini, sebelum melanjutkan dengan bagian ini.

Latar Belakang

"WMI" adalah singkatan dari "Instrumentasi Manajemen Windows". Menggunakan Common Information Model (CIM), yang merupakan standar industri untuk mewakili sistem. Instrumentasi Manajemen Windows menyediakan cara terpadu untuk mengakses informasi manajemen sistem.

Bagaimana hal itu membantu tes saya?

Menggunakan dukungan kueri WMI yang tersedia sebagai Sumber Data WMI di TAEF, Anda dapat menambahkan prasyarat ke pengujian Anda serta mendapatkan informasi tentang sumber daya pada mesin uji sebelum menjalankan pengujian Anda. Berikut adalah beberapa contoh jenis kueri yang dapat Anda buat menggunakan WMI:

  • Periksa apakah mesin yang dijalankan pengujian adalah laptop dan jalankan pengujian hanya jika itu adalah laptop.
  • Periksa apakah paket layanan telah diinstal pada mesin uji dan jalankan pengujian hanya jika sudah.
  • Ambil semua drive yang dapat dilepas dan hard disk drive lokal pada mesin uji dan jalankan pengujian untuk setiap drive yang cocok dengan kueri.
  • Jalankan pengujian hanya jika komputer uji tidak bergabung dengan domain atau
  • Jalankan pengujian hanya jika mesin uji terhubung ke domain dan ambil nama domain.

Itu mudah-mudahan akan memberi Anda beberapa ide tentang di mana dan bagaimana Anda dapat memanfaatkan Sumber Data WMI untuk pengujian Anda. Mari kita lihat bagaimana cara menambahkan dukungan untuk kueri WMI ini saat menyusun pengujian TAEF.

Satu-satunya metadata khusus yang Anda perlukan untuk membuat pengujian WMI DataSource Anda adalah "DataSource". Sintaks DataSource harus terlihat sebagai berikut:

[DataSource("WMI:<WQL query>")]

Atau dalam kode asli:

TEST_METHOD_PROPERTY(L"DataSource", L"WMI:<WQL query>")]

Anda harus memperhatikan bahwa nilai DataSource dimulai dengan "WMI:" yang memberi tahu TAEF bahwa ini memang sumber data untuk pengujian yang bergantung pada hasil kueri WMI dan juga membedakannya dari pengujian berbasis data. Ini adalah kesempatan yang baik untuk menyebutkan bahwa saat ini TAEF tidak mendukung pengujian untuk menjadi keduanya - pengujian berbasis data serta pengujian yang bergantung pada hasil kueri WMI.

Pertanyaan berikutnya secara alami adalah bagaimana menulis kueri WQL untuk apa yang Anda cari? Sintaks kueri WQL sangat mirip dengan kueri SQL yang disederhanakan. Ada beberapa contoh kueri yang sangat baik yang disediakan dalam Tugas WMI untuk Skrip dan Aplikasi. Berikut adalah beberapa contoh:

SELECT Description, DesktopInteract, ProcessId FROM Win32_Service WHERE Name='Themes'
Jalankan pengujian pada layanan "Tema" setelah mengetahui properti Deskripsi, DesktopInteract, dan ProcessId yang ingin Anda gunakan dalam pengujian Anda.

Kemampuan SELECT, CapabilityDescriptions FROM Win32_Printe
Jalankan pengujian untuk setiap pencetak yang tersambung ke komputer ini. Izinkan pengujian mengakses Kemampuan dan DeskripsiKemampuan untuk setiap printer.

PILIH Nama, Pengguna, Lokasi DARI Win32_StartupCommand
Jalankan pengujian untuk setiap proses yang dijalankan di startup Windows. Untuk setiap proses, beri tahu pengujian apa Nama prosesnya, di mana lokasinya (Lokasi), dan pengguna apa proses berjalan.

Anda dapat menemukan lebih banyak contoh dalam dokumentasi yang disebutkan di atas serta dalam file .cs dan file header dalam contoh yang telah Anda buka. Sintaks umum yang terlalu disederhanakan adalah sebagai berikut:

SELECT <comma separated properties> FROM <WMI Class name> [WHERE <add condition on some properties>]

Dalam contoh yang baru saja Anda lihat, Win32_Service, Win32_Printer, dan Win32_StartupCommand adalah semua Kelas WMI. Anda dapat mencari kelas WMI di kelas WMI.

TAEF tidak mendukung pemanggilan Properti Sistem.

Di balik layar TAEF akan menjalankan kueri untuk Anda dan mengonfirmasi hasilnya. Jika setidaknya satu objek dikembalikan sebagai hasil dari kueri, pengujian akan dijalankan untuk setiap objek yang dikembalikan. Jika kueri WQL tidak mengembalikan objek apa pun, pengujian akan dicatat sebagai Diblokir dengan informasi ini dan eksekusi melanjutkan ke pengujian berikutnya.

Memeriksa atau memverifikasi kueri Anda sebelum menulis pengujian Anda tampaknya merupakan ide yang bagus, dan merupakan proses yang sangat sederhana:

  • Baik dari dialog jalankan atau perintah panggil "wbemtest.exe"
  • Klik tombol "Sambungkan" di sudut kanan atas.
  • Pastikan namespace Anda adalah "root\cimv2" sebelum mengklik "Sambungkan" lagi di sudut kanan atas.
  • Di bagian "IWbemServices", klik "Kueri"
  • Masukkan kueri Anda dalam kotak edit yang muncul dan klik "Terapkan"

CATATAN: "IWbemService" memiliki beberapa opsi lain yang dapat membantu Anda dengan kueri Anda. Misalnya, menggunakan "Kelas Enum" dan mengubah tombol radio menjadi "rekursif" akan membantu Anda melihat semua kelas WMI pada sistem.

Mengambil properti yang dikueri menggunakan kueri WMI

Sekarang Anda memiliki gambaran tentang cara membuat kueri WMI untuk metode pengujian dan cara menerapkannya sebagai metadata saat menulis pengujian. Anda juga tahu cara mengonfirmasi bahwa kueri valid menggunakan wbemtest.exe. Sekarang mari kita lihat cara mengambil nilai properti yang sedang Anda cari.

Dasar-dasar pengambilan informasi ini sangat mirip dengan mengambil nilai untuk pengujian berbasis data Anda. Misalnya, dalam kode terkelola, ini akan terlihat sebagai berikut:

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}

Baris 24-30 dalam contoh di atas adalah apa yang diperlukan untuk pengujian berbasis data terkelola. Anda menentukan properti TestContext privat dan menyediakan getter dan setter publik agar TAEF dapat mengatur nilai yang tepat. Dengan menggunakan properti TestContext privat, Anda dapat mengambil nilai saat ini untuk salah satu properti objek hasil kueri WMI yang Anda ambil dari TAEF.

Kode asli untuk mengambil properti WMI sangat mirip. Seperti pengujian berbasis data asli, Anda akan menggunakan TestData untuk mendapatkan nilai properti. Misalnya, mari kita pertimbangkan pengujian untuk mendapatkan properti printer default. File header ini menyusun pengujian dengan cara berikut:

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()

Untuk ini, kode pengambilan kami terlihat seperti berikut dalam file .cpp:

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    }

Mengatasi kemungkinan nilai properti NULL

Bagian yang perlu diingat adalah bahwa kueri WMI mungkin tidak selalu mengembalikan properti non-null. Mungkin ada kalanya nilai properti WMI yang dikembalikan adalah "null". Jika Anda merasa bahwa properti yang Anda cari mungkin "null" dalam beberapa skenario, periksalah sebelum Anda memverifikasi atau mencoba menggunakannya.

Dalam kode pengujian terkelola misalnya, TestContext akan menyimpan nilai null sebagai objek jenis DBNull. Anda harus memeriksa apakah objek berjenis DBNull sebelum mencoba mengonversi nilai yang dihasilkan ke jenis yang Anda harapkan. Mari kita lihat:

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}

Misalnya, dalam pengujian di atas, "Terkompresi", "MaximumComponentLength", dan "Ketersediaan" dapat menjadi null dalam beberapa skenario (ketika kueri mengembalikan drive yang dapat dilepas seperti drive floppy). Anda ingin memastikan bahwa pengujian berperilaku dengan tepat dalam kasus seperti itu. Untuk tujuan ini, ambil nilai dari properti sebagai objek dan periksa apakah itu berjenis "DBNull". Jika demikian, ini berarti bahwa nilai properti yang dikembalikan adalah null. Jika tidak, nilai yang dikembalikan tidak null dan karenanya valid - jadi transmisikan ke jenis yang sesuai dan gunakan untuk pengujian.

Hal yang sama berlaku dengan API pengambilan asli juga - nilai properti yang dikembalikan bisa null. Ini berarti Bahwa Anda perlu memeriksa apakah TestData berhasil mengambil nilai tanpa menggunakan panggilan verifikasi (karena tidak dapat mengambil bisa karena nilainya null). Misalnya, Anda mungkin memiliki metode pengujian yang bergantung pada kueri WMI:

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()

Anda mungkin memiliki "Ketersediaan" dan "MaximumComponentLength" yang dikembalikan sebagai nilai NULL. Jadi tulis tes untuk memperhitungkan hal ini seperti ini:

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    }