Panduan: Pengembangan berbasis pengujian menggunakan Test Explorer
Buat pengujian unit untuk membantu menjaga kode Anda berfungsi dengan benar melalui perubahan kode inkremental. Ada beberapa kerangka kerja yang dapat Anda gunakan untuk menulis pengujian unit, termasuk beberapa yang dikembangkan oleh pihak ketiga. Beberapa kerangka kerja pengujian dikhususkan untuk pengujian dalam berbagai bahasa atau platform. Test Explorer menyediakan satu antarmuka untuk pengujian unit dalam salah satu kerangka kerja ini. Untuk informasi selengkapnya tentang menggunakan Test Explorer, lihat Jalankan pengujian unit dengan Test Explorer dan FAQ Test Explorer.
Panduan ini menunjukkan cara mengembangkan metode yang diuji di C# menggunakan Microsoft Test Framework (MSTest). Anda dapat dengan mudah menyesuaikannya untuk bahasa lain atau kerangka kerja pengujian lainnya, seperti NUnit. Untuk informasi selengkapnya, lihat Menginstal kerangka kerja pengujian unit pihak ketiga.
Buat pengujian dan hasilkan kode
Buat proyek Pustaka Kelas C# untuk .NET atau .NET Standard. Proyek ini akan berisi kode yang ingin kita uji. Beri nama proyek MyMath.
Dalam solusi yang sama, tambahkan proyek pengujian MSTest baru untuk .NET.
Di Visual Studio 2019 versi 16.9, nama templat proyek MSTest adalah Unit Test Project.
Beri nama proyek pengujian MathTests.
Tulis metode pengujian sederhana yang memverifikasi hasil yang diperoleh untuk input tertentu. Tambahkan kode berikut ke kelas
UnitTest1
:[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
Buat jenis dari kode pengujian.
Tempatkan kursor pada
Rooter
, lalu dari menu bola lampu, pilih Buat jenis 'Rooter'Hasilkan>jenis baru.Dalam kotak dialog Buat Jenis, atur Project ke MyMath, proyek pustaka kelas, lalu pilih OK.
Buat metode dari kode pengujian. Tempatkan kursor pada
SquareRoot
, lalu dari menu bola lampu, pilih Buat metode 'Rooter.SquareRoot’.Jalankan pengujian unit.
Buka Test Explorer.
Untuk membuka Test Explorer dari menu Uji , pilih Test Explorer.
Untuk membuka Test Explorer dari menu Uji, pilih Windows>Test Explorer.
Di Test Explorer, pilih tombol Jalankan Semua untuk menjalankan pengujian.
Solusinya dibangun, dan pengujian berjalan dan gagal.
Pilih nama pengujian.
Detail pengujian muncul di panelRingkasan Detail Pengujian.
Pilih tautan atas di bawah Stack Trace untuk melompat ke lokasi pengujian gagal.
Pada titik ini, Anda telah membuat pengujian dan stub yang dapat Anda ubah sehingga pengujian lolos.
Verifikasi perubahan kode
Dalam file Class1.cs, tingkatkan kode
SquareRoot
:public double SquareRoot(double input) { return input / 2; }
Di Test Explorer, pilih Jalankan Semua.
Solusinya dibangun, dan pengujian berjalan dan gagal.
Perluas rentang input
Untuk meningkatkan kepercayaan diri kami bahwa kode berfungsi dalam semua kasus, tambahkan pengujian yang mencoba berbagai nilai input yang lebih luas.
Tip
Hindari mengubah pengujian yang ada yang lulus. Sebagai gantinya, tambahkan pengujian baru. Ubah pengujian yang ada hanya saat persyaratan pengguna berubah. Kebijakan ini membantu memastikan bahwa Anda tidak kehilangan fungsionalitas yang ada saat Anda bekerja untuk memperluas kode.
Di kelas pengujian, tambahkan pengujian berikut, yang mencoba berbagai nilai input:
[TestMethod] public void RooterValueRange() { // Create an instance to test. Rooter rooter = new Rooter(); // Try a range of values. for (double expected = 1e-8; expected < 1e+8; expected *= 3.2) { RooterOneValue(rooter, expected); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
Di Test Explorer, pilih Jalankan Semua.
Tes baru gagal (meskipun tes pertama masih lolos). Untuk menemukan titik kegagalan, pilih pengujian yang gagal, lalu lihat detail di panel Ringkasan Detail Pengujian.
Periksa metode yang sedang diuji untuk melihat apa yang mungkin salah. Ubah
SquareRoot
kode sebagai berikut:public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
Di Test Explorer, pilih Jalankan Semua.
Kedua tes sekarang lulus.
Tambahkan pengujian untuk kasus luar biasa
Tambahkan pengujian baru untuk input negatif:
[TestMethod] public void RooterTestNegativeInput() { Rooter rooter = new Rooter(); Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1)); }
Di Test Explorer, pilih Jalankan Semua.
Metode di bawah perulangan pengujian dan harus dibatalkan secara manual.
Pilih Batal pada toolbar Test Explorer.
Tes berhenti dieksekusi.
SquareRoot
Perbaiki kode dengan menambahkan pernyataan berikutif
di awal metode:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
Di Test Explorer, pilih Jalankan Semua.
Semua tes lulus.
Refaktor kode yang sedang diuji
Refaktor kode, tetapi jangan ubah pengujian.
Tip
Refaktor adalah perubahan yang dimaksudkan untuk membuat kode berkinerja lebih baik atau lebih mudah dipahami. Ini tidak dimaksudkan untuk mengubah perilaku kode, dan oleh karena itu pengujian tidak diubah.
Kami menyarankan agar Anda melakukan langkah-langkah pemfaktoran ulang secara terpisah dari langkah-langkah yang memperluas fungsionalitas. Menjaga pengujian tetap tidak berubah memberi Anda keyakinan bahwa Anda belum secara tidak sengaja memperkenalkan bug saat merefaktor.
Ubah baris yang menghitung
result
dalamSquareRoot
metode sebagai berikut:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; }
Pilih Jalankan Semua, dan verifikasi bahwa semua pengujian masih lulus.