Pruebas unitarias de bibliotecas de .NET Core de Visual Basic mediante dotnet test y MSTest
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 precompilada, vea o descargue 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 estás probando un proyecto de ASP.NET Core, consulta Pruebas de integración en ASP.NET Core.
Creación del proyecto de origen
Abra una ventana del Shell. Cree un directorio denominado unit-testing-vb-mstest para contener la solución.
Dentro de este nuevo directorio, ejecute dotnet new sln
para crear una nueva solución. Esta práctica facilita la administración de la biblioteca de clases y el proyecto de prueba unitaria.
Dentro del directorio de la solución, cree un directorio PrimeService. Hasta ahora tiene la siguiente estructura de directorios y archivos:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Haga PrimeService el directorio actual y ejecute dotnet new classlib -lang VB
para crear el proyecto de origen. Cambie el nombre de Class1.VB a PrimeService.VB. Crea una implementación fallida 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 dotnet sln add .\PrimeService\PrimeService.vbproj
para agregar el proyecto de biblioteca de clases a la solución.
Creación del proyecto de prueba
A continuación, cree el directorio
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Convierta el directorio PrimeService.Tests en el directorio actual y cree un nuevo proyecto mediante dotnet new mstest -lang VB
. Este comando crea un proyecto de prueba que usa MSTest como biblioteca de pruebas. La plantilla generada configura el ejecutor de pruebas en PrimeServiceTests.vbproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
El proyecto de prueba requiere otros paquetes para crear y ejecutar pruebas unitarias. dotnet new
en el paso anterior añadió MSTest y el ejecutor de MSTest. Ahora, agregue la biblioteca de clases PrimeService
como otra dependencia al proyecto. Use el comando dotnet add reference
:
dotnet add reference ../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-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.vbproj
Ejecute dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
en el directorio unit-testing-vb-mstest .
Creación de la primera prueba
Escribe una prueba fallida, haz que pase, luego repite el proceso. Quite UnitTest1.vb del directorio PrimeService.Tests y cree un nuevo archivo de Visual Basic denominado PrimeService_IsPrimeShould.VB. Agregue el código siguiente:
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Namespace PrimeService.Tests
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.IsFalse(result, "1 should not be prime")
End Sub
End Class
End Namespace
El atributo <TestClass>
indica una clase que contiene pruebas. El atributo <TestMethod>
denota un método ejecutado por el ejecutor de pruebas. Desde el unit-testing-vb-mstest, ejecute dotnet test
para compilar las pruebas y la biblioteca de clases y, a continuación, ejecute las pruebas. El ejecutor de pruebas de MSTest 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 clase PrimeService
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-mstest, vuelva a ejecutar dotnet test
. 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 atributo <TestMethod>
, pero eso se vuelve tedioso. Hay otros atributos de MSTest que permiten escribir un conjunto de pruebas similares. Puede usar el atributo <DataRow>
junto con <TestMethod>
atributo para especificar valores para esas entradas.
En lugar de crear nuevas pruebas, aplique estos dos atributos para crear una sola teoría. La teoría es un método que prueba varios valores inferiores a dos, que es el número primo más bajo:
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
<DataRow(-1)>
<DataRow(0)>
<DataRow(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
<TestMethod>
<DataRow(2)>
<DataRow(3)>
<DataRow(5)>
<DataRow(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsTrue(result, $"{value} should be prime")
End Sub
<TestMethod>
<DataRow(4)>
<DataRow(6)>
<DataRow(8)>
<DataRow(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
End Class
Ejecute dotnet test
, y dos de estas pruebas no se superarán. Para que se superen todas las pruebas, cambie la cláusula if
al principio del método :
if candidate < 2
Siga iterando agregando más pruebas, más teorías y más código en la biblioteca principal. Tienes la versión finalizada de los tests y la implementación completa de la biblioteca.
Has creado una pequeña biblioteca y una suite 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.