Bagikan melalui


Pengujian unit C# dengan MSTest dan .NET

Tutorial ini membawa Anda melalui pengalaman interaktif membangun solusi sampel langkah demi langkah untuk mempelajari konsep pengujian unit. Jika Anda lebih suka mengikuti tutorial menggunakan solusi bawaan, lihat atau unduh kode sampel sebelum Anda mulai. Untuk petunjuk pengunduhan, lihat Sampel dan Tutorial.

Artikel ini berisi tentang menguji proyek .NET Core. Jika Anda menguji proyek ASP.NET Core, lihat Pengujian integrasi di ASP.NET Core.

Prasyarat

Membuat proyek sumber

Buka jendela shell. Buat direktori yang disebut unit-testing-using-mstest untuk menahan solusi. Di dalam direktori baru ini, jalankan dotnet new sln untuk membuat file solusi baru untuk pustaka kelas dan proyek pengujian. Buat direktori PrimeService . Kerangka berikut menunjukkan direktori dan struktur file sejauh ini:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService

Jadikan PrimeService sebagai direktori saat ini dan jalankan dotnet new classlib untuk membuat proyek sumber. Ganti nama Class1.cs menjadi PrimeService.cs. Ganti kode dalam file dengan kode berikut untuk membuat implementasi kelas yang PrimeService gagal:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Ubah direktori kembali ke direktori unit-testing-using-mstest . Jalankan dotnet sln add untuk menambahkan proyek pustaka kelas ke solusi:

dotnet sln add PrimeService/PrimeService.csproj

Membuat proyek pengujian

Buat direktori PrimeService.Tests. Kerangka berikut menunjukkan struktur direktori:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Jadikan direktori PrimeService.Tests sebagai direktori saat ini dan buat proyek baru menggunakan dotnet new mstest. Perintah baru dotnet membuat proyek pengujian yang menggunakan MSTest sebagai pustaka pengujian. Templat mengonfigurasi runner pengujian dalam file PrimeServiceTests.csproj :

<ItemGroup>
  <PackageReference Include="MSTest" Version="3.2.0" />
  <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>

Proyek pengujian memerlukan paket lain untuk membuat dan menjalankan pengujian unit. dotnet new pada langkah sebelumnya menambahkan paket dan alat MSTest yang diperlukan untuk pelaporan cakupan kode.

PrimeService Tambahkan pustaka kelas sebagai dependensi lain ke proyek. Gunakan perintah dotnet add reference:

dotnet add reference ../PrimeService/PrimeService.csproj

Anda dapat melihat seluruh file di repositori sampel di GitHub.

Kerangka berikut menunjukkan tata letak solusi akhir:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

Ubah ke direktori unit-testing-using-mstest , dan jalankan dotnet sln add:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Membuat pengujian pertama

Tulis pengujian yang gagal, jadikan lulus, lalu ulangi prosesnya. Hapus UnitTest1.cs dari direktori PrimeService.Tests dan buat file C# baru bernama PrimeService_IsPrimeShould.cs dengan konten berikut:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestClass]
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            bool result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 should not be prime");
        }
    }
}

Atribut TestClass menunjukkan kelas yang berisi pengujian unit. Atribut TestMethod menunjukkan metode adalah metode pengujian.

Simpan file ini dan jalankan dotnet test untuk membangun pengujian dan pustaka kelas lalu jalankan pengujian. Runner uji MSTest berisi titik masuk program untuk menjalankan pengujian Anda. dotnet test memulai runner pengujian menggunakan proyek pengujian unit yang telah Anda buat.

Tes anda gagal. Anda belum membuat implementasi. Buat lulus pengujian ini dengan menulis kode paling sederhana di PrimeService kelas yang berfungsi:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

Di direktori unit-testing-using-mstest, jalankan dotnet test lagi. Perintah dotnet test menjalankan build untuk PrimeService proyek lalu untuk PrimeService.Tests proyek. Setelah membangun kedua proyek, ia menjalankan pengujian tunggal ini. Itu lewat.

Menambahkan lebih banyak fitur

Sekarang setelah Anda membuat satu lulus ujian, saatnya untuk menulis lebih banyak. Ada beberapa kasus sederhana lainnya untuk bilangan prima: 0, -1. Anda dapat menambahkan pengujian baru dengan atribut TestMethod, tetapi itu dengan cepat menjadi melelahkan. Ada atribut MSTest lainnya yang memungkinkan Anda menulis serangkaian pengujian serupa. Metode pengujian dapat menjalankan kode yang sama tetapi memiliki argumen input yang berbeda. Anda dapat menggunakan atribut DataRow untuk menentukan nilai untuk input tersebut.

Alih-alih membuat pengujian baru, terapkan kedua atribut ini untuk membuat satu pengujian berbasis data. Pengujian berbasis data adalah metode yang menguji beberapa nilai kurang dari dua, yang merupakan angka utama terendah. Tambahkan metode pengujian baru di PrimeService_IsPrimeShould.cs:

[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService.IsPrime(value);

    Assert.IsFalse(result, $"{value} should not be prime");
}

Jalankan dotnet test, dan dua pengujian ini gagal. Untuk membuat semua tes lulus, ubah if klausul di awal IsPrime metode dalam file PrimeService.cs :

if (candidate < 2)

Lanjutkan iterasi dengan menambahkan lebih banyak tes, lebih banyak teori, dan lebih banyak kode di pustaka utama. Anda memiliki versi pengujian yang sudah selesai dan implementasi lengkap pustaka.

Anda telah membangun pustaka kecil dan serangkaian pengujian unit untuk pustaka tersebut. Anda telah menyusun solusi sehingga menambahkan paket dan pengujian baru adalah bagian dari alur kerja normal. Anda telah memkonsentasikan sebagian besar waktu dan upaya Anda untuk menyelesaikan tujuan aplikasi.

Lihat juga