Bagikan melalui


Sumber Data WMI

Pastikan Anda terbiasa dengan eksekusi dasar TAEF dan tahu cara Menulis Pengujian menggunakannya, sebelum melanjutkan 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 itu membantu tes saya?

Dengan menggunakan dukungan kueri WMI yang tersedia sebagai WMI DataSource di TAEF, Anda dapat menambahkan prasyarat ke pengujian Anda serta mendapatkan informasi tentang sumber daya pada mesin pengujian sebelum menjalankan pengujian Anda. Berikut adalah beberapa contoh jenis kueri yang bisa 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 mesin uji tidak bergabung dengan domain ATAU
  • Jalankan pengujian hanya jika mesin uji bergabung dengan domain dan ambil nama domain.

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

Satu-satunya metadata khusus yang Anda butuhkan untuk membuat pengujian Anda uji WMI DataSource 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 beberapa contohnya:

DESKRIPSI SELECT, 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 Capabilities and CapabilityDescriptions untuk setiap printer.

SELECT Name, User, Location FROM 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 mana yang menjalankan prosesnya.

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 pengambilan 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 berpindah ke pengujian berikutnya.

Memeriksa atau memverifikasi kueri Anda sebelum menulis pengujian 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 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 mendefinisikan properti TestContext privat dan menyediakan getter publik dan setter di atasnya untuk TAEF untuk 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 halnya pengujian berbasis data asli, Anda akan menggunakan TestData untuk mendapatkan nilai properti. Misalnya, mari kita pertimbangkan pengujian untuk mendapatkan properti printer default. File header menulis pengujian ini seperti:

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, dalam file cpp terlihat sebagai berikut:

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    }

Akuntansi untuk 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 Menurut Anda properti yang Anda cari bisa "null" dalam beberapa skenario, maka periksa sebelum 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 melemparkan nilai yang dihasilkan ke jenis yang Anda harapkan. Perhatikan:

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 null dalam beberapa skenario (ketika kueri mengembalikan drive yang dapat dilepas seperti drive floppy). Anda ingin memastikan bahwa pengujian berperilaku tepat dalam kasus seperti itu. Menuju akhir ini, ambil nilai properti sebagai objek dan periksa apakah itu berjenis "DBNull". Jika ya, itu berarti bahwa nilai properti yang dikembalikan 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 tulislah tes untuk mempertanyakan 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    }