Dotnet test ve xUnit kullanarak Visual Basic .NET Core kitaplıklarını birim testi

Bu öğreticide birim testi projesi ve kitaplık projesi içeren bir çözümün nasıl derlenmesi gösterilmektedir. Önceden oluşturulmuş bir çözümü kullanarak öğreticiyi izlemek için örnek kodu görüntüleyin veya indirin. İndirme yönergeleri için bkz . Örnekler ve Öğreticiler.

Çözümü oluşturma

Bu bölümde, kaynak ve test projelerini içeren bir çözüm oluşturulur. Tamamlanan çözüm aşağıdaki dizin yapısına sahiptir:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.vb
        PrimeService.vbproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.vb
        PrimeServiceTests.vbproj

Aşağıdaki yönergeler test çözümünü oluşturma adımlarını sağlar. Bir adımda test çözümü oluşturma yönergeleri için bkz. Test çözümü oluşturma komutları.

  • Bir kabuk penceresi açın.

  • Şu komutu çalıştırın:

    dotnet new sln -o unit-testing-using-dotnet-test
    

    komutu unit-testing-using-dotnet-test dotnet new sln dizininde yeni bir çözüm oluşturur.

  • Dizini unit-testing-using-dotnet-test klasörüne değiştirin.

  • Şu komutu çalıştırın:

    dotnet new classlib -o PrimeService --lang VB
    

    komutu, dotnet new classlib PrimeService klasöründe yeni bir sınıf kitaplığı projesi oluşturur. Yeni sınıf kitaplığı test edilecek kodu içerir.

  • Class1.vb PrimeService.vb olarak yeniden adlandırın.

  • PrimeService.vb içindeki kodu aşağıdaki kodla değiştirin:

    Imports System
    
    Namespace Prime.Services
        Public Class PrimeService
            Public Function IsPrime(candidate As Integer) As Boolean
                Throw New NotImplementedException("Not implemented.")
            End Function
        End Class
    End Namespace
    
  • Yukarıdaki kod:

    • NotImplementedException Uygulanmadığını belirten bir iletiyle bir oluşturur.
    • Öğreticinin devamında güncelleştirilir.
  • Unit-testing-using-dotnet-test dizininde, çözüme sınıf kitaplığı projesini eklemek için aşağıdaki komutu çalıştırın:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Aşağıdaki komutu çalıştırarak PrimeService.Tests projesini oluşturun:

    dotnet new xunit -o PrimeService.Tests
    
  • Yukarıdaki komut:

    • PrimeService.Tests dizininde PrimeService.Tests projesini oluşturur. Test projesi, test kitaplığı olarak xUnit kullanır.
    • Proje dosyasına aşağıdaki <PackageReference />öğeleri ekleyerek test çalıştırıcısını yapılandırılır:
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • "xunit.runner.visualstudio"
  • Aşağıdaki komutu çalıştırarak test projesini çözüm dosyasına ekleyin:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Sınıf kitaplığını PrimeService PrimeService.Tests projesine bağımlılık olarak ekleyin:

    dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj  
    

Çözümü oluşturmak için komutlar

Bu bölüm, önceki bölümdeki tüm komutları özetler. Önceki bölümdeki adımları tamamladıysanız bu bölümü atlayın.

Aşağıdaki komutlar bir Windows makinesinde test çözümünü oluşturur. macOS ve Unix için dosyasını yeniden adlandırmak için komutunu işletim sistemi sürümüne ren güncelleştirinren:

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Önceki bölümde yer alan "PrimeService.vb içindeki kodu aşağıdaki kodla değiştirin" yönergelerini izleyin.

Test oluşturun

Test temelli geliştirmede (TDD) popüler bir yaklaşım, hedef kodu uygulamadan önce bir test yazmaktır. Bu öğreticide TDD yaklaşımı kullanılır. IsPrime yöntemi çağrılabilir, ancak uygulanmaz. Bir test çağrısı IsPrime başarısız oluyor. TDD ile başarısız olduğu bilinen bir test yazılır. Hedef kod test geçişi yapacak şekilde güncelleştirilir. Bu yaklaşımı yinelemeye, başarısız bir test yazmaya ve ardından hedef kodu geçirecek şekilde güncelleştirmeye devam edersiniz.

PrimeService.Tests projesini güncelleştirin:

  • PrimeService.Tests/UnitTest1.vb silin.
  • PrimeService.Tests /PrimeService_IsPrimeShould.vb dosyası oluşturun.
  • PrimeService_IsPrimeShould.vb içindeki kodu aşağıdaki kodla değiştirin:
Imports Xunit

Namespace PrimeService.Tests
    Public Class PrimeService_IsPrimeShould
        Private ReadOnly _primeService As Prime.Services.PrimeService

        Public Sub New()
            _primeService = New Prime.Services.PrimeService()
        End Sub


        <Fact>
        Sub IsPrime_InputIs1_ReturnFalse()
            Dim result As Boolean = _primeService.IsPrime(1)

            Assert.False(result, "1 should not be prime")
        End Sub

    End Class
End Namespace

özniteliği, [Fact] test çalıştırıcısı tarafından çalıştırılan bir test yöntemini bildirir. PrimeService.Tests klasöründen komutunu çalıştırındotnet test. dotnet test komutu hem projeleri oluşturur hem de testleri çalıştırır. xUnit test çalıştırıcısı, testleri çalıştırmak için program giriş noktasını içerir. dotnet test birim testi projesini kullanarak test çalıştırıcısını başlatır.

Henüz uygulanmadığından test başarısız oluyor IsPrime . TDD yaklaşımını kullanarak, bu testin geçmesi için yalnızca yeterli kod yazın. Aşağıdaki kodla güncelleştirin IsPrime :

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Not implemented.")
End Function

dotnet test'i çalıştırın. Test başarılı oldu.

Daha fazla test ekleme

0 ve -1 için asal sayı testleri ekleyin. Önceki testi kopyalayabilir ve aşağıdaki kodu 0 ve -1 kullanacak şekilde değiştirebilirsiniz:

Dim result As Boolean = _primeService.IsPrime(1)

Assert.False(result, "1 should not be prime")

Yalnızca bir parametre değiştiğinde test kodunun kopyalanması kod yineleme ve test blobu ile sonuçlanmaktadır. Aşağıdaki xUnit öznitelikleri benzer testlerden oluşan bir paket yazmaya olanak tanır:

  • [Theory] aynı kodu yürüten ancak farklı giriş bağımsız değişkenleri olan bir test paketini temsil eder.
  • [InlineData] özniteliği, bu girişlerin değerlerini belirtir.

Yeni testler oluşturmak yerine, tek bir teori oluşturmak için önceki xUnit özniteliklerini uygulayın. Aşağıdaki kodu değiştirin:

<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
    Dim result As Boolean = _primeService.IsPrime(1)

    Assert.False(result, "1 should not be prime")
End Sub

aşağıdaki kodla:

<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
    Dim result As Boolean = _primeService.IsPrime(value)

    Assert.False(result, $"{value} should not be prime")
End Sub

Yukarıdaki kodda [Theory] ve [InlineData] ikiden küçük birkaç değerin testini etkinleştirin. İki en küçük asal sayıdır.

komutunu çalıştırın dotnet test, testlerden ikisi başarısız olur. Tüm testlerin başarılı olmasını sağlamak için yöntemini aşağıdaki kodla güncelleştirin IsPrime :

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate < 2 Then
        Return False
    End If
    Throw New NotImplementedException("Not fully implemented.")
End Function

TDD yaklaşımını izleyerek daha fazla başarısız test ekleyin ve ardından hedef kodu güncelleştirin. Testlerin tamamlanmış sürümüne ve kitaplığın tam uygulamasına bakın.

Tamamlanan IsPrime yöntem, ilkelliği test etme açısından verimli bir algoritma değildir.

Ek kaynaklar