Compartir a través de


Pruebas unitarias de bibliotecas de .NET Core de Visual Basic mediante dotnet test y NUnit

Este tutorial le lleva a través de una experiencia interactiva que crea una solución de ejemplo paso a paso para aprender conceptos de pruebas unitarias. Si prefiere seguir el tutorial con una solución pregenerada, puede ver o descargar el código de ejemplo antes de comenzar. Para obtener instrucciones de descarga, consulte Ejemplos y tutoriales.

En este artículo se trata de probar un proyecto de .NET Core. Si vas a probar un proyecto de ASP.NET Core, consulta Pruebas de integración en ASP.NET Core.

Prerrequisitos

  • SDK de .NET 8 o versiones posteriores.
  • El editor de texto o de código que elija.

Creación del proyecto de origen

Abra una ventana de terminal. Cree un directorio denominado unit-testing-vb-nunit para contener la solución. Dentro de este nuevo directorio, ejecute el siguiente comando para crear un nuevo archivo de solución para la biblioteca de clases y el proyecto de prueba:

dotnet new sln

A continuación, cree un directorio PrimeService. En el esquema siguiente se muestra la estructura de archivos hasta ahora:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService

Haga de PrimeService como el directorio actual y ejecute el siguiente comando para crear el proyecto fuente:

dotnet new classlib -lang VB

Cambie el nombre de Class1.VB a PrimeService.VB. Creará una implementación de errores de la clase PrimeService:

Namespace Prime.Services
    Public Class PrimeService
        Public Function IsPrime(candidate As Integer) As Boolean
            Throw New NotImplementedException("Please create a test first.")
        End Function
    End Class
End Namespace

Cambien nuevamente el directorio al directorio unit-testing-vb-using-mstest. Ejecute el siguiente comando para agregar el proyecto de biblioteca de clases a la solución:

dotnet sln add .\PrimeService\PrimeService.vbproj

Creación del proyecto de prueba

A continuación, cree el directorio PrimeService.Tests. En el esquema siguiente se muestra la estructura de directorios:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

Establezca el directorio PrimeService.Tests como el directorio actual y cree un nuevo proyecto con el siguiente comando:

dotnet new nunit -lang VB

El comando dotnet new crea un proyecto de prueba que usa NUnit como biblioteca de pruebas. La plantilla generada configura el ejecutor de pruebas en el archivo PrimeServiceTests.vbproj :

<ItemGroup>
  <PackageReference Include="nunit" Version="4.4.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
</ItemGroup>

Nota:

Antes de .NET 9, el código generado puede hacer referencia a versiones anteriores del marco de prueba de NUnit. Puede usar la CLI de dotnet para actualizar los paquetes. Como alternativa, abra el archivo PrimeService.Tests.vbproj y reemplace el contenido del grupo de elementos de referencias del paquete por el código anterior.

El proyecto de prueba requiere otros paquetes para crear y ejecutar pruebas unitarias. dotnet new en el paso anterior se agregó NUnit y el adaptador de prueba de NUnit. Ahora, agregue la biblioteca de clases PrimeService como otra dependencia al proyecto. Use el comando dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.vbproj

Puede ver todo el archivo en el repositorio de ejemplos de en GitHub.

Tiene el siguiente diseño de solución final:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.vbproj

Ejecute el siguiente comando en el directorio unit-testing-vb-nunit :

dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj

Creación de la primera prueba

Escribe una prueba fallida, haz que pase y luego repite el proceso. En el directorio PrimeService.Tests , cambie el nombre del archivo UnitTest1.vb a PrimeService_IsPrimeShould.VB y reemplace todo su contenido por el código siguiente:

Imports NUnit.Framework

Namespace PrimeService.Tests
    <TestFixture>
    Public Class PrimeService_IsPrimeShould
        Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

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

            Assert.That(result, [Is].False, $"1 should not be prime")
        End Sub

    End Class
End Namespace

El <TestFixture> atributo indica una clase que contiene pruebas. El <Test> atributo denota un método ejecutado por el ejecutor de pruebas. Desde unit-testing-vb-nunit, ejecute dotnet test para compilar las pruebas y la biblioteca de clases y, a continuación, ejecute las pruebas. El ejecutor de pruebas NUnit contiene el punto de entrada del programa para ejecutar las pruebas. dotnet test inicia el ejecutor de pruebas mediante el proyecto de prueba unitaria que ha creado.

Se produce un error en la prueba. Todavía no ha creado la implementación. Haga que esta prueba pase escribiendo el código más sencillo en la PrimeService clase que funciona:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Please create a test first.")
End Function

En el directorio unit-testing-vb-nunit, ejecute dotnet test de nuevo. El comando dotnet test ejecuta una compilación para el proyecto de PrimeService y, a continuación, para el proyecto de PrimeService.Tests. Después de compilar ambos proyectos, ejecuta esta única prueba. Pasa.

Adición de más características

Ahora que la prueba se ha superado, es el momento de escribir más. Hay algunos otros casos simples para números primos: 0, -1. Puede agregar esos casos como nuevas pruebas con el <Test> atributo , pero eso se vuelve tedioso. Hay otros atributos xUnit que permiten escribir un conjunto de pruebas similares. Un <TestCase> atributo representa un conjunto de pruebas que ejecutan el mismo código, pero tienen argumentos de entrada diferentes. Puede usar el atributo <TestCase> para especificar valores para esas entradas.

En lugar de crear nuevas pruebas, aplique estos dos atributos para crear una serie de pruebas que prueben varios valores inferiores a dos, que es el número primo más bajo:

<TestFixture>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

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

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

    <TestCase(2)>
    <TestCase(3)>
    <TestCase(5)>
    <TestCase(7)>
    Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

        Assert.That(result, [Is].True, $"{value} should be prime")
    End Sub

    <TestCase(4)>
    <TestCase(6)>
    <TestCase(8)>
    <TestCase(9)>
    Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

        Assert.That(result, [Is].False, $"{value} should not be prime")
    End Sub
End Class

Ejecute dotnet testy dos de estas pruebas fallan. Para que se superen todas las pruebas, cambie la if cláusula al principio del Main método en el archivo PrimeServices.cs :

if candidate < 2

Siga iterando agregando más pruebas, más teorías y más código en la biblioteca principal. Ya tiene la versión terminada de las pruebas y la implementación completa de la biblioteca.

Ha creado una biblioteca pequeña y un conjunto de pruebas unitarias para esa biblioteca. Ha estructurado la solución para que la adición de nuevos paquetes y pruebas forme parte del flujo de trabajo normal. Ha concentrado la mayor parte de su tiempo y esfuerzo en resolver los objetivos de la aplicación.