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.
Memulai
Untuk pengenalan pengujian unit yang membawa Anda langsung ke pengkodian, lihat salah satu artikel berikut:
Panduan: Membuat dan menjalankan pengujian unit untuk kode .NET
Panduan: Pengembangan berbasis pengujian dengan Test Explorer
Contoh solusi Bank
Dalam artikel ini, kita menggunakan pengembangan aplikasi fiktif bernama MyBank
sebagai contoh. Anda tidak memerlukan kode aktual untuk mengikuti penjelasan dalam artikel 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.
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 antarmukaIAccount
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 pengujian unit dengan Copilot
Anda juga dapat menggunakan perintah Garis miring Copilot /tests
untuk menghasilkan pengujian unit dari kode. Misalnya, Anda dapat mengetik /tests using NUnit Framework
untuk menghasilkan pengujian NUnit. Untuk informasi selengkapnya, lihat Menggunakan perintah garis miring di Obrolan Salinan.
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
Dari jendela editor kode, klik kanan dan pilih Buat Pengujian Unit dari menu klik kanan.
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.
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.
Pilih OK untuk menerima default untuk membuat pengujian unit Anda, 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.
Stub pengujian unit dibuat dalam proyek pengujian unit baru untuk semua metode di kelasnya.
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:
Di Penjelajah Solusi, klik kanan pada solusi dan pilih Tambahkan>Proyek Baru.
Ketik pengujian di kotak pencarian templat proyek untuk menemukan templat proyek pengujian unit untuk kerangka pengujian yang ingin digunakan. (Dalam contoh dalam artikel ini, kami menggunakan MSTest.)
Pada halaman berikutnya, beri nama proyek. Untuk menguji proyek
Accounts
contoh kita, Anda dapat memberi nama proyekAccountsTests
.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:
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.
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 kelasAccountInfo
dalam proyekAccounts
Kelas
CheckingAccountTests
berisi metode pengujian unit untuk kelasCheckingAccount
.
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 artikel 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).
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.
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.
Tombol | Deskripsi |
---|---|
Untuk mengelompokkan pengujian menurut kategori, pilih tombol Kelompokkan Menurut. |
Untuk informasi selengkapnya, lihat Menjalankan pengujian unit dengan Test Explorer.
Q&A
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:
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.
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 Anda hasilkan, lalu buka bola lampu yang muncul di bawah 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.
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. DataRow
Gunakan 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 menentukan jumlah kode yang sebenarnya sedang diuji oleh pengujian unit Anda dengan menggunakan alat cakupan Visual Studio Code 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.
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:
Stubs menghasilkan kelas pengganti yang diturunkan dari antarmuka induk kelas dependensi target. Metode stub dapat diganti dengan metode virtual publik dari kelas target.
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:
Stub pengujian unit Anda akan dibuat menggunakan kerangka kerja yang dipilih.
T: Bagaimana cara mengekspor hasil pengujian unit saya?
A: Anda dapat menggunakan file .runsettings dengan baris perintah atau IDE Visual Studio untuk mengonfigurasi pengujian unit dan mengatur file hasil pengujian. Untuk informasi selengkapnya, lihat Elemen LoggerRunSettings.