Bagikan melalui


Menggunakan kerangka kerja MSTest dalam pengujian unit

Kerangka kerja MSTest mendukung pengujian unit di Visual Studio. Gunakan kelas dan anggota di Microsoft.VisualStudio.TestTools.UnitTesting namespace layanan saat Anda mengodekan pengujian unit. Anda juga dapat menggunakannya saat menyempurnakan pengujian unit yang dihasilkan dari kode.

Anggota kerangka kerja

Untuk membantu memberikan gambaran umum yang lebih jelas tentang kerangka kerja pengujian unit, bagian ini mengatur anggota namespace layanan Microsoft.VisualStudio.TestTools.UnitTesting ke dalam grup fungsi terkait.

Catatan

Elemen atribut, yang namanya diakhir dengan "Atribut", dapat digunakan baik dengan atau tanpa "Atribut" di akhir dan untuk konstruktor tanpa parameter dengan atau tanpa tanda kurung. Misalnya, contoh kode berikut berfungsi secara identik:

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

Atribut yang digunakan untuk mengidentifikasi kelas dan metode pengujian

Setiap kelas pengujian harus memiliki atribut TestClass, dan setiap metode pengujian harus memiliki atribut TestMethod. Untuk informasi selengkapnya, lihat Anatomi pengujian unit.

TestClassAttribute

Atribut TestClass menandai kelas yang berisi pengujian dan, secara opsional, menginisialisasi, atau membersihkan metode.

Atribut ini dapat diperluas untuk memperbarui atau memperluas perilaku.

Contoh:

[TestClass]
public class MyTestClass
{    
}

TestMethodAttribute

Atribut TestMethod digunakan di dalam untuk menentukan metode pengujian aktual TestClass yang akan dijalankan.

Metode harus berupa metode instans yang didefinisikan sebagai public void atau public Task (opsional async) dan tanpa parameter.

Contoh

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}
[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async Task TestMethod()
    {
    }
}

Atribut yang digunakan untuk pengujian berbasis data

Gunakan elemen berikut untuk menyiapkan pengujian unit berbasis data. Untuk informasi selengkapnya, lihat Membuat pengujian unit berbasis data dan Menggunakan file konfigurasi untuk menentukan sumber data.

DataRow

memungkinkan DataRowAttribute Anda untuk memberikan data sebaris yang digunakan saat memanggil metode pengujian. Ini dapat muncul satu atau beberapa kali pada metode pengujian. Ini harus dikombinasikan dengan TestMethodAttribute atau DataTestMethodAttribute.

Jumlah dan jenis argumen harus sama persis dengan tanda tangan metode pengujian.

Contoh panggilan yang valid:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f) {}
    
    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines) {}

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o) {}

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
    public void TestMethod4(string[] input, string[] expectedOutput) {}
}

Perhatikan bahwa Anda juga dapat menggunakan fitur untuk params mengambil beberapa input .DataRow

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    public void TestMethod(params int[] values) {}
}

Contoh kombinasi yang tidak valid:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2)] // Not valid, we are passing 2 inline data but signature expects 1
    public void TestMethod1(int i) {}

    [TestMethod]
    [DataRow(1)] // Not valid, we are passing 1 inline data but signature expects 2
    public void TestMethod2(int i, int j) {}

    [TestMethod]
    [DataRow(1)] // Not valid, count matches but types do not match
    public void TestMethod3(string s) {}
}

Catatan

Dimulai dengan MSTest v3, ketika Anda ingin melewati tepat 2 array, Anda tidak perlu lagi membungkus array kedua dalam array objek. Sebelum: [DataRow(untai baru[] { "a" }, objek baru[] { string baru[] { "b" } })] Dalam v3 dan seterusnya: [DataRow(string baru[] { "a" }, string baru[] { "b" })]

Anda dapat mengubah nama tampilan yang digunakan di Visual Studio dan pencatat untuk setiap instans DataRowAttribute dengan mengatur DisplayName properti .

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, DisplayName= "Functional Case FC100.1")]
    public void TestMethod(int i, int j) {}
}

Anda juga dapat membuat atribut baris data khusus Anda sendiri dengan mewarisi DataRowAttribute.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}

[TestClass]
public class TestClass
{
    [TestMethod]
    [MyCustomDataRow(1)]
    public void TestMethod(int i) {}
}

Atribut yang digunakan untuk menyediakan inisialisasi dan pembersihan

Metode yang dihiasi dengan salah satu atribut berikut dipanggil saat Anda menentukan. Untuk informasi selengkapnya, lihat Anatomi pengujian unit.

Rakitan

AssemblyInitialize dipanggil tepat setelah assembly Anda dimuat dan AssemblyCleanup dipanggil tepat sebelum assembly Anda dibongkar.

Metode yang ditandai dengan atribut ini harus didefinisikan sebagai static void atau static Task, dalam TestClass, dan hanya muncul sekali. Bagian inisialisasi memerlukan satu argumen jenis TestContext dan pembersihan tanpa argumen.

[TestClass]
public class MyTestClass
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [AssemblyInitialize]
    public static async Task AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static async Task AssemblyCleanup()
    {
    }
}

Kelas

ClassInitialize dipanggil tepat sebelum kelas Anda dimuat (tetapi setelah konstruktor statis) dan ClassCleanup dipanggil tepat setelah kelas Anda dibongkar.

Dimungkinkan untuk mengontrol perilaku warisan: hanya untuk kelas saat ini yang menggunakan InheritanceBehavior.None atau untuk semua kelas turunan menggunakan InheritanceBehavior.BeforeEachDerivedClass.

Dimungkinkan juga untuk mengonfigurasi apakah pembersihan kelas harus dijalankan di akhir kelas atau di akhir perakitan (Tidak lagi didukung mulai dari MSTest v4 karena EndOfClass adalah perilaku pembersihan default dan hanya kelas).

Metode yang ditandai dengan atribut ini harus didefinisikan sebagai static void atau static Task, dalam TestClass, dan hanya muncul sekali. Bagian inisialisasi memerlukan satu argumen jenis TestContext dan pembersihan tanpa argumen.

[TestClass]
public class MyTestClass
{
    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static void ClassCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [ClassInitialize]
    public static async Task ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static async Task ClassCleanup()
    {
    }
}

Uji

TestInitialize dipanggil tepat sebelum pengujian Anda dimulai dan TestCleanup dipanggil tepat setelah pengujian Anda selesai.

TestInitialize mirip dengan konstruktor kelas tetapi biasanya lebih cocok untuk inisialisasi panjang atau asinkron. TestInitialize selalu dipanggil setelah konstruktor dan dipanggil untuk setiap pengujian (termasuk setiap baris data pengujian berbasis data).

TestCleanup mirip dengan kelas Dispose (atau DisposeAsync) tetapi biasanya lebih cocok untuk pembersihan panjang atau asinkron. TestCleanup selalu dipanggil tepat sebelum dan dipanggil DisposeAsync/Dispose untuk setiap pengujian (termasuk setiap baris data pengujian berbasis data).

Metode yang ditandai dengan atribut ini harus didefinisikan sebagai void atau Task, dalam TestClass, tanpa parameter, dan muncul satu atau beberapa kali.

[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
    }

    [TestCleanup]
    public void TestCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [TestInitialize]
    public async Task TestInitialize()
    {
    }

    [TestCleanup]
    public async Task TestCleanup()
    {
    }
}

Pengujian unit dapat memverifikasi perilaku aplikasi tertentu dengan menggunakan berbagai jenis pernyataan, pengecualian, dan atribut. Untuk informasi selengkapnya, lihat Menggunakan kelas pernyataan.

Kelas TestContext

Atribut berikut dan nilai yang ditetapkan untuknya muncul di jendela Properti Visual Studio untuk metode pengujian tertentu. Atribut ini tidak dimaksudkan untuk diakses melalui kode pengujian unit. Sebaliknya, mereka memengaruhi cara pengujian unit yang digunakan atau dijalankan, oleh Anda baik melalui IDE Visual Studio, atau mesin pengujian Visual Studio. Misalnya, beberapa atribut ini muncul sebagai kolom di jendela Pengelola Pengujian dan jendela Hasil Pengujian, yang berarti Anda dapat menggunakannya untuk mengelompokkan dan mengurutkan pengujian dan hasil pengujian. Salah satu atribut tersebut adalah TestPropertyAttribute, yang Anda gunakan untuk menambahkan metadata arbitrer ke pengujian unit. Misalnya, Anda dapat menggunakannya untuk menyimpan nama "uji lulus" yang dicakup pengujian ini, dengan menandai pengujian unit dengan [TestProperty("TestPass", "Accessibility")]. Atau, Anda dapat menggunakannya untuk menyimpan indikator jenis pengujian Itu dengan [TestProperty("TestKind", "Localization")]. Properti yang Anda buat dengan menggunakan atribut ini, dan properti yang nilainya Anda tetapkan, keduanya ditampilkan di jendela Properti Visual Studio di bawah judul Pengujian khusus.

DeploymentItemAttribute

Kerangka kerja MSTest V2 yang diperkenalkan DeploymentItemAttribute untuk menyalin file atau folder yang ditentukan sebagai item penyebaran ke direktori penyebaran (tanpa menambahkan jalur output kustom, file yang disalin akan berada di folder TestResults di dalam folder proyek). Direktori penyebaran adalah tempat semua item penyebaran ada bersama dengan DLL proyek pengujian.

Ini dapat digunakan baik pada kelas pengujian (kelas yang ditandai dengan TestClass atribut) atau pada metode pengujian (metode yang ditandai dengan TestMethod atribut).

Pengguna dapat memiliki beberapa instans atribut untuk menentukan lebih dari satu item.

Dan di sini Anda dapat melihat konstruktornya.

Contoh

[TestClass] 
[DeploymentItem(@"C:\classLevelDepItem.xml")]   // Copy file using some absolute path
public class UnitTest1
{
    [TestMethod]
    [DeploymentItem(@"..\..\methodLevelDepItem1.xml")]   // Copy file using a relative path from the dll output location
    [DeploymentItem(@"C:\DataFiles\methodLevelDepItem2.xml", "SampleDataFiles")]   // File will be added under a SampleDataFiles in the deployment directory
    public void TestMethod1()
    {
        string textFromFile = File.ReadAllText("classLevelDepItem.xml");
    }
}

Menguji kelas konfigurasi

Atribut yang digunakan untuk menghasilkan laporan

Atribut di bagian ini menghubungkan metode pengujian yang mereka hiasi ke entitas dalam hierarki Team Foundation Server proyek proyek proyek tim.

Kelas yang digunakan dengan aksesor privat

Anda dapat membuat pengujian unit untuk metode privat. Generasi ini membuat kelas aksesor privat, yang membuat instans objek dari kelas PrivateObject. Kelas PrivateObject adalah kelas pembungkus yang menggunakan refleksi sebagai bagian dari proses aksesor privat. Kelas PrivateType serupa, tetapi digunakan untuk memanggil metode statik privat alih-alih memanggil metode instans privat.

Baca juga