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 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
- .NET 8.0 atau versi yang lebih baru.
- Editor teks atau editor kode pilihan Anda.
Membuat proyek sumber
Buka jendela shell. Buat direktori yang disebut unit-testing-using-nunit untuk menahan 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 saat ini dan jalankan perintah berikut untuk membuat proyek sumber:
dotnet new classlib
Ganti nama Class1.cs menjadi PrimeService.cs. Anda 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-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 baru dotnet membuat proyek pengujian yang menggunakan NUnit sebagai pustaka pengujian. Templat yang dihasilkan mengonfigurasi runner pengujian di file PrimeService.Tests.csproj :
<ItemGroup>
<PackageReference Include="nunit" Version="4.2.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="NUnit.Analyzers" Version="4.3.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
Catatan
Sebelum .NET 9, kode yang dihasilkan dapat mereferensikan versi kerangka kerja pengujian NUnit yang lebih lama. Anda dapat menggunakan dotnet CLI untuk memperbarui paket. Atau, buka file PrimeService.Tests.csproj dan ganti 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 PrimeService
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-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. Di direktori PrimeService.Tests, ganti nama file UnitTest1.cs menjadi PrimeService_IsPrimeShould.cs dan ganti seluruh kontennya 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]
menunjukkan kelas yang berisi pengujian unit. Atribut [Test]
menunjukkan metode adalah metode pengujian.
Simpan file ini dan jalankan dotnet test
perintah untuk membangun pengujian dan pustaka kelas dan menjalankan pengujian. Runner pengujian NUnit 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 uji lulus 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-nunit, jalankan dotnet test
lagi. Perintah dotnet test
menjalankan build untuk PrimeService
proyek lalu untuk PrimeService.Tests
proyek. Setelah Anda membangun kedua proyek, ia menjalankan satu pengujian 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 [Test]
atribut , 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 [TestCase]
atribut 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 if
klausul di awal Main
metode dalam file PrimeService.cs :
if (candidate < 2)
Lanjutkan iterasi dengan menambahkan lebih banyak pengujian, teori, dan 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 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.