Membuat pengujian unit berbasis data
Anda dapat menggunakan kerangka kerja pengujian unit Microsoft (MSTest) untuk kode terkelola guna menyiapkan metode pengujian unit untuk mengambil nilai dari sumber data. Metode ini dijalankan secara berturut-turut untuk setiap baris di sumber data, yang memudahkan pengujian berbagai input dengan menggunakan satu metode.
Pengujian unit berbasis data dapat menggunakan salah satu jenis berikut:
- data sebaris menggunakan
DataRow
atribut - data anggota menggunakan
DynamicData
atribut - dari beberapa penyedia sumber terkenal menggunakan
DataSource
atribut
Metode yang sedang diuji
Sebagai contoh, mari kita asumsikan bahwa Anda memiliki:
Solusi yang disebut
MyBank
yang menerima dan memproses transaksi untuk berbagai jenis akun.Proyek dalam
MyBank
yang disebutBankDb
yang mengelola transaksi untuk akun.Kelas yang disebut
Maths
dalam proyekBankDb
yang melakukan fungsi matematika untuk memastikan bahwa setiap transaksi menguntungkan bagi bank.Proyek pengujian unit yang disebut
BankDbTests
untuk menguji perilaku komponenBankDb
.Kelas pengujian unit yang disebut
MathsTests
untuk memverifikasi perilaku kelasMaths
.
Kita akan menguji metode di Maths
yang menambahkan dua bilangan bulat menggunakan perulangan:
public int AddIntegers(int first, int second)
{
int sum = first;
for (int i = 0; i < second; i++)
{
sum += 1;
}
return sum;
}
Metode pengujian pengujian
Pengujian berbasis data sebaris
Untuk pengujian sebaris, MSTest menggunakan DataRow
untuk menentukan nilai yang digunakan oleh pengujian berbasis data. Pengujian dalam contoh ini berjalan berturut-turut untuk setiap baris data.
[TestMethod]
[DataRow(1, 1, 2)]
[DataRow(2, 2, 4)]
[DataRow(3, 3, 6)]
[DataRow(0, 0, 1)] // The test run with this row fails
public void AddIntegers_FromDataRowTest(int x, int y, int expected)
{
var target = new Maths();
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
Pengujian berbasis data anggota
MSTest menggunakan DynamicData
atribut untuk menentukan nama, jenis (properti, default, atau metode) dan jenis pendefinisian (secara default jenis saat ini digunakan) dari anggota yang akan menyediakan data yang digunakan oleh pengujian berbasis data.
public static IEnumerable<object[]> AdditionData
{
get
{
return new[]
{
new object[] { 1, 1, 2 },
new object[] { 2, 2, 4 },
new object[] { 3, 3, 6 },
new object[] { 0, 0, 1 }, // The test run with this row fails
};
}
}
[TestMethod]
[DynamicData(nameof(AdditionData))]
public void AddIntegers_FromDynamicDataTest(int x, int y, int expected)
{
var target = new Maths();
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
Dimungkinkan juga untuk mengambil alih nama tampilan default yang dihasilkan, menggunakan DynamicDataDisplayName
properti DynamicData
atribut . Tanda tangan metode nama tampilan harus public static string
dan menerima dua parameter, yang pertama dari jenis MethodInfo
dan yang kedua dari jenis object[]
.
public static string GetCustomDynamicDataDisplayName(MethodInfo methodInfo, object[] data)
{
return string.Format("DynamicDataTestMethod {0} with {1} parameters", methodInfo.Name, data.Length);
}
[DynamicData(nameof(AdditionData), DynamicDataDisplayName = nameof(GetCustomDynamicDataDisplayName))]
Pengujian berbasis data penyedia sumber
Membuat pengujian unit berbasis sumber data melibatkan langkah-langkah berikut:
Buat sumber data yang berisi nilai yang Anda gunakan dalam metode pengujian. Sumber data dapat berupa jenis apa pun yang terdaftar pada komputer yang menjalankan pengujian.
Tambahkan properti publik
TestContext
jenis TestContext ke kelas pengujian.Membuat metode pengujian unit
DataSourceAttribute Tambahkan atribut ke dalamnya.
Gunakan properti pengindeks DataRow untuk mengambil nilai yang Anda gunakan dalam pengujian.
Membuat sumber data
Untuk menguji metode AddIntegers
, buat sumber data yang menentukan rentang nilai untuk parameter dan jumlah yang Anda harapkan untuk dikembalikan. Dalam contoh ini, kita akan membuat database Sql Compact bernama MathsData
dan tabel bernama AddIntegersData
yang berisi nama dan nilai kolom berikut
FirstNumber | SecondNumber | Jumlah total |
---|---|---|
0 | 1 | 1 |
1 | 1 | 2 |
2 | -3 | -1 |
Menambahkan TestContext ke kelas pengujian
Kerangka kerja pengujian unit membuat objek TestContext
untuk menyimpan informasi sumber data untuk pengujian berbasis data. Kerangka kerja kemudian mengatur objek ini sebagai nilai properti TestContext
yang Anda buat.
public TestContext TestContext { get; set; }
Dalam metode pengujian, Anda mengakses data melalui properti pengindeks DataRow
dari TestContext
.
Catatan
.NET Core tidak mendukung atribut DataSource. Jika Anda mencoba mengakses data pengujian dengan cara ini dalam proyek pengujian unit .NET Core, UWP, atau WinUI, Anda akan melihat kesalahan yang mirip dengan "'TestContext' tidak berisi definisi untuk 'DataRow' dan tidak ada metode ekstensi yang dapat diakses 'DataRow' yang menerima argumen pertama jenis 'TestContext' dapat ditemukan (apakah Anda kehilangan menggunakan direktif atau referensi perakitan?)".
Menulis metode pengujian
Metode pengujian untuk AddIntegers
cukup sederhana. Untuk setiap baris di sumber data, panggil AddIntegers
dengan nilai kolom FirstNumber dan SecondNumber sebagai parameter, dan verifikasi nilai pengembalian terhadap nilai kolom Jumlah :
[TestMethod]
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
public void AddIntegers_FromDataSourceTest()
{
var target = new Maths();
// Access the data
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
Tentukan DataSourceAttribute
Atribut DataSource
menentukan string koneksi untuk sumber data dan nama tabel yang Anda gunakan dalam metode pengujian. Informasi yang tepat dalam string koneksi berbeda, tergantung pada jenis sumber data apa yang Anda gunakan. Dalam contoh ini, kami menggunakan database SqlServerCe.
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]
Perhatian
string koneksi dapat berisi data sensitif (misalnya, kata sandi). string koneksi disimpan dalam teks biasa dalam kode sumber dan di rakitan yang dikompilasi. Batasi akses ke kode sumber dan rakitan untuk melindungi informasi sensitif ini.
Atribut DataSource memiliki tiga konstruktor.
[DataSource(dataSourceSettingName)]
Konstruktor dengan satu parameter menggunakan informasi koneksi yang disimpan dalam file app.config untuk solusi. dataSourceSettingsName adalah nama elemen Xml dalam file konfigurasi yang menentukan informasi koneksi.
Menggunakan file app.config memungkinkan Anda mengubah lokasi sumber data tanpa membuat perubahan pada pengujian unit itu sendiri. Untuk informasi tentang cara membuat dan menggunakan file app.config, lihat Panduan: Menggunakan File Konfigurasi untuk Menentukan Sumber Data
[DataSource(connectionString, tableName)]
Konstruktor DataSource
dengan dua parameter menentukan string koneksi untuk sumber data dan nama tabel yang berisi data untuk metode pengujian.
String koneksi bergantung pada tipe dari jenis sumber data, tetapi harus berisi elemen Penyedia yang menentukan nama invarian penyedia data.
[DataSource(
dataProvider,
connectionString,
tableName,
dataAccessMethod
)]
Menggunakan TestContext.DataRow untuk mengakses data
Untuk mengakses data dalam tabel AddIntegersData
, gunakan pengindeks TestContext.DataRow
. DataRow
adalah objek DataRow, jadi ambil nilai kolom menurut nama indeks atau kolom. Karena nilai dikembalikan sebagai objek, konversikan ke jenis yang sesuai:
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
Jalankan pengujian dan lihat hasil
Setelah Anda selesai menulis metode pengujian, buat proyek pengujian. Metode pengujian muncul di Test Explorer di grup Tidak Menjalankan Pengujian. Saat Anda menjalankan, menulis, dan menjalankan ulang pengujian Anda, Test Explorer menampilkan hasil dalam grup Pengujian Gagal, Pengujian lulus, dan Tidak Menjalankan Pengujian. Anda dapat memilih Jalankan Semua untuk menjalankan semua pengujian, atau memilih Jalankan untuk memilih subset pengujian yang akan dijalankan.
Bilah hasil pengujian di bagian atas Test Explorer dianimasikan saat pengujian Anda berjalan. Pada akhir uji coba, bilah akan berwarna hijau jika semua tes telah lulus atau berwarna merah jika salah satu tes gagal. Ringkasan uji coba muncul di panel detail di bagian bawah jendela Test Explorer. Pilih pengujian untuk menampilkan detail pengujian tersebut di panel bawah.
Catatan
Ada hasil untuk setiap baris data dan juga satu hasil ringkasan. Jika pengujian diteruskan pada setiap baris data, ringkasan yang dijalankan ditampilkan sebagai Lulus. Jika pengujian gagal pada baris data apa pun, ringkasan yang dijalankan ditampilkan sebagai Gagal.
Jika Anda menjalankan salah AddIntegers_FromDataRowTest
satu metode , AddIntegers_FromDynamicDataTest
atau AddIntegers_FromDataSourceTest
dalam contoh kami, bilah hasil berubah menjadi merah dan metode pengujian dipindahkan ke Pengujian Gagal. Pengujian berbasis data gagal jika salah satu metode yang diulang dari sumber data gagal. Saat Anda memilih pengujian berbasis data yang gagal di jendela Test Explorer, panel detail menampilkan hasil setiap perulangan yang diidentifikasi oleh indeks baris data. Dalam contoh kami, tampaknya algoritma AddIntegers
tidak menangani nilai negatif dengan benar.
Ketika metode di bawah pengujian dikoreksi dan pengujian dijalankan ulang, bilah hasil berubah menjadi hijau dan metode pengujian dipindahkan ke grup Lulus Pengujian.
Konten terkait
- Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow
- Microsoft.VisualStudio.TestTools.UnitTesting.Assert
- Pengujian unit kode
- Menjalankan pengujian unit dengan Test Explorer
- Menulis pengujian unit untuk .NET dengan kerangka kerja pengujian unit Microsoft