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()
{
}
}
Pernyataan dan pengecualian terkait
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
- Dokumentasi referensi Microsoft.VisualStudio.TestTools.UnitTesting