Bagikan melalui


Pengujian unit C# dengan NUnit dan .NET Core

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 yang sudah dibangun, lihat atau unduh kode sampel sebelum memulai. 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 bernama unit-testing-using-nunit untuk menyimpan solusi. Di dalam direktori baru ini, jalankan perintah berikut untuk membuat file solusi baru untuk pustaka kelas dan proyek pengujian:

dotnet new sln

Selanjutnya, buat direktori PrimeService. Kerangka berikut menunjukkan direktori dan struktur file sejauh ini:

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

Jadikan PrimeService sebagai direktori aktif dan jalankan perintah berikut untuk membuat proyek sumber:

dotnet new classlib

Ganti nama Class1.cs menjadi PrimeService.cs. Anda membuat implementasi yang gagal dari kelas PrimeService:

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-nunit. Jalankan perintah berikut untuk menambahkan proyek pustaka kelas ke solusi:

dotnet sln add PrimeService/PrimeService.csproj

Membuat proyek pengujian

Selanjutnya, buat direktori PrimeService.Tests. Kerangka berikut menunjukkan struktur direktori:

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

Jadikan direktori PrimeService.Tests sebagai direktori saat ini dan buat proyek baru menggunakan perintah berikut:

dotnet new nunit

Perintah dotnet new membuat proyek pengujian yang menggunakan NUnit sebagai pustaka pengujian. Template yang dihasilkan mengonfigurasi pemeriksa uji di dalam file PrimeService.Tests.csproj

<ItemGroup>
  <PackageReference Include="nunit" Version="4.3.2" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
  <PackageReference Include="NUnit.Analyzers" Version="4.9.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Nota

Sebelum .NET 9, kode yang dihasilkan dapat mereferensikan versi kerangka kerja pengujian NUnit yang lebih lama. Anda dapat menggunakan CLI dotnet untuk memperbarui paket. Sebagai alternatif, buka file PrimeService.Tests.csproj dan gantikan konten grup item referensi paket dengan kode di atas.

Proyek pengujian memerlukan paket lain untuk membuat dan menjalankan pengujian unit. dotnet new Perintah pada langkah sebelumnya menambahkan Microsoft test SDK, kerangka kerja pengujian NUnit, dan adaptor pengujian NUnit. Sekarang, tambahkan pustaka kelas PrimeService sebagai dependensi lain ke proyek. Gunakan perintah dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.csproj

Anda dapat melihat seluruh file di repositori sampel di GitHub.

Kerangka berikut menunjukkan tata letak solusi akhir:

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

Jalankan perintah berikut di direktori unit-testing-using-nunit:

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

Membuat pengujian pertama

Anda menulis satu pengujian yang gagal, membuatnya lulus, lalu mengulangi prosesnya. Dalam direktori PrimeService.Tests, ganti nama file UnitTest1.cs menjadi PrimeService_IsPrimeShould.cs dan ganti seluruh isinya dengan kode berikut:

using NUnit.Framework;
using Prime.Services;

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

        [SetUp]
        public void SetUp()
        {
            _primeService = new PrimeService();
        }

        [Test]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            Assert.That(result, Is.False, "1 should not be prime");
        }
    }
}

Atribut [TestFixture] menandakan kelas yang berisi tes unit. Atribut [Test] menunjukkan metode adalah metode pengujian.

Simpan file ini dan jalankan perintah dotnet test untuk membangun pengujian dan pustaka kelas serta menjalankan pengujian. Program runner pengujian NUnit berisi titik masuk untuk menjalankan pengujian Anda. dotnet test menjalankan test runner menggunakan proyek pengujian unit yang telah Anda buat.

Tes anda gagal. Anda belum membuat implementasi. Buat tes berhasil dengan menulis kode paling sederhana di kelas PrimeService 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-nunit, jalankan dotnet test lagi. Perintah dotnet test menjalankan build untuk proyek PrimeService lalu untuk proyek PrimeService.Tests. Setelah Anda membangun kedua proyek, menjalankan pengujian tunggal. Ini berlalu.

Menambahkan lebih banyak fitur

Sekarang setelah Anda menyelesaikan satu kali uji coba, saatnya menulis lebih banyak. Ada beberapa kasus sederhana lainnya untuk bilangan prima: 0, -1. Anda dapat menambahkan pengujian baru dengan atribut [Test], tetapi itu dengan cepat menjadi melelahkan. Ada atribut NUnit lain yang memungkinkan Anda menulis serangkaian pengujian serupa. Atribut [TestCase] digunakan untuk membuat serangkaian pengujian yang menjalankan kode yang sama tetapi memiliki argumen input yang berbeda. Anda dapat menggunakan atribut [TestCase] untuk menentukan nilai untuk input tersebut.

Alih-alih membuat pengujian baru, terapkan 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:

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

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

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

if (candidate < 2)

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

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