Visual Basic .NET Core-kódtárak egységtesztelése dotnet-teszt és xUnit használatával

Ez az oktatóanyag bemutatja, hogyan hozhat létre egy egységtesztprojektet és kódtárprojektet tartalmazó megoldást. Ha előre elkészített megoldással szeretné követni az oktatóanyagot, tekintse meg vagy töltse le a mintakódot. A letöltési utasításokért tekintse meg a példákat és az oktatóanyagokat.

A megoldás létrehozása

Ebben a szakaszban létrejön egy megoldás, amely tartalmazza a forrás- és tesztprojekteket. A kész megoldás a következő könyvtárstruktúrával rendelkezik:

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

Az alábbi utasítások a tesztmegoldás létrehozásának lépéseit ismertetik. A tesztelési megoldás egy lépésben történő létrehozásához szükséges utasításokért tekintse meg a parancsokat.

  • Nyisson meg egy felületablakot.

  • Futtassa az alábbi parancsot:

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

    A dotnet new sln parancs létrehoz egy új megoldást a unit-testing-using-dotnet-test könyvtárban.

  • Módosítsa a könyvtárat a unit-testing-using-dotnet-test mappára.

  • Futtassa az alábbi parancsot:

    dotnet new classlib -o PrimeService --lang VB
    

    A dotnet new classlib parancs létrehoz egy új osztálytárprojektet a PrimeService mappában. Az új osztálykódtár tartalmazza a tesztelni kívánt kódot.

  • Nevezze át Class1.vb PrimeService.vb.

  • Cserélje le a PrimeService.vb kódját a következő kódra:

    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
    
  • A fenti kód a következőket végzi el:

    • NotImplementedException Egy üzenetet küld, amely jelzi, hogy nincs implementálva.
    • Az oktatóanyag későbbi részében frissül.
  • A unit-testing-using-dotnet-test könyvtárban futtassa a következő parancsot az osztálytár projektjének a megoldáshoz való hozzáadásához:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Hozza létre a PrimeService.Tests projektet a következő parancs futtatásával:

    dotnet new xunit -o PrimeService.Tests
    
  • A fenti parancs a következőket hajtja végre:

    • Létrehozza a PrimeService.Tests projektet a PrimeService.Tests könyvtárban. A tesztprojekt az xUnitot használja teszttárként.
    • A tesztfuttatót úgy konfigurálja, hogy hozzáadja a következő <PackageReference />elemeket a projektfájlhoz:
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • "xunit.runner.visualstudio"
  • Adja hozzá a tesztprojektet a megoldásfájlhoz az alábbi parancs futtatásával:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Adja hozzá az PrimeService osztálytárat függőségként a PrimeService.Tests projekthez:

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

A megoldás létrehozásához használt parancsok

Ez a szakasz az előző szakasz összes parancsát összegzi. Kihagyhatja ezt a szakaszt, ha elvégezte az előző szakasz lépéseit.

Az alábbi parancsok létrehozzák a tesztmegoldást egy Windows-gépen. MacOS és Unix esetén frissítse a parancsot a ren fájl átnevezésének operációs rendszerének ren verziójára:

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

Kövesse az előző szakaszban található "A PrimeService.vb kódjának cseréje a következő kódra" című szakasz utasításait.

Teszt létrehozása

A tesztalapú fejlesztés (TDD) egyik népszerű módszere a teszt írása a célkód implementálása előtt. Ez az oktatóanyag a TDD-megközelítést használja. A IsPrime metódus hívható, de nem implementálható. Sikertelen teszthívás IsPrime . A TDD-vel a rendszer olyan tesztet ír, amelyről ismert, hogy sikertelen. A célkód frissül, hogy a teszt sikeres legyen. Ismételje meg ezt a megközelítést, írjon egy sikertelen tesztet, majd frissítse a célkódot az átadásra.

Frissítse a PrimeService.Tests projektet:

  • Törölje a PrimeService.Tests/UnitTest1.vb.
  • Hozzon létre egy PrimeService.Tests/PrimeService_IsPrimeShould.vb fájlt.
  • Cserélje le a PrimeService_IsPrimeShould.vb kódját a következő kódra:
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

Az [Fact] attribútum deklarál egy tesztmetódust, amelyet a tesztfuttató futtat. Futtassa dotnet testa PrimeService.Tests mappát. A dotnet test parancs mindkét projektet létrehozza, és futtatja a teszteket. Az xUnit tesztfuttató tartalmazza a tesztek futtatásához a program belépési pontát. dotnet test elindítja a tesztfuttatót az egységteszt-projekt használatával.

A teszt meghiúsul, mert IsPrime még nincs implementálva. A TDD-módszer használatával csak annyi kódot írjon, hogy a teszt sikeres legyen. Frissítsen IsPrime a következő kóddal:

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

Futtassa az dotnet test parancsot. A teszt sikeres.

További tesztek hozzáadása

Adjon hozzá prímszámteszteket a 0 és a -1 számhoz. Másolhatja az előző tesztet, és módosíthatja a következő kódot a 0 és a -1 használatára:

Dim result As Boolean = _primeService.IsPrime(1)

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

A tesztkód másolása, ha csak egy paraméter változása eredményez kódismétlést és tesztblobot. A következő xUnit-attribútumok lehetővé teszik egy hasonló tesztcsomag írását:

  • [Theory] olyan tesztcsomagot jelöl, amely ugyanazt a kódot hajtja végre, de különböző bemeneti argumentumokkal rendelkezik.
  • [InlineData] attribútum a bemenetek értékeit határozza meg.

Új tesztek létrehozása helyett alkalmazza az előző xUnit-attribútumokat egyetlen elmélet létrehozására. Cserélje le a következő kódot:

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

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

a következő kóddal:

<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

Az előző kódban engedélyezze [Theory][InlineData] a kétnál kisebb értékek tesztelését. A kettő a legkisebb prímszám.

Futtassa dotnet testa két teszt sikertelen voltát. Az összes teszt sikeres végrehajtásához frissítse a metódust IsPrime a következő kóddal:

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

A TDD-megközelítést követve adjon hozzá további sikertelen teszteket, majd frissítse a célkódot. Tekintse meg a tesztek kész verzióját és a kódtár teljes implementációját.

A kész IsPrime módszer nem hatékony algoritmus az elsődlegesség teszteléséhez.

További erőforrások