Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
- La versión más reciente del SDK de .NET
- Editor de Visual Studio Code
- El DevKit de C#
Creación del proyecto de origen
Abra una ventana de terminal. Cree un directorio denominado unit-testing-using-mstest para contener la solución. Dentro de este nuevo directorio, ejecute dotnet new sln
para crear un nuevo archivo de solución para la biblioteca de clases y el proyecto de prueba. Cree un directorio PrimeService . En el esquema siguiente se muestra la estructura de directorios y archivos hasta ahora:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Convierta PrimeService en el directorio actual y ejecute dotnet new classlib
para crear el proyecto de origen. Cambie el nombre de Class1.cs a PrimeService.cs. Reemplace el código del archivo por el código siguiente para crear una implementación con errores de la PrimeService
clase :
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
Cambie nuevamente el directorio al directorio unit-testing-using-mstest. Ejecute dotnet sln add
para agregar el proyecto de biblioteca de clases a la solución:
dotnet sln add PrimeService/PrimeService.csproj
Creación del proyecto de prueba
Cree el directorio PrimeService.Tests . En el esquema siguiente se muestra la estructura de directorios:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Convierta el directorio PrimeService.Tests en el directorio actual y cree un nuevo proyecto mediante dotnet new mstest
. El comando dotnet new crea un proyecto de prueba que usa MSTest como biblioteca de pruebas. La plantilla configura el ejecutor de pruebas en el archivo PrimeServiceTests.csproj :
<ItemGroup>
<PackageReference Include="MSTest" Version="3.2.0" />
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>
El proyecto de prueba requiere otros paquetes para crear y ejecutar pruebas unitarias. dotnet new
en el paso anterior se añadieron los paquetes y herramientas necesarios de MSTest para los informes de cobertura de código.
Agregue la PrimeService
biblioteca de clases como otra dependencia al proyecto. Use el comando dotnet reference add
:
dotnet reference add ../PrimeService/PrimeService.csproj
Puede ver todo el archivo en el repositorio de ejemplos de en GitHub.
En el esquema siguiente se muestra el diseño final de la solución:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.csproj
Cambie al directorio unit-testing-using-mstest y ejecute dotnet sln add
:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Creación de la primera prueba
Escribe una prueba fallida, haz que pase y luego repite el proceso. Quite UnitTest1.cs del directorio PrimeService.Tests y cree un nuevo archivo de C# denominado PrimeService_IsPrimeShould.cs con el siguiente contenido:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
[TestMethod]
public void IsPrime_InputIs1_ReturnFalse()
{
bool result = _primeService.IsPrime(1);
Assert.IsFalse(result, "1 should not be prime");
}
}
}
El atributo TestClass denota una clase que contiene pruebas unitarias. El atributo TestMethod indica que un método es un método de prueba.
Guarde este archivo y ejecútelo 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 PrimeService
clase que funciona:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
En el directorio unit-testing-using-mstest, 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 nuevas pruebas con el atributo TestMethod, pero eso se vuelve tedioso rápidamente. Hay otros atributos de MSTest que permiten escribir un conjunto de pruebas similares. Un método de prueba puede ejecutar el mismo código, pero tiene argumentos de entrada diferentes. Puede usar el atributo DataRow para especificar valores para esas entradas.
En lugar de crear nuevas pruebas, aplique estos dos atributos para crear una única prueba controlada por datos. La prueba controlada por datos es un método que prueba varios valores inferiores a dos, que es el número primo más bajo. Agregue un nuevo método de prueba en PrimeService_IsPrimeShould.cs:
[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} should not be prime");
}
Ejecute dotnet test
y dos de estas pruebas fallan. Para que se superen todas las pruebas, cambie la cláusula if
al principio del método IsPrime
en el archivo PrimeService.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.