Compartir a través de


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

En este tutorial se muestra cómo crear una solución que contenga un proyecto de prueba unitaria y un proyecto de biblioteca. Para seguir el tutorial mediante una solución pregenerada, vea o descargue el código de ejemplo. Para obtener instrucciones de descarga, consulte Ejemplos y tutoriales.

Creación de la solución

En esta sección, se crea una solución que contiene los proyectos de origen y prueba. La solución completada tiene la siguiente estructura de directorios:

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

En las instrucciones siguientes se proporcionan los pasos para crear la solución de prueba. Consulte Comandos para crear una solución de prueba para obtener instrucciones para crear la solución de prueba en un paso.

  • Abra una ventana de terminal.

  • Ejecute el siguiente comando:

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

    El dotnet new sln comando crea una nueva solución en el directorio unit-testing-using-dotnet-test .

  • Cambie el directorio a la carpeta unit-testing-using-dotnet-test .

  • Ejecute el siguiente comando:

    dotnet new classlib -o PrimeService -lang VB
    

    El dotnet new classlib comando crea un nuevo proyecto de biblioteca de clases en la carpeta PrimeService . La nueva biblioteca de clases contendrá el código que se va a probar.

  • Cambie el nombre de Class1.vb a PrimeService.vb.

  • Reemplace el código de PrimeService.vb por el código siguiente:

    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
    
  • El código anterior:

    • Lanza un NotImplementedException con un mensaje que indica que no está implementado.
    • Se actualiza más adelante en el tutorial.
  • En el directorio unit-testing-using-dotnet-test , ejecute el siguiente comando para agregar el proyecto de biblioteca de clases a la solución:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Para crear el proyecto PrimeService.Tests , ejecute el siguiente comando:

    dotnet new xunit -o PrimeService.Tests -lang VB
    
  • El comando anterior:

    • Crea el proyecto PrimeService.Tests en el directorio PrimeService.Tests . El proyecto de prueba usa xUnit como biblioteca de pruebas.
    • Configura el ejecutor de pruebas agregando los siguientes <PackageReference />elementos al archivo del proyecto:
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • "xunit.runner.visualstudio"
  • Para agregar el proyecto de prueba al archivo de solución, ejecute el siguiente comando:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Agregue la PrimeService biblioteca de clases como dependencia al proyecto PrimeService.Tests :

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

Comandos para crear la solución

En esta sección se resumen todos los comandos de la sección anterior. Omita esta sección si ha completado los pasos de la sección anterior.

Los comandos siguientes crean la solución de prueba en una máquina Windows. Para macOS y Unix, actualice el comando ren a la versión del sistema operativo ren para renombrar un archivo:

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 -lang VB
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Siga las instrucciones para "Reemplazar el código de PrimeService.vb por el código siguiente" en la sección anterior.

Crear una prueba

Un enfoque popular en el desarrollo controlado por pruebas (TDD) es escribir una prueba antes de implementar el código de destino. En este tutorial se usa el enfoque de TDD. El IsPrime método se puede llamar, pero no se implementa. Una llamada de prueba a IsPrime falla. Con TDD, se escribe una prueba a sabiendas de que en esta se produce un error. El código de destino se actualiza para asegurar que la prueba pase. Sigue repitiendo este enfoque, escribiendo una prueba fallida y luego actualizando el código objetivo para que pase.

Actualice el proyecto PrimeService.Tests :

  • Elimine PrimeService.Tests/UnitTest1.vb.
  • Cree un archivo PrimeService.Tests/PrimeService_IsPrimeShould.vb .
  • Reemplace el código de PrimeService_IsPrimeShould.vb por el código siguiente:
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

El [Fact] atributo declara un método de prueba que ejecuta el ejecutor de pruebas. En la carpeta PrimeService.Tests , ejecute dotnet test. El comando dotnet test compila los proyectos y ejecuta las pruebas. El ejecutor de pruebas xUnit contiene el punto de entrada del programa para ejecutar las pruebas. dotnet test inicia el ejecutor de pruebas con el proyecto de prueba unitaria.

Se produce un error en la prueba porque IsPrime no se ha implementado. Con el enfoque de TDD, escriba solo código suficiente para que esta prueba pase. Actualice IsPrime con el siguiente código:

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

Ejecute dotnet test. Se supera la prueba.

Incorporación de más pruebas

Agregue pruebas de número primo para 0 y -1. Puede copiar la prueba anterior y cambiar el código siguiente para usar 0 y -1:

Dim result As Boolean = _primeService.IsPrime(1)

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

Copiar código de prueba cuando solo un parámetro cambia da como resultado la duplicación de código y el sobredimensionamiento de pruebas. Los siguientes atributos xUnit permiten escribir un conjunto de pruebas similares:

  • [Theory] representa un conjunto de pruebas que ejecutan el mismo código, pero tienen argumentos de entrada diferentes.
  • [InlineData] atributo especifica valores para esas entradas.

En lugar de crear nuevas pruebas, aplique los atributos xUnit anteriores para crear una sola teoría. Reemplace el código siguiente:

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

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

con el siguiente código:

<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

En el código anterior, [Theory] y [InlineData] habilite la prueba de varios valores inferiores a dos. Dos es el número primo más pequeño.

Ejecute dotnet test, dos de las pruebas producirán un error. Para que se superen todas las pruebas, actualice el IsPrime método con el código siguiente:

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

Después del enfoque de TDD, agregue más pruebas con errores y actualice el código de destino. Consulte la versión finalizada de las pruebas y la implementación completa de la biblioteca.

El método completado IsPrime no es un algoritmo eficaz para probar primalidad.

Recursos adicionales