Aracılığıyla paylaş


Dotnet test ve MSTest kullanarak F# kitaplıklarının birim testleri .NET Core'da yapılabilir.

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'i geçerli dizin yapın ve dotnet new classlib -lang "F#" komutunu çalıştırarak kaynak projeyi oluşturun. 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 mstest -lang "F#"yeni bir proje oluşturun. Bu, test çerçevesi olarak MSTest 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="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>

Test projesi, birim testleri oluşturmak ve çalıştırmak için başka paketler gerektirir. dotnet new MSTest, önceki adımda 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

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:

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)

özniteliği, [<TestClass>] testleri içeren bir sınıfı belirtir. özniteliği, [<TestMethod>] test çalıştırıcısı tarafından çalıştırılan bir test yöntemini belirtir. Unit-testing-with-fsharp dizininden testleri ve sınıf kitaplığını derlemek ve ardından testleri çalıştırmak için dotnet test komutunu çalıştırın. MSTest 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 listesini 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:

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

Dizinin expected listeye dönüştürüldüğüne dikkat edin. MSTest kitaplığı birçok standart .NET türüne dayanır. Bu bağımlılık, ortak arabiriminizin ve beklenen sonuçların ICollection yerine IEnumerable desteklediği anlamına gelir.

Testi çalıştırdığınızda, testinizin başarısız olduğunu görürsünüz. 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> |> Seq.toList

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:

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

dotnet test Yürütme işlemi yeni testte başarısız oluyor. Bu yeni testi işlemek için squaresOfOdds yöntemini güncellemelisiniz. Bu testin başarılı olması için çift sayıların tümünü sıralama dışında filtrelemeniz gerekir. 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 |> Seq.toList

çağrısına Seq.toListdikkat edin. Bu, ICollection arabirimini uygulayan bir liste oluşturur.

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

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

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
    |> Seq.toList

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.