Bagikan melalui


Unit menguji pustaka F# di .NET Core menggunakan pengujian dotnet dan xUnit

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.

Membuat proyek sumber

Buka jendela shell. Buat direktori yang disebut unit-testing-with-fsharp untuk menahan solusi. Di dalam direktori baru ini, jalankan dotnet new sln untuk membuat solusi baru. Ini membuatnya lebih mudah untuk mengelola pustaka kelas dan proyek pengujian unit. Di dalam direktori solusi, buat direktori MathService . Direktori dan struktur file sejauh ini ditunjukkan di bawah ini:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService

Jadikan MathService sebagai direktori saat ini, dan jalankan dotnet new classlib -lang "F#" untuk membuat proyek sumber. Anda akan 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 dotnet sln add .\MathService\MathService.fsproj untuk menambahkan proyek pustaka kelas ke solusi.

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 dotnet new xunit -lang "F#". Ini membuat proyek pengujian yang menggunakan xUnit sebagai pustaka pengujian. Templat yang dihasilkan mengonfigurasi runner pengujian di MathServiceTests.fsproj:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
  <PackageReference Include="xunit" Version="2.2.0" />
  <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>

Proyek pengujian memerlukan paket lain untuk membuat dan menjalankan pengujian unit. dotnet new pada langkah sebelumnya menambahkan xUnit dan runner xUnit. 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
        MathServiceTests.fsproj

Jalankan dotnet sln add .\MathService.Tests\MathService.Tests.fsprojdalam direktori unit-testing-with-fsharp .

Membuat pengujian pertama

Anda menulis satu pengujian yang gagal, membuatnya lulus, lalu mengulangi prosesnya. Buka Tests.fs dan tambahkan kode berikut:

[<Fact>]
let ``My test`` () =
    Assert.True(true)

[<Fact>]
let ``Fail every time`` () = Assert.True(false)

Atribut [<Fact>] menunjukkan metode pengujian yang dijalankan oleh runner pengujian. Dari unit-testing-with-fsharp, jalankan dotnet test untuk membangun pengujian dan pustaka kelas lalu jalankan pengujian. Runner pengujian xUnit 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. Membuat setiap lulus pengujian berarti membuat fungsionalitas yang diperlukan untuk metode .

Tes paling sederhana yang dapat kita tulis adalah memanggil squaresOfOdds dengan semua nomor genap, di mana hasilnya harus berupa urutan bilangan bulat yang kosong. Berikut adalah tes itu:

[<Fact>]
let ``Sequence of Evens returns empty collection`` () =
    let expected = Seq.empty<int>
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)

Tes anda gagal. Anda belum membuat implementasi. Buat lulus pengujian ini dengan menulis kode paling sederhana di MathService kelas 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 tunggal ini. Itu lewat.

Menyelesaikan 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:

[<Fact>]
let ``Sequences of Ones and Evens returns Ones`` () =
    let expected = [1; 1; 1; 1]
    let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
    Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)

dotnet test Menjalankan menjalankan pengujian Anda dan menunjukkan bahwa pengujian baru gagal. Sekarang, perbarui squaresOfOdds metode untuk menangani pengujian baru ini. Anda 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:

[<Fact>]
let ``SquaresOfOdds works`` () =
    let expected = [1; 9; 25; 49; 81]
    let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
    Assert.Equal(expected, actual)

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