Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 inline menggunakan atribut
DataRow
- data anggota menggunakan atribut
DynamicData
- dari beberapa penyedia sumber terkenal menggunakan atribut
DataSource
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 transaksi apa pun 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 tes uji coba
Pengujian berbasis data terintegrasi
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 atribut DynamicData
untuk menentukan nama, jenis, dan tipe penentu (jenis saat ini digunakan secara default) anggota yang menyediakan data untuk pengujian berbasis data.
Nota
Sebelum MSTest 3.8, enumerasi DynamicDataSourceType
memiliki dua anggota, Property
dan Method
. Defaultnya adalah Property
. Dimulai dengan MSTest 3.8, anggota baru AutoDetect
ditambahkan ke enumerasi dan merupakan default. Jadi, Anda tidak perlu lagi menentukan DynamicDataSourceType
.
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 mengganti nama tampilan default yang dihasilkan, menggunakan properti DynamicDataDisplayName
dari atribut DynamicData
. 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
TestContext
publik tipe TestContext ke kelas pengujian.Membuat metode pengujian unit
Tambahkan atribut DataSourceAttribute ke dalamnya.
Gunakan properti pengindeks DataRow untuk mengambil nilai yang Anda gunakan dalam pengujian.
Nota
DataSourceAttribute saat ini hanya didukung pada .NET Framework. Jika Anda mencoba mengakses data pengujian menggunakan metode ini di .NET Core, .NET 5+, proyek pengujian unit 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?)".
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 |
---|---|---|
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
.
Menulis metode pengujian
Metode pengujian untuk AddIntegers
cukup sederhana. Untuk setiap baris dalam sumber data, panggil AddIntegers
dengan nilai kolom FirstNumber dan SecondNumber sebagai parameter, dan verifikasi nilai pengembalian terhadap nilai kolom Sum:
[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")]
Peringatan
String koneksi dapat berisi data sensitif (misalnya, kata sandi). String penghubung disimpan dalam teks biasa dalam kode sumber dan assembly yang sudah 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 jenis sumber data, tetapi harus berisi elemen Penyedia yang menentukan nama penyedia data yang invarian.
[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"]);
Lakukan pengujian dan lihat hasilnya
Setelah Anda selesai menulis metode pengujian, buat proyek pengujian. Metode pengujian muncul di Test Explorer dalam grup Not Run Tests. Saat Anda menjalankan, menulis, dan menjalankan ulang pengujian Anda, Test Explorer menampilkan hasil dalam kelompok Tes Gagal, Tes Lulus, dan Tes Belum Dijalankan. 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 pengujian telah lulus atau merah jika salah satu pengujian gagal. Ringkasan eksekusi pengujian muncul di panel detail di bagian bawah jendela Test Explorer. Pilih pengujian untuk menampilkan detail pengujian tersebut di panel bawah.
Nota
Ada hasil untuk setiap baris data dan juga satu hasil ringkasan. Jika pengujian lulus pada setiap baris data, ringkasan menunjukkan Lulus. Jika pengujian gagal pada baris data apa pun, eksekusi ringkasan ditampilkan sebagai Gagal.
Jika Anda menjalankan salah satu metode AddIntegers_FromDataRowTest
, 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 Passed Test.
Konten terkait
- Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow
- Microsoft.VisualStudio.TestTools.UnitTesting.Assert
- unit menguji kode Anda
- Jalankan pengujian unit dengan Test Explorer
- Tulis pengujian unit untuk .NET dengan kerangka kerja pengujian unit Microsoft