Dotnet test ve xUnit kullanarak .NET Core'da birim testi F# kitaplıkları

Bu öğreticide, birim testi kavramlarını öğrenmek için adım adım örnek bir çözüm oluşturma etkileşimli bir deneyime geçilir. Önceden oluşturulmuş bir çözüm kullanarak öğreticiyi 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. ASP.NET Core projesini test ediyorsanız bkz . ASP.NET Core'da tü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. Bu yeni dizinin içinde komutunu çalıştırarak dotnet new sln yeni bir çözüm oluşturun. 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'i geçerli dizin yapın ve kaynak projeyi oluşturmak için komutunu çalıştırındotnet new classlib -lang "F#". 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 komutunu çalıştırın dotnet sln add .\MathService\MathService.fsproj .

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, sınıf kitaplığını MathService projeye başka bir bağımlılık olarak ekleyin. dotnet add reference Komutunu kullanın:

dotnet add reference ../MathService/MathService.fsproj

Dosyanın tamamını GitHub'daki örnek 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

Unit-testing-with-fsharp dizininde yürütürdotnet sln add .\MathService.Tests\MathService.Tests.fsproj.

İ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 komutunu yürütür dotnet test ve ardından testleri çalıştırır. 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 yöntemi için squaresOfOdds 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.

Yazabildiğimiz en basit test, sonucun boş bir tamsayı dizisi olması gereken tüm çift sayılarla çağırmaktır squaresOfOdds . 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. Sınıfında çalışan en basit kodu MathService yazarak bu testi geçirin:

let squaresOfOdds xs =
    Seq.empty<int>

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

Gereksinimleri tamamlama

Artık bir test geçişi yaptığınıza göre, daha fazla yazmanın zamanı geldi. Sonraki basit durum, tek sayı 1olan 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)

Yürütme, 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ı dizi dışında filtrelersiniz. 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

Atacak bir adım daha var: tek sayıların her birini karekökle. 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 bir eşleme işlemi aracılığıyla filtrelenmiş diziyi borulayarak 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

Bu kitaplık için küçük bir kitaplık ve 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.