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ı 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)
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin