Bagikan melalui


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:

  1. Solusi yang disebut MyBank yang menerima dan memproses transaksi untuk berbagai jenis akun.

  2. Proyek dalam MyBank yang disebut BankDb yang mengelola transaksi untuk akun.

  3. Kelas yang disebut Maths dalam proyek BankDb yang melakukan fungsi matematika untuk memastikan bahwa setiap transaksi menguntungkan bagi bank.

  4. Proyek pengujian unit yang disebut BankDbTests untuk menguji perilaku komponen BankDb.

  5. Kelas pengujian unit yang disebut MathsTests untuk memverifikasi perilaku kelas Maths.

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:

  1. 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.

  2. Tambahkan properti publik TestContext jenis TestContext ke kelas pengujian.

  3. Membuat metode pengujian unit

  4. DataSourceAttribute Tambahkan atribut ke dalamnya.

  5. 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_FromDataRowTestsatu 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.