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

  1. Buat proyek Pustaka Kelas C# untuk .NET atau .NET Standard. Proyek ini akan berisi kode yang ingin kita uji. Beri nama proyek MyMath.

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

    New code and test projects

    New code and test projects

  3. 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);
    }
    
  4. Buat jenis dari kode pengujian.

    1. Tempatkan kursor pada Rooter, lalu dari menu bola lampu, pilih Buat jenis 'Rooter'Hasilkan>jenis baru.

      Generate new type quick action

      Generate new type quick action

    2. Dalam kotak dialog Buat Jenis, atur Project ke MyMath, proyek pustaka kelas, lalu pilih OK.

      Generate Type dialog box in Visual Studio 2019

      Generate Type dialog box in Visual Studio 2019

  5. Buat metode dari kode pengujian. Tempatkan kursor pada SquareRoot, lalu dari menu bola lampu, pilih Buat metode 'Rooter.SquareRoot’.

  6. Jalankan pengujian unit.

    1. Buka Test Explorer.

      Untuk membuka Test Explorer dari menu Uji , pilih Test Explorer.

      Untuk membuka Test Explorer dari menu Uji, pilih Windows>Test Explorer.

    2. Di Test Explorer, pilih tombol Jalankan Semua untuk menjalankan pengujian.

    Solusinya dibangun, dan pengujian berjalan dan gagal.

  7. Pilih nama pengujian.

    Detail pengujian muncul di panelRingkasan Detail Pengujian.

    Test Detail Summary in Test Explorer

    Test Detail Summary in Test Explorer

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

  1. Dalam file Class1.cs, tingkatkan kodeSquareRoot:

    public double SquareRoot(double input)
    {
        return input / 2;
    }
    
  2. Di Test Explorer, pilih Jalankan Semua.

    Solusinya dibangun, dan pengujian berjalan dan gagal.

    Test Explorer showing a passing test

    Test Explorer showing a passing test

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.

  1. 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);
    }
    
  2. 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.

  3. 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;
    }
    
  4. Di Test Explorer, pilih Jalankan Semua.

    Kedua tes sekarang lulus.

Tambahkan pengujian untuk kasus luar biasa

  1. Tambahkan pengujian baru untuk input negatif:

    [TestMethod]
    public void RooterTestNegativeInput()
    {
        Rooter rooter = new Rooter();
        Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1));
    }
    
  2. Di Test Explorer, pilih Jalankan Semua.

    Metode di bawah perulangan pengujian dan harus dibatalkan secara manual.

  3. Pilih Batal pada toolbar Test Explorer.

    Tes berhenti dieksekusi.

  4. SquareRoot Perbaiki kode dengan menambahkan pernyataan berikut if di awal metode:

    public double SquareRoot(double input)
    {
        if (input <= 0.0)
        {
            throw new ArgumentOutOfRangeException();
        }
        ...
    
  5. 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.

  1. Ubah baris yang menghitung result dalam SquareRoot 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;
    }
    
  2. Pilih Jalankan Semua, dan verifikasi bahwa semua pengujian masih lulus.

    Test Explorer showing 3 passed tests

    Test Explorer showing 3 passed tests