Bibliotecas de .NET Core de prueba unitaria de Visual Basic con pruebas de dotnet y xUnit
En este tutorial se muestra cómo compilar una solución que contiene un proyecto de prueba unitaria y un proyecto de biblioteca. Para seguir el tutorial con una solución precompilada, vea o descargue el código de ejemplo. Para obtener instrucciones de descarga, vea Ejemplos y tutoriales.
Creación de la solución
En esta sección, se crea una solución que contiene los proyectos de prueba y origen. 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
Las instrucciones siguientes proporcionan los pasos para crear la solución de prueba. Consulte la sección sobre comandos para crear la solución de prueba a fin de obtener instrucciones para crear la solución de prueba en un paso.
Abra una ventana del Shell.
Ejecute el siguiente comando:
dotnet new sln -o unit-testing-using-dotnet-test
El comando
dotnet new sln
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 comando
dotnet new classlib
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:
- Produce una excepción NotImplementedException con un mensaje que indica que no se ha implementado.
- Se actualiza más adelante en el tutorial.
En el directorio unit-testing-using-dotnet-test, ejecute el comando siguiente para agregar el proyecto de biblioteca de clases a la solución:
dotnet sln add ./PrimeService/PrimeService.vbproj
Cree el proyecto PrimeService.Tests ejecutando el comando siguiente:
dotnet new xunit -o PrimeService.Tests
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"
Agregue el proyecto de prueba al archivo de solución ejecutando el siguiente comando:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
Agregue la biblioteca de clases
PrimeService
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 en 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 SO de ren
para cambiar el nombre de 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
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
Siga las instrucciones de "Reemplace el código de PrimeService.vb por el código siguiente" de la sección anterior.
Creación de una prueba
Un enfoque popular en el desarrollo controlado por pruebas (TDD) consiste en escribir una prueba antes de implementar un código de destino. En este tutorial se usa el enfoque TDD. Se puede llamar al método IsPrime
, pero sin implementar. Se produce un error en una llamada de prueba a IsPrime
. Con TDD, se escribe una prueba a sabiendas de que en esta se produce un error. El código de destino se actualiza para conseguir que se supere la prueba. Siga repitiendo este enfoque, escribiendo una prueba con errores y, a continuación, actualizando el código de destino que se va a pasar.
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 atributo [Fact]
declara un método de prueba que el ejecutor de pruebas ejecuta. En la carpeta PrimeService.Tests, ejecute dotnet test
. El comando dotnet test compila ambos proyectos y ejecuta las pruebas. El ejecutor de pruebas de xUnit tiene 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 no se ha implementado IsPrime
. Con el enfoque TDD, solo tiene que escribir código suficiente para que se supere esta prueba. 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
. La prueba se supera.
Incorporación de más pruebas
Agregue pruebas de números primos para 0 y -1. Podría copiar la prueba anterior y cambiar el siguiente código para usar 0 y -1:
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
La copia de código de prueba cuando solamente es un parámetro el que cambia da lugar a la duplicación de código y al sobredimensionamiento de pruebas. Los siguientes atributos de xUnit habilitan la escritura de un conjunto de pruebas similares:
- Un elemento
[Theory]
representa un conjunto de pruebas que ejecutan el mismo código, pero tienen diferentes argumentos de entrada. - Un atributo
[InlineData]
especifica valores para esas entradas.
En lugar de crear pruebas nuevas, aplique los atributos de 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
por 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]
habilitan la prueba de varios valores inferiores a dos. Dos es el número primo más pequeño.
Al ejecutar dotnet test
, se produce un error en dos de las pruebas. Para que se superen todas las pruebas, actualice el método IsPrime
con el siguiente código:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate < 2 Then
Return False
End If
Throw New NotImplementedException("Not fully implemented.")
End Function
Siguiendo el enfoque TDD, agregue más pruebas con errores y, a continuación, actualice el código de destino. Consulte la versión terminada de las pruebas y la implementación completa de la biblioteca.
El método IsPrime
completado no es un algoritmo eficaz para probar los números primos.