Unit menguji pustaka F# menggunakan uji dotnet dan NUnit
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 SDK atau versi yang lebih baru.
- Editor teks atau editor kode pilihan Anda.
Membuat proyek sumber
Buka jendela shell. Buat direktori yang disebut unit-testing-with-fsharp 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 MathService . Kerangka berikut menunjukkan direktori dan struktur file sejauh ini:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Jadikan MathService sebagai direktori saat ini dan jalankan perintah berikut untuk membuat proyek sumber:
dotnet new classlib -lang "F#"
Anda membuat implementasi layanan matematika yang gagal:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Ubah direktori kembali ke direktori unit-testing-with-fsharp . Jalankan perintah berikut untuk menambahkan proyek pustaka kelas ke solusi:
dotnet sln add .\MathService\MathService.fsproj
Membuat proyek pengujian
Selanjutnya, buat direktori MathService.Tests . Kerangka berikut menunjukkan struktur direktori:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Jadikan direktori MathService.Tests sebagai direktori saat ini dan buat proyek baru menggunakan perintah berikut:
dotnet new nunit -lang "F#"
Perintah ini membuat proyek pengujian yang menggunakan NUnit sebagai kerangka kerja pengujian. Templat yang dihasilkan mengonfigurasi runner pengujian di MathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
Proyek pengujian memerlukan paket lain untuk membuat dan menjalankan pengujian unit. dotnet new
pada langkah sebelumnya menambahkan NUnit dan adaptor pengujian NUnit. Sekarang, tambahkan MathService
pustaka kelas sebagai dependensi lain ke proyek. Gunakan perintah dotnet add reference
:
dotnet add reference ../MathService/MathService.fsproj
Anda dapat melihat seluruh file di repositori sampel di GitHub.
Anda memiliki tata letak solusi akhir berikut:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathService.Tests.fsproj
Jalankan perintah berikut dalam direktori unit-testing-with-fsharp :
dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
Membuat pengujian pertama
Anda menulis satu pengujian yang gagal, membuatnya lulus, lalu mengulangi prosesnya. Buka UnitTest1.fs dan tambahkan kode berikut:
namespace MathService.Tests
open System
open NUnit.Framework
open MathService
[<TestFixture>]
type TestClass () =
[<Test>]
member this.TestMethodPassing() =
Assert.That(true, Is.True)
[<Test>]
member this.FailEveryTime() = Assert.That(false, Is.True)
Atribut [<TestFixture>]
menunjukkan kelas yang berisi pengujian. Atribut [<Test>]
menunjukkan metode pengujian yang dijalankan oleh runner pengujian. Dari direktori unit-testing-with-fsharp , jalankan dotnet test
untuk membangun pengujian dan pustaka kelas lalu jalankan 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.
Kedua pengujian ini menunjukkan tes lulus dan gagal yang paling mendasar. My test
lolos, dan Fail every time
gagal. Sekarang, buat pengujian untuk metode .squaresOfOdds
Metode mengembalikan squaresOfOdds
urutan kuadrat dari semua nilai bilangan bulat ganjil yang merupakan bagian dari urutan input. Daripada mencoba menulis semua fungsi tersebut sekaligus, Anda dapat secara berulang membuat pengujian yang memvalidasi fungsionalitas. Untuk membuat setiap lulus pengujian berarti, Anda membuat fungsionalitas yang diperlukan untuk metode tersebut.
Tes paling sederhana yang dapat Anda tulis adalah memanggil squaresOfOdds
dengan semua nomor genap, di mana hasilnya harus berupa urutan bilangan bulat kosong. Berikut adalah tes itu:
[<Test>]
member this.TestEvenSequence() =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.That(actual, Is.EqualTo(expected))
Perhatikan bahwa urutan dikonversi expected
ke daftar. Kerangka kerja NUnit bergantung pada banyak jenis .NET standar. Dependensi itu berarti bahwa antarmuka publik Anda dan hasil yang diharapkan mendukung ICollection daripada IEnumerable.
Saat menjalankan pengujian, Anda melihat bahwa pengujian Anda gagal. Itu karena Anda belum membuat implementasi. Buat lulus pengujian ini dengan menulis kode paling sederhana di kelas Library.fs di proyek MathService Anda yang berfungsi:
let squaresOfOdds xs =
Seq.empty<int>
Di direktori unit-testing-with-fsharp, jalankan dotnet test
lagi. Perintah dotnet test
menjalankan build untuk MathService
proyek lalu untuk MathService.Tests
proyek. Setelah membangun kedua proyek, ia menjalankan pengujian Anda. Dua tes lulus sekarang.
Melengkapi persyaratan
Sekarang setelah Anda membuat satu lulus ujian, saatnya untuk menulis lebih banyak. Kasus sederhana berikutnya bekerja dengan urutan yang satu-satunya angka ganjil adalah 1
. Angka 1 lebih mudah karena kuadrat 1 adalah 1. Berikut adalah tes berikutnya:
[<Test>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.That(actual, Is.EqualTo(expected))
dotnet test
Menjalankan gagal pengujian baru. Anda harus memperbarui squaresOfOdds
metode untuk menangani pengujian baru ini. Anda harus memfilter semua angka genap dari urutan untuk membuat lulus pengujian ini. Anda dapat melakukannya dengan menulis fungsi filter kecil dan menggunakan Seq.filter
:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
Ada satu langkah lagi untuk pergi: kuadrat masing-masing angka ganjil. Mulailah dengan menulis tes baru:
[<Test>]
member public this.TestSquaresOfOdds() =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.That(actual, Is.EqualTo(expected))
Anda dapat memperbaiki pengujian dengan memilah urutan yang difilter melalui operasi peta untuk menghitung kuadrat dari setiap angka ganjil:
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
Anda telah membangun pustaka kecil dan serangkaian pengujian unit untuk pustaka tersebut. Anda menyusun solusi sehingga menambahkan paket dan pengujian baru adalah bagian dari alur kerja normal. Anda memkonsentrasi sebagian besar waktu dan upaya Anda untuk menyelesaikan tujuan aplikasi.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk