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.
Artikel ini memanah Anda membuat, menjalankan, dan menyesuaikan serangkaian pengujian unit menggunakan kerangka kerja pengujian unit Microsoft untuk kode terkelola dan Visual Studio Test Explorer. Anda memulai dengan proyek C# yang sedang dikembangkan, membuat pengujian yang menjalankan kodenya, menjalankan pengujian, dan memeriksa hasilnya. Kemudian Anda mengubah kode proyek dan menjalankan ulang pengujian. Jika Anda ingin gambaran umum konseptual tugas-tugas ini sebelum melalui langkah-langkah ini, lihat dasar-dasar pengujian unit .
Artikel ini menjelaskan cara membuat pengujian unit secara manual. Jika Anda ingin membuat pengujian secara otomatis dari kode yang ada, lihat artikel berikut:
Prasyarat
Visual Studio harus diinstal bersama dengan beban kerja pengembangan desktop .NET .
Membuat proyek untuk diuji
Buka Visual Studio.
Pada jendela mulai, pilih Buat proyek baru.
Cari dan pilih templat proyek Console App C# untuk .NET, lalu klik Berikutnya.
Jika Anda tidak melihat templat Aplikasi Konsol , gunakan Alat Penginstal Visual Studio untuk menginstal beban kerja pengembangan desktop .NET .
Beri nama proyek Bank, lalu klik Berikutnya.
Pilih kerangka kerja target yang direkomendasikan atau .NET 8, lalu pilih Buat.
Proyek Bank dibuat dan ditampilkan di Solution Explorer dengan file Program.cs terbuka di editor kode.
Nota
Jika Program.cs tidak terbuka di editor, klik dua kali file Program.cs di Solution Explorer untuk membukanya.
Ganti konten Program.cs dengan kode C# berikut yang mendefinisikan kelas, BankAccount:
using System; namespace BankAccountNS { /// <summary> /// Bank account demo class. /// </summary> public class BankAccount { private readonly string m_customerName; private double m_balance; private BankAccount() { } public BankAccount(string customerName, double balance) { m_customerName = customerName; m_balance = balance; } public string CustomerName { get { return m_customerName; } } public double Balance { get { return m_balance; } } public void Debit(double amount) { if (amount > m_balance) { throw new ArgumentOutOfRangeException("amount"); } if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } m_balance += amount; // intentionally incorrect code } public void Credit(double amount) { if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } m_balance += amount; } public static void Main() { BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99); ba.Credit(5.77); ba.Debit(11.22); Console.WriteLine("Current balance is ${0}", ba.Balance); } } }Ganti nama file menjadi BankAccount.cs dengan mengklik kanan dan memilih Ganti Nama di Penjelajah Solusi.
Pada menu Build, klik Build Solution (atau tekan Ctrl + SHIFT + B).
Anda sekarang memiliki proyek dengan metode yang dapat Anda uji. Dalam artikel ini, pengujian berfokus pada metode Debit. Metode Debit dipanggil ketika uang ditarik dari akun.
Membuat proyek pengujian unit
Pada menu File, pilih Tambahkan>Proyek Baru.
Saran
Anda juga dapat mengklik kanan solusi di Solution Explorer dan memilih Tambahkan>Proyek Baru.
Ketik pengujian di kotak pencarian, pilih C# sebagai bahasa, lalu pilih Proyek Pengujian C# MSTest untuk templat .NET, lalu klik Berikutnya.
Nota
Di Visual Studio 2019 versi 16.9, templat proyek MSTest Unit Test Project.
Beri nama proyek BankTests dan klik Berikutnya.
Pilih kerangka kerja target yang direkomendasikan atau .NET 8, lalu pilih Buat.
Mulai dari Visual Studio 2022 versi 17.10, Anda juga dapat memilih runner pengujian. Untuk runner pengujian, Anda dapat memilih VSTest atau MSTest. Untuk informasi selengkapnya tentang perbedaan antara pengelola pengujian, lihat perbandingan Microsoft.Testing.Platform dan VSTest.
Proyek BankTests ditambahkan ke solusi Bank.
Dalam proyek BankTests, tambahkan referensi ke proyek Bank.
Di Solution Explorer, pilih Dependensi di bawah proyek BankTests lalu pilih Tambahkan Referensi (atau Tambahkan Referensi Proyek) dari menu klik kanan.
Dalam kotak dialog Reference Manager, perluas Projects, pilih Solution, dan periksa item Bank.
Pilih OK.
Membuat kelas pengujian
Buat kelas pengujian untuk memverifikasi kelas BankAccount. Anda dapat menggunakan file UnitTest1.cs yang dihasilkan oleh templat proyek, tetapi beri nama file dan kelas yang lebih deskriptif.
Mengganti nama file dan kelas
Untuk mengganti nama file, di Penjelajah Solusi, pilih file UnitTest1.cs di proyek BankTests. Dari menu klik kanan, pilih Ganti Nama (atau tekan F2), lalu ganti nama file menjadi BankAccountTests.cs.
Untuk mengganti nama kelas, posisikan kursor pada
UnitTest1di editor kode, klik kanan, lalu pilih Ganti Nama (atau tekan F2). Ketik BankAccountTests lalu tekan Enter.
File BankAccountTests.cs sekarang berisi kode berikut:
// The 'using' statement for Test Tools is in GlobalUsings.cs
// using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace BankTests
{
[TestClass]
public class BankAccountTests
{
[TestMethod]
public void TestMethod1()
{
}
}
}
Menambahkan pernyataan penggunaan
Tambahkan pernyataan using ke kelas pengujian untuk dapat memanggil proyek yang diuji tanpa menggunakan nama lengkap. Di bagian atas file kelas, tambahkan:
using BankAccountNS;
Persyaratan kelas pengujian
Persyaratan minimum untuk kelas pengujian adalah:
Atribut
[TestClass]diperlukan pada kelas apa pun yang berisi metode pengujian unit yang ingin Anda jalankan di Test Explorer.Setiap metode pengujian yang Anda inginkan untuk dikenali Test Explorer harus memiliki atribut
[TestMethod].
Anda dapat memiliki kelas lain dalam proyek pengujian unit yang tidak memiliki atribut [TestClass], dan Anda dapat memiliki metode lain dalam kelas pengujian yang tidak memiliki atribut [TestMethod]. Anda dapat memanggil kelas dan metode lain ini dari metode pengujian Anda.
Membuat metode pengujian pertama
Dalam prosedur ini, Anda menulis metode pengujian unit untuk memverifikasi perilaku metode Debit kelas BankAccount.
Setidaknya ada tiga perilaku yang perlu diperiksa:
Metode ini melemparkan ArgumentOutOfRangeException jika jumlah debit lebih besar dari saldo.
Metode ini melemparkan ArgumentOutOfRangeException jika jumlah debit kurang dari nol.
Jika jumlah debit valid, metode mengurangi jumlah debit dari saldo akun.
Saran
Anda dapat menghapus metode default TestMethod1 , karena Anda tidak akan menggunakannya dalam artikel ini.
Untuk membuat metode pengujian
Pengujian pertama memverifikasi bahwa jumlah yang valid (yaitu, yang kurang dari saldo akun dan lebih besar dari nol) menarik jumlah yang benar dari akun. Tambahkan metode berikut ke kelas BankAccountTests tersebut:
[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = 4.55;
double expected = 7.44;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// Act
account.Debit(debitAmount);
// Assert
double actual = account.Balance;
Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}
Metode ini mudah: ini menyiapkan objek BankAccount baru dengan saldo awal dan kemudian menarik jumlah yang valid. Ini menggunakan metode Assert.AreEqual untuk memverifikasi bahwa saldo akhir seperti yang diharapkan. Metode seperti Assert.AreEqual, Assert.IsTrue, dan lainnya sering digunakan dalam pengujian unit. Untuk informasi konseptual selengkapnya tentang menulis pengujian unit, lihat Menulis pengujian unit Anda.
Persyaratan metode pengujian
Metode pengujian harus memenuhi persyaratan berikut:
Ini dihiasi dengan atribut
[TestMethod].Ini mengembalikan
void.Ini tidak dapat memiliki parameter.
Membangun dan menjalankan pengujian
Pada menu Build, pilih Build Solution (atau tekan Ctrl + SHIFT + B).
Jika Test Explorer tidak terbuka, buka dengan memilih Test>Test Explorer (atau Test>Windows>Test Explorer) dari bilah menu atas (atau tekan Ctrl + E, T).
Pilih Jalankan Semua untuk menjalankan pengujian (atau tekan Ctrl + R, V).
Saat pengujian berjalan, bilah status di bagian atas jendela Test Explorer dianimasikan. Pada akhir uji coba, bilah berubah menjadi hijau jika semua metode pengujian lulus, atau merah jika salah satu pengujian gagal.
Dalam hal ini, pengujian gagal.
Pilih metode di Test Explorer untuk melihat detail di bagian bawah jendela.
Perbaiki kode Anda dan jalankan ulang pengujian Anda
Hasil pengujian berisi pesan yang menjelaskan kegagalan. Anda mungkin perlu menelusuri lebih dalam untuk melihat pesan ini. Untuk metode AreEqual, pesan menampilkan apa yang diharapkan dan apa yang sebenarnya diterima. Anda mengharapkan saldo berkurang, tetapi sebaliknya malah meningkat sebesar jumlah penarikan.
Pengujian unit telah mengungkap bug: jumlah penarikan ditambahkan ke saldo akun padahal seharusnya dikurangi.
Memperbaiki bug
Untuk memperbaiki kesalahan, dalam file BankAccount.cs, ganti baris:
m_balance += amount;
dengan:
m_balance -= amount;
Jalankan ulang pengujian
Di Test Explorer, pilih Jalankan Semua untuk menjalankan ulang pengujian (atau tekan Ctrl + R, V). Bilah merah/hijau berubah menjadi hijau untuk menunjukkan bahwa pengujian lulus.
Menggunakan pengujian unit untuk meningkatkan kode Anda
Bagian ini menjelaskan bagaimana proses analisis berulang, pengembangan pengujian unit, dan pemfaktoran ulang dapat membantu Anda membuat kode produksi Anda lebih kuat dan efektif.
Menganalisis masalah
Anda telah membuat metode pengujian untuk mengonfirmasi bahwa jumlah yang valid dikurangi dengan benar dalam metode Debit. Sekarang, verifikasi bahwa fungsi menghasilkan kesalahan ArgumentOutOfRangeException jika jumlah debit adalah:
- lebih besar dari saldo, atau
- kurang dari nol.
Membuat dan menjalankan metode pengujian baru
Buat metode pengujian untuk memverifikasi perilaku yang benar ketika jumlah debit kurang dari nol:
[TestMethod]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = -100.00;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// Act and assert
Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => account.Debit(debitAmount));
}
Gunakan metode ThrowsException untuk menegaskan bahwa pengecualian yang benar telah dilemparkan. Metode ini menyebabkan pengujian gagal kecuali ArgumentOutOfRangeException dilemparkan. Jika Anda memodifikasi sementara metode yang diuji untuk menghasilkan ApplicationException yang lebih umum ketika jumlah debit kurang dari nol, pengujian berjalan dengan benar—yaitu, gagal.
Untuk menguji kasus ketika jumlah yang ditarik lebih besar dari saldo, lakukan langkah-langkah berikut:
Buat metode pengujian baru bernama
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.Salin isi metode dari
Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRangeke metode baru.Atur
debitAmountke angka yang lebih besar dari saldo.
Jalankan dua pengujian dan verifikasi bahwa mereka lulus.
Lanjutkan analisis
Metode yang sedang diuji dapat ditingkatkan lebih lanjut. Dengan implementasi saat ini, kita tidak memiliki cara untuk mengetahui kondisi mana (amount > m_balance atau amount < 0) menyebabkan pengecualian dilemparkan selama pengujian. Kita hanya tahu bahwa ArgumentOutOfRangeException dilemparkan ke suatu tempat dalam metode . Akan lebih baik jika kita dapat mengetahui kondisi mana dalam BankAccount.Debit yang menyebabkan pengecualian terjadi (amount > m_balance atau amount < 0) sehingga kita dapat yakin bahwa metode kita memeriksa argumennya dengan benar.
Lihat metode yang sedang diuji (BankAccount.Debit) lagi, dan perhatikan bahwa kedua pernyataan kondisional menggunakan konstruktor ArgumentOutOfRangeException yang hanya mengambil nama argumen sebagai parameter:
throw new ArgumentOutOfRangeException("amount");
Ada konstruktor yang dapat Anda gunakan yang melaporkan informasi yang jauh lebih kaya: ArgumentOutOfRangeException(String, Object, String) menyertakan nama argumen, nilai argumen, dan pesan yang ditentukan pengguna. Anda dapat menata ulang metode yang sedang diuji untuk menggunakan konstruktor ini. Lebih baik lagi, Anda dapat menggunakan anggota jenis yang tersedia untuk menentukan kesalahan.
Refaktor kode yang sedang diuji coba
Pertama, tentukan dua konstanta untuk pesan kesalahan di cakupan kelas. Tempatkan definisi pada kelas yang diuji, BankAccount:
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount is less than zero";
Kemudian, ubah dua pernyataan bersyarat dalam metode Debit.
if (amount > m_balance)
{
throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
}
if (amount < 0)
{
throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
}
Refaktor metode pengujian
Refaktor metode pengujian dengan menghapus panggilan ke Assert.ThrowsException. Bungkus panggilan ke Debit() dalam blok try/catch, tangkap pengecualian spesifik yang diharapkan, dan verifikasi pesan terkait. Metode Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains menyediakan kemampuan untuk membandingkan dua string.
Sekarang, Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange mungkin terlihat seperti ini:
[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = 20.0;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// Act
try
{
account.Debit(debitAmount);
}
catch (System.ArgumentOutOfRangeException e)
{
// Assert
StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
}
}
Coba lagi, tulis ulang, dan analisis ulang
Saat ini, metode pengujian tidak menangani semua kasus yang seharusnya. Jika metode di bawah pengujian, metode Debit, gagal melemparkan ArgumentOutOfRangeException ketika debitAmount lebih besar dari saldo (atau kurang dari nol), metode pengujian akan dianggap berhasil. Skenario ini tidak baik karena Anda ingin metode pengujian gagal jika tidak ada pengecualian yang dilemparkan.
Hasil ini adalah bug dalam metode pengujian. Untuk mengatasi masalah ini, tambahkan Assert.Fail tegaskan di akhir metode pengujian untuk menangani kasus di mana tidak ada pengecualian yang dilemparkan.
Menjalankan ulang pengujian menunjukkan bahwa pengujian sekarang gagal jika pengecualian yang benar tertangkap. Blok catch menangkap pengecualian, tetapi metode terus dijalankan dan gagal pada pernyataan Assert.Fail baru. Untuk mengatasi masalah ini, tambahkan pernyataan return setelah StringAssert di blok catch. Menjalankan ulang pengujian mengonfirmasi bahwa Anda telah memperbaiki masalah ini. Versi akhir Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange terlihat seperti ini:
[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = 20.0;
BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
// Act
try
{
account.Debit(debitAmount);
}
catch (System.ArgumentOutOfRangeException e)
{
// Assert
StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
return;
}
Assert.Fail("The expected exception was not thrown.");
}
Kesimpulan
Peningkatan kode pengujian menyebabkan metode pengujian yang lebih kuat dan informatif. Tetapi yang lebih penting, mereka juga meningkatkan kode yang sedang diuji.
Saran
Artikel ini menggunakan kerangka kerja pengujian unit Microsoft untuk kode terkelola. Test Explorer juga dapat menjalankan pengujian dari kerangka kerja pengujian unit pihak ketiga yang memiliki adaptor untuk Test Explorer. Untuk informasi selengkapnya, lihat Menginstal kerangka kerja pengujian unit pihak ketiga.
Konten terkait
Untuk informasi tentang cara menjalankan pengujian dari baris perintah, lihat VSTest.Console.exe opsi baris perintah.