Aracılığıyla paylaş


.NET Core üzerinde f# kitaplıklarının birim testi için dotnet test ve xUnit kullanma

Bu öğretici, birim testi kavramlarını öğrenmek için adım adım örnek bir çözüm oluştururken sizi etkileşimli bir deneyime götürür. Öğreticiyi önceden oluşturulmuş bir çözüm kullanarak izlemeyi tercih ediyorsanız, başlamadan önce örnek kodu görüntüleyin veya indirin. İndirme yönergeleri için bkz. Örnekler ve Öğreticiler.

Bu makale bir .NET Core projelerini test etme hakkındadır. bir ASP.NET Core projesini test ediyorsanız bkz. ASP.NET CoreTümleştirme testleri.

Kaynak projeyi oluşturma

Bir kabuk penceresi açın. Çözümü tutmak için unit-testing-with-fsharp adlı bir dizin oluşturun. Yeni bir çözüm oluşturmak için bu yeni dizinin içinde dotnet new sln çalıştırın. Bu, hem sınıf kitaplığını hem de birim testi projesini yönetmeyi kolaylaştırır. Çözüm dizininde bir MathService dizini oluşturun. Şu ana kadarki dizin ve dosya yapısı aşağıda gösterilmiştir:

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

MathService dizinini geçerli yapın ve kaynak projeyi oluşturmak için dotnet new classlib -lang "F#" komutunu çalıştırın. Matematik hizmetinin başarısız bir uygulamasını oluşturacaksınız:

module MyMath =
    let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))

Dizini yeniden unit-testing-with-fsharp dizinine değiştirin. Sınıf kitaplığı projesini çözüme eklemek için dotnet sln add .\MathService\MathService.fsproj çalıştırın.

Test projesi oluşturma

Ardından MathService.Tests dizinini oluşturun. Aşağıdaki ana hat dizin yapısını gösterir:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService
        Source Files
        MathService.fsproj
    /MathService.Tests

MathService.Tests dizinini geçerli dizin yapın ve kullanarak dotnet new xunit -lang "F#"yeni bir proje oluşturun. Bu, test kitaplığı olarak xUnit kullanan bir test projesi oluşturur. Oluşturulan şablon MathServiceTests.fsproj dosyasında test çalıştırıcısını yapılandırıyor:

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

Test projesi, birim testleri oluşturmak ve çalıştırmak için başka paketler gerektirir. dotnet new önceki adımda xUnit ve xUnit çalıştırıcısı eklendi. Şimdi MathService sınıf kitaplığını projeye başka bir bağımlılık olarak ekleyin. dotnet reference add komutunu kullanın:

dotnet reference add ../MathService/MathService.fsproj

Tavsiye

.NET 9 SDK veya önceki bir sürüm kullanıyorsanız bunun yerine "önce fiil" formunu (dotnet add reference) kullanın. "önce isim" formu .NET 10'da tanıtıldı.

Dosyanın tamamını GitHub'daki örnekleri deposunda görebilirsiniz.

Aşağıdaki son çözüm düzenine sahipsiniz:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService
        Source Files
        MathService.fsproj
    /MathService.Tests
        Test Source Files
        MathServiceTests.fsproj

dotnet sln add .\MathService.Tests\MathService.Tests.fsproj komutunu unit-testing-with-fsharp dizininde çalıştırın.

İlk testi oluşturma

Başarısız bir test yazar, başarılı olur ve işlemi tekrarlarsınız. Tests.fs dosyasını açın ve aşağıdaki kodu ekleyin:

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

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

özniteliği, [<Fact>] test çalıştırıcısı tarafından çalıştırılan bir test yöntemini belirtir. Unit-testing-with-fsharp'tan, testleri ve sınıf kitaplığını oluşturmak için dotnet test komutunu yürütün ve ardından testleri çalıştırın. xUnit test çalıştırıcısı, testlerinizi çalıştırmak için program giriş noktasını içerir. dotnet test oluşturduğunuz birim testi projesini kullanarak test çalıştırıcısını başlatır.

Bu iki test en temel geçiş ve başarısız testleri gösterir. My test geçer ve Fail every time başarısız olur. Şimdi squaresOfOdds yöntemi için bir test oluşturun. yöntemi, squaresOfOdds giriş dizisinin parçası olan tüm tek tamsayı değerlerinin karelerinin bir dizisini döndürür. Bu işlevlerin tümünü aynı anda yazmaya çalışmak yerine, işlevselliği doğrulayan testleri yinelemeli olarak oluşturabilirsiniz. Her test geçişinin yapılması, yöntem için gerekli işlevselliğin oluşturulması anlamına gelir.

Yazabileceğimiz en basit test, tüm çift sayıları squaresOfOdds ile çağırmak ve sonucun boş bir tamsayı dizisi olmasını beklemektir. Bu test şu şekildedir:

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

Testiniz başarısız oluyor. Uygulamayı henüz oluşturmadınız. Çalışan MathService sınıfında en basit kodu yazarak bu testi geçirin:

let squaresOfOdds xs =
    Seq.empty<int>

Unit-testing-with-fsharp dizininde yeniden çalıştırındotnet test. dotnet test komutu, MathService projesi ve ardından MathService.Tests projesi için bir derleme çalıştırır. Her iki projeyi de derledikten sonra bu tek testi çalıştırır. Geçiyor.

Gereksinimleri tamamlama

İlk testi başarıyla geçtiğinize göre, şimdi daha fazla test yazmanın zamanı geldi. Sonraki basit durum, tek sayısı sadece 1 olan bir diziyle çalışır. 1 sayısı daha kolaydır çünkü 1'in karesi 1'dir. Sonraki test şu şekildedir:

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

Çalıştırmak dotnet test testlerinizi çalıştırır ve yeni testin başarısız olduğunu gösterir. Şimdi bu yeni testi işlemek için yöntemini güncelleştirin squaresOfOdds . Bu testin başarılı olması için tüm çift sayıları diziden çıkarırsınız. Bunu yapmak için küçük bir filtre işlevi yazıp komutunu kullanabilirsiniz Seq.filter:

let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd

Yapılacak bir adım daha var: Tek sayıların her birinin karesini alın. Yeni bir test yazarak başlayın:

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

Her bir tek sayının karesini hesaplamak için filtrelenmiş diziyi bir haritalama işlemi aracılığıyla ileterek testi düzeltebilirsiniz.

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

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

Küçük bir kitaplık ve bu kitaplık için bir dizi birim testi oluşturdunuz. Çözümü, yeni paket ve test ekleme işleminin normal iş akışının bir parçası olacak şekilde yapılandırdıysanız. Zamanınızın ve çabanızın çoğunu uygulamanın hedeflerini çözmeye yoğunlaştırmışsınız.

Ayrıca bkz.