Bagikan melalui


Mulai menggunakan F# dan MSTest

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.

Membuat proyek sumber

Buka jendela shell. Buat direktori bernama unit-testing-with-fsharp untuk menyimpan solusi tersebut. 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 mstest -lang "F#". Ini membuat proyek pengujian yang menggunakan MSTest sebagai kerangka kerja pengujian. Template yang dihasilkan mengonfigurasi test runner dalam MathServiceTests.fsproj:

<ItemGroup>
  <PackageReference Include="MSTest" Version="4.1.0" />
</ItemGroup>

Proyek pengujian memerlukan paket lain untuk membuat dan menjalankan pengujian unit. dotnet new pada langkah sebelumnya menambahkan MSTest. Sekarang, tambahkan pustaka kelas MathService sebagai dependensi lain ke proyek. Gunakan perintah dotnet reference add:

dotnet reference add ../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.fsproj dalam 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:

namespace MathService.Tests

open System
open Microsoft.VisualStudio.TestTools.UnitTesting
open MathService

[<TestClass>]
type TestClass () =

    [<TestMethod>]
    member this.TestMethodPassing() =
        Assert.IsTrue(true)

    [<TestMethod>]
     member this.FailEveryTime() = Assert.IsTrue(false)

Atribut [<TestClass>] menunjukkan kelas yang berisi pengujian. Atribut [<TestMethod>] menunjukkan metode pengujian yang dijalankan oleh pelari uji. Dari direktori unit-testing-with-fsharp, jalankan dotnet test untuk membangun pengujian dan pustaka kelas, kemudian jalankan pengujiannya. Pengelola uji MSTest berisi titik masuk program untuk menjalankan pengujian Anda. dotnet test menjalankan test runner menggunakan proyek pengujian unit yang telah Anda buat.

Dua tes ini menunjukkan tes yang paling dasar yang berhasil dan gagal. My test lulus, dan Fail every time gagal. Sekarang, buatlah sebuah pengujian untuk metode squaresOfOdds. Metode mengembalikan squaresOfOdds daftar kuadrat dari semua nilai bilangan bulat ganjil yang merupakan bagian dari urutan input. Daripada mencoba menulis semua fungsi tersebut sekaligus, Anda dapat secara bertahap membuat tes yang memvalidasi fungsionalitasnya. Mengembangkan fungsi yang diperlukan untuk metode berarti setiap pengujian lulus.

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

[<TestMethod>]
member this.TestEvenSequence() =
    let expected = Seq.empty<int> |> Seq.toList
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.AreEqual(expected, actual)

Perhatikan bahwa expected urutan telah dikonversi ke daftar. Pustaka MSTest bergantung pada banyak jenis .NET standar. Ketergantungan itu berarti bahwa antarmuka publik dan hasil yang diharapkan mendukung ICollection daripada IEnumerable.

Ketika Anda menjalankan tes, Anda melihat bahwa tes Anda gagal. Anda belum membuat implementasi. Buat lulus pengujian ini dengan menulis kode paling sederhana di kelas Mathservice yang berfungsi:

let squaresOfOdds xs =
    Seq.empty<int> |> Seq.toList

Di direktori unit-testing-with-fsharp, jalankan dotnet test lagi. Perintah dotnet test menjalankan build untuk proyek MathService lalu untuk proyek MathService.Tests. Setelah membangun kedua proyek, sistem menjalankan pengujian tunggal ini. Ini berlalu.

Menyelesaikan persyaratan

Sekarang setelah Anda menyelesaikan satu kali uji coba, saatnya menulis lebih banyak. Kasus sederhana berikutnya bekerja dengan urutan yang hanya memiliki satu angka ganjil yaitu 1. Angka 1 lebih mudah karena kuadrat dari 1 adalah 1. Inilah tes berikutnya:

[<TestMethod>]
member public this.TestOnesAndEvens() =
    let expected = [1; 1; 1; 1]
    let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
    Assert.AreEqual(expected, actual)

Menjalankan dotnet test gagal dalam uji baru. Anda harus memperbarui squaresOfOdds metode untuk menangani pengujian baru ini. Anda harus menyaring semua angka genap dari urutan tersebut agar tes ini berhasil. 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 |> Seq.toList

Perhatikan panggilan ke Seq.toList. Itu membuat daftar, yang mengimplementasikan antarmuka ICollection.

Masih ada satu langkah lagi: kuadratkan masing-masing bilangan ganjil. Mulailah dengan menulis tes baru:

[<TestMethod>]
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.AreEqual(expected, actual)

Anda dapat memperbaiki tes dengan melewatkan urutan yang sudah difilter melalui operasi peta untuk menghitung kuadrat dari setiap bilangan ganjil.

let private square x = x * x
let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd
    |> Seq.map square
    |> Seq.toList

Anda telah membangun perpustakaan kecil dan serangkaian unit pengujian untuk perpustakaan 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