Dasar-dasar pengujian unit

Periksa apakah kode Anda berfungsi seperti yang diharapkan dengan membuat dan menjalankan pengujian unit. Disebut pengujian unit karena Anda menguraikan fungsionalitas program menjadi perilaku terpisah yang dapat diuji, yang dapat Anda uji sebagai unit individu. Visual Studio Test Explorer menyediakan cara yang fleksibel dan efisien untuk menjalankan pengujian unit dan menampilkan hasilnya di Visual Studio. Visual Studio menginstal kerangka kerja pengujian unit Microsoft untuk kode terkelola dan asli. Gunakan kerangka kerja pengujian unit untuk membuat pengujian unit, menjalankannya, dan melaporkan hasil pengujian tersebut. Jalankan ulang pengujian unit saat Anda membuat perubahan untuk menguji bahwa kode Anda masih berfungsi dengan benar. Visual Studio Enterprise dapat melakukan ini secara otomatis dengan Pengujian Unit Langsung, yang mendeteksi pengujian yang terpengaruh oleh perubahan kode dan menjalankannya di latar belakang saat Anda mengetik.

Pengujian unit memiliki efek terbesar pada kualitas kode Anda jika pengujian tersebut merupakan bagian integral dari alur kerja pengembangan perangkat lunak Anda. Segera setelah Anda menulis fungsi atau blok kode aplikasi lainnya, buat pengujian unit yang memverifikasi perilaku kode sebagai respons terhadap kasus standar, batas, dan data input yang salah, dan respons yang memeriksa asumsi eksplisit atau implisit yang dibuat oleh kode. Dengan pengembangan berbasis pengujian, Anda membuat pengujian unit sebelum menulis kode, sehingga Anda menggunakan pengujian unit sebagai dokumentasi desain dan spesifikasi fungsional.

Test Explorer juga dapat menjalankan kerangka kerja pengujian unit pihak ketiga dan sumber terbuka yang telah menerapkan antarmuka add-on Test Explorer. Anda dapat menambahkan banyak kerangka kerja ini melalui Manajer Ekstensi Visual Studio dan galeri Visual Studio. Untuk informasi selengkapnya, lihat Menginstal kerangka kerja pengujian unit pihak ketiga.

Anda dapat menghasilkan proyek pengujian dan metode pengujian dari kode dengan cepat, atau membuat pengujian secara manual saat membutuhkannya. Saat menggunakan IntelliTest untuk menjelajahi kode .NET, Anda dapat menghasilkan data pengujian dan serangkaian pengujian unit. Untuk setiap pernyataan dalam kode, dihasilkan input pengujian yang akan menjalankan pernyataan tersebut. Temukan cara membuat pengujian unit untuk kode .NET.

Mulai

Untuk pengantar pengujian unit yang membawa Anda langsung ke pengodean, lihat salah satu topik berikut:

Contoh solusi Bank

Dalam artikel ini, kita menggunakan pengembangan aplikasi fiktif bernama MyBank sebagai contoh. Anda tidak memerlukan kode aktual untuk mengikuti penjelasan dalam topik ini. Metode pengujian ditulis dalam C# dan disajikan dengan menggunakan Kerangka Kerja Pengujian Unit Microsoft untuk Kode Terkendali. Namun, konsepnya mudah ditransfer ke bahasa pemrogram dan kerangka kerja lain.

MyBank Solution 2019

MyBank Solution 2022

Upaya pertama kita dalam merancang aplikasi MyBank mencakup komponen rekening yang mewakili rekening individu dan transaksinya dengan bank, dan komponen database yang mewakili fungsi untuk mengagregasi dan mengelola rekening individu.

Kita membuat solusi Bank yang berisi dua proyek:

  • Accounts

  • BankDB

Upaya pertama kita dalam merancang proyek Accounts berisi kelas untuk menyimpan informasi dasar rekening, antarmuka yang menentukan fungsi umum dari semua jenis rekening, seperti menyetor dan menarik aset dari rekening, dan kelas yang diturunkan dari antarmuka yang mewakili rekening giro. Kita memulai proyek Rekening dengan membuat file sumber berikut:

  • AccountInfo.cs mendefinisikan informasi dasar rekening.

  • IAccount.cs mendefinisikan antarmuka IAccount standar rekening, termasuk metode untuk menyetorkan dan menarik aset dari rekening dan mengambil saldo rekening.

  • CheckingAccount.cs berisi kelas CheckingAccount yang mengimplementasikan antarmuka IAccount untuk rekening giro.

Kami belajar dari pengalaman bahwa satu hal yang harus dilakukan saat penarikan dari rekening giro adalah memastikan bahwa jumlah yang ditarik lebih kecil dari saldo rekening. Jadi kita mengganti metode IAccount.Withdraw di CheckingAccount dengan metode yang memeriksa kondisi ini. Metodenya mungkin tampak seperti ini:

public void Withdraw(double amount)
{
    if(m_balance >= amount)
    {
        m_balance -= amount;
    }
    else
    {
        throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
    }
}

Sekarang kita memiliki beberapa kode, saatnya melakukan pengujian.

Membuat proyek pengujian unit dan metode pengujian (C#)

Untuk C#, sering kali lebih cepat untuk menghasilkan proyek pengujian unit dan stub pengujian unit dari kode Anda. Atau Anda dapat memilih untuk membuat proyek pengujian unit dan pengujian secara manual, tergantung pada kebutuhan Anda. Jika ingin membuat pengujian unit dari kode dengan kerangka kerja pihak ke-3, Anda akan perlu menginstal salah satu ekstensi ini: NUnit atau xUnit. Jika Anda tidak menggunakan C#, lompati bagian ini dan buka Membuat proyek pengujian unit dan pengujian unit secara manual.

Membuat proyek pengujian unit dan stub pengujian unit

  1. Dari jendela editor kode, klik kanan dan pilih Buat Pengujian Unit dari menu klik kanan.

    From the editor window, view the context menu

    Catatan

    Perintah menu Buat Pengujian Unit hanya tersedia untuk kode C#. Untuk menggunakan metode ini dengan .NET Core atau .NET Standard, diperlukan Visual Studio 2019 atau yang lebih baru.

    From the editor window, view the context menu

    Catatan

    Perintah menu Buat Pengujian Unit hanya tersedia untuk kode C#. Untuk menggunakan metode ini dengan .NET Core atau .NET Standard, diperlukan Visual Studio 2019 atau yang lebih baru.

  2. Klik OK untuk menyetujui default untuk membuat pengujian unit, atau ubah nilai yang digunakan untuk membuat dan memberi nama proyek pengujian unit dan pengujian unit. Anda dapat memilih kode yang ditambahkan secara default ke metode pengujian unit.

    Create Unit Tests dialog box in Visual Studio

    Create Unit Tests dialog box in Visual Studio

  3. Stub pengujian unit dibuat dalam proyek pengujian unit baru untuk semua metode di kelasnya.

    The unit tests are created

    The unit tests are created

  4. Sekarang lanjutkan mempelajari cara Menulis pengujian Anda agar pengujian unit Anda bermakna, dan pengujian unit tambahan apa pun yang mungkin ingin ditambahkan untuk menguji kode Anda secara menyeluruh.

Membuat proyek pengujian unit dan pengujian unit secara manual

Proyek pengujian unit biasanya mencerminkan struktur proyek kode tunggal. Dalam contoh MyBank, Anda menambahkan dua proyek pengujian unit bernama AccountsTests dan BankDbTests ke Bank solusi. Nama proyek pengujian dapat berupa apa saja, tetapi mengadopsi konvensi penamaan standar adalah ide yang bagus.

Untuk menambahkan proyek pengujian unit ke solusi:

  1. Di Penjelajah Solusi, klik kanan pada solusi dan pilih Tambahkan>BaruProyek.

  2. Ketik pengujian di kotak pencarian templat proyek untuk menemukan templat proyek pengujian unit untuk kerangka pengujian yang ingin digunakan. (Pada contoh dalam topik ini, kita menggunakan MSTest.)

  3. Pada halaman berikutnya, beri nama proyek. Untuk menguji proyek Accounts contoh kita, Anda dapat memberi nama proyek AccountsTests.

  4. Dalam proyek pengujian unit Anda, tambahkan referensi ke proyek kode yang sedang diuji, dalam contoh kami ke proyek Rekening.

    Untuk membuat referensi ke proyek kode:

    1. Dalam proyek pengujian unit di Penjelajah Solusi, klik kanan node Referensi atau Dependensi, lalu pilih Tambahkan Referensi Proyek atau Tambahkan Referensi, mana saja yang tersedia.

    2. Pada kotak dialog Manajer Referensi, buka node Solusi dan pilih Proyek. Pilih nama proyek kode dan tutup kotak dialog.

Setiap proyek pengujian unit berisi kelas yang mencerminkan nama kelas dalam proyek kode. Dalam contoh kita, proyek AccountsTests akan berisi kelas-kelas berikut:

  • Kelas AccountInfoTests berisi metode pengujian unit untuk kelas AccountInfo dalam proyek Accounts

  • Kelas CheckingAccountTests berisi metode pengujian unit untuk kelas CheckingAccount.

Menulis pengujian Anda

Kerangka kerja pengujian unit yang Anda gunakan dan Visual Studio IntelliSense akan memberikan panduan dalam menulis kode pengujian unit Anda untuk sebuah proyek kode. Untuk berjalan di Test Explorer, sebagian besar kerangka kerja mengharuskan Anda menambahkan atribut khusus untuk mengidentifikasi metode pengujian unit. Kerangka kerja juga menyediakan cara—biasanya melalui pernyataan tegas atau atribut metode—untuk menunjukkan apakah metode pengujian telah lulus atau gagal. Atribut lain mengidentifikasi metode penyiapan opsional yang berada pada inisialisasi kelas dan sebelum setiap metode pengujian dan metode teardown yang dijalankan setelah setiap metode pengujian dan sebelum kelas dimusnahkan.

Pola AAA (Arrange, Act, Assert) adalah cara umum menulis pengujian unit untuk metode yang sedang diuji.

  • Bagian Arrange dari metode pengujian unit menginisialisasi objek dan menetapkan nilai data yang diteruskan ke metode yang sedang diuji.

  • Bagian Act memanggil metode yang sedang diuji dengan parameter yang disusun.

  • Bagian Assert memverifikasi bahwa tindakan metode yang sedang diuji berperforma seperti yang diharapkan. Untuk .NET, metode di kelas Assert sering digunakan untuk verifikasi.

Untuk menguji metode CheckingAccount.Withdraw dari contoh kita, kita dapat menulis dua pengujian: satu yang memverifikasi perilaku standar metode, dan satu yang memverifikasi bahwa penarikan lebih dari saldo akan gagal (Kode berikut menunjukkan pengujian unit MSTest , yang didukung di .NET.). Di kelas CheckingAccountTests, kita menambahkan metode berikut:

[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
    // arrange
    double currentBalance = 10.0;
    double withdrawal = 1.0;
    double expected = 9.0;
    var account = new CheckingAccount("JohnDoe", currentBalance);

    // act
    account.Withdraw(withdrawal);

    // assert
    Assert.AreEqual(expected, account.Balance);
}

[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
    // arrange
    var account = new CheckingAccount("John Doe", 10.0);

    // act and assert
    Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}

Untuk informasi selengkapnya tentang kerangka kerja pengujian unit Microsoft, lihat salah satu topik berikut ini:

Menetapkan batas waktu untuk pengujian unit

Jika menggunakan kerangka kerja MSTest, Anda dapat menggunakan TimeoutAttribute untuk menetapkan batas waktu pada metode pengujian individu:

[TestMethod]
[Timeout(2000)]  // Milliseconds
public void My_Test()
{ ...
}

Untuk menetapkan batas waktu ke maksimum yang diizinkan:

[TestMethod]
[Timeout(TestTimeout.Infinite)]  // Milliseconds
public void My_Test ()
{ ...
}

Menjalankan pengujian di Test Explorer

Saat Anda membangun proyek pengujian, pengujian tersebut muncul di Test Explorer. Jika Test Explorer tidak terlihat, pilih Pengujian pada menu Visual Studio, pilih Windows, lalu pilih Test Explorer (atau tekan Ctrl + E, T).

Unit Test Explorer

Unit Test Explorer

Saat Anda menjalankan, menulis, dan menjalankan ulang pengujian, Test Explorer dapat menampilkan hasil dalam grup Pengujian yang Gagal, Pengujian yang Lulus, Pengujian yang Dilompati, dan Pengujian yang Tidak Dijalankan. Anda dapat memilih grup lain berdasarkan opsi di toolbar.

Anda juga dapat memfilter pengujian dalam tampilan apa pun dengan mencocokkan teks dalam kotak pencarian di tingkat global atau dengan memilih salah satu filter yang telah ditentukan sebelumnya. Anda dapat menjalankan pilihan pengujian kapan pun. Hasil pengujian segera ditampilkan di bilah lulus/gagal pada bagian atas jendela penjelajah. Detail hasil metode pengujian ditampilkan saat Anda memilih pengujian.

Menjalankan dan melihat pengujian

Toolbar Test Explorer membantu Anda menemukan, mengatur, dan menjalankan pengujian yang Anda minati.

Run tests from the Test Explorer toolbar

Run tests from the Test Explorer toolbar

Anda dapat memilih Jalankan Semua untuk menjalankan semua pengujian (atau tekan Ctrl + R, V), atau pilih Jalankan untuk memilih subset pengujian yang akan dijalankan (Ctrl + R, T). Pilih pengujian untuk menampilkan detail pengujian tersebut di panel detail pengujian. Pilih Buka Pengujian dari menu klik kanan (Keyboard: F12) untuk menampilkan kode sumber untuk pengujian yang dipilih.

Jika pengujian individual tidak memiliki dependensi yang mencegahnya dijalankan dalam urutan apa pun, aktifkan eksekusi pengujian paralel di menu pengaturan toolbar. Ini secara nyata dapat mengurangi waktu yang dibutuhkan untuk menjalankan semua pengujian.

Menjalankan pengujian setelah setiap build

Untuk menjalankan pengujian unit Anda setelah setiap build lokal, buka ikon pengaturan di toolbar Test Explorer dan pilih Jalankan Pengujian Setelah Build.

Memfilter dan mengelompokkan daftar pengujian

Jika memiliki banyak pengujian, Anda dapat mengetik di kotak pencarian Test Explorer untuk memfilter daftar menurut string yang ditentukan. Anda dapat lebih membatasi peristiwa filter dengan memilih dari daftar filter.

Search filter categories

Search filter categories

Tombol Deskripsi
Test Explorer group button Untuk mengelompokkan pengujian menurut kategori, pilih tombol Kelompokkan Menurut.

Untuk informasi selengkapnya, lihat Menjalankan pengujian unit dengan Test Explorer.

T&J

T: Bagaimana cara men-debug pengujian unit?

J: Gunakan Test Explorer untuk memulai sesi penelusuran kesalahan pengujian Anda. Menelusuri kode Anda dengan debugger Visual Studio dengan mulus membawa Anda bolak-balik antara pengujian unit dan proyek yang sedang diuji. Untuk memulai penelusuran kesalahan:

  1. Di editor Visual Studio, tetapkan titik henti dalam satu atau beberapa metode pengujian yang ingin Anda debug.

    Catatan

    Karena metode pengujian dapat berjalan dalam urutan apa pun, atur titik henti di semua metode pengujian yang ingin Anda debug.

  2. Di Test Explorer, pilih metode pengujian lalu pilih Debug Pengujian yang Dipilih dari menu pintasan.

Pelajari detail selengkapnya tentang penelusuran kesalahan pengujian unit.

T: Jika saya menggunakan pengembangan berbasis pengujian, bagaimana cara menghasilkan kode dari pengujian saya?

J: Gunakan Tindakan Cepat untuk menghasilkan kelas dan metode dalam kode proyek Anda. Tulis pernyataan dalam metode pengujian yang memanggil kelas atau metode yang ingin dihasilkan, lalu buka bola lampu yang muncul di pada kesalahan. Jika panggilan ditujukan ke konstruktor kelas baru, pilih Buat jenis dari menu dan ikuti wizard untuk menyisipkan kelas dalam proyek kode Anda. Jika panggilan ditujukan ke metode, pilih Buat metode dari menu IntelliSense.

Generate Method Stub Quick Action Menu

Generate Method Stub Quick Action Menu

T: Apakah saya dapat membuat pengujian unit yang menggunakan beberapa kumpulan data sebagai input untuk menjalankan pengujian?

J: Ya. Metode pengujian berbasis data memungkinkan Anda menguji rentang nilai dengan metode pengujian unit tunggal. DataRowGunakan atribut , DynamicData atau DataSource untuk metode pengujian yang menentukan sumber data yang berisi nilai variabel yang ingin Anda uji.

Metode yang diatribusikan berjalan sekali untuk setiap baris di sumber data. Test Explorer melaporkan kegagalan pengujian untuk metode ini jika salah satu dari perulangan gagal. Panel detail hasil pengujian untuk metode menunjukkan metode status gagal/lulus untuk setiap baris data.

Pelajari selengkapnya tentang pengujian unit berbasis data.

T: Apakah saya dapat melihat jumlah kode yang diuji oleh pengujian unit saya?

J: Ya. Anda dapat mengetahui jumlah kode yang benar-benar sedang diuji oleh pengujian unit Anda dengan menggunakan alat cakupan kode Visual Studio di Visual Studio Enterprise. Bahasa pemrogram asli dan terkelola serta semua kerangka kerja pengujian unit yang dapat dijalankan oleh Kerangka Kerja Pengujian Unit didukung.

Anda dapat menjalankan cakupan kode pada pengujian terpilih atau pada semua pengujian dalam solusi. Jendela Hasil Cakupan Kode menampilkan persentase blok kode produk yang dijalankan oleh baris, fungsi, kelas, namespace layanan, dan modul.

Untuk menjalankan cakupan kode metode pengujian dalam suatu solusi, pilih Pengujian>Analisis Cakupan Kode untuk Semua Pengujian.

Hasil cakupan ditampilkan di jendela Hasil Cakupan Kode.

Code coverage results

Code coverage results

Pelajari selengkapnya tentang cakupan kode.

T: Apakah saya dapat menguji metode dalam kode saya yang memiliki dependensi eksternal?

J: Ya. Jika Anda memiliki Visual Studio Enterprise, Microsoft Fakes dapat digunakan dengan metode pengujian yang Anda tulis dengan menggunakan kerangka kerja pengujian unit untuk kode terkendali.

Microsoft Fakes menggunakan dua pendekatan untuk membuat kelas pengganti terhadap dependensi eksternal:

  1. Stubs menghasilkan kelas pengganti yang diturunkan dari antarmuka induk kelas dependensi target. Metode stub dapat diganti dengan metode virtual publik dari kelas target.

  2. Shims menggunakan instrumentasi runtime untuk mengalihkan panggilan ke metode target hingga metode shim pengganti untuk metode non-virtual.

Dalam kedua pendekatan, Anda menggunakan delegasi panggilan yang dihasilkan untuk metode dependensi guna menentukan perilaku yang Anda inginkan dalam metode pengujian.

Pelajari selengkapnya tentang mengisolasi metode pengujian unit dengan Microsoft Fakes.

T: Apakah saya dapat menggunakan kerangka kerja pengujian unit lain untuk membuat pengujian unit?

J: Ya, ikuti langkah-langkah ini untuk menemukan dan menginstal kerangka kerja lain. Setelah memulai ulang Visual Studio, buka kembali solusi Anda untuk membuat pengujian unit, lalu pilih kerangka kerja yang Anda instal di sini:

Select other installed unit test framework

Stub pengujian unit Anda akan dibuat menggunakan kerangka kerja yang dipilih.