Prueba unitaria de C# con NUnit y .NET CoreUnit testing C# with NUnit and .NET Core

Este tutorial le guía por una experiencia interactiva de creación de una solución de ejemplo paso a paso para aprender los conceptos de pruebas unitarias.This tutorial takes you through an interactive experience building a sample solution step-by-step to learn unit testing concepts. Si prefiere seguir el tutorial con una solución precompilada, vea o descargue el código de ejemplo antes de comenzar.If you prefer to follow the tutorial using a pre-built solution, view or download the sample code before you begin. Para obtener instrucciones de descarga, vea Ejemplos y tutoriales.For download instructions, see Samples and Tutorials.

Este artículo trata sobre la prueba de un proyecto de .NET Core.This article is about testing a .NET Core project. Si está realizando pruebas con un proyecto de ASP.NET Core, consulte Pruebas de integración en ASP.NET Core.If you're testing an ASP.NET Core project, see Integration tests in ASP.NET Core.

Requisitos previosPrerequisites

  • SDK de .NET Core 2.1 o versiones posteriores..NET Core 2.1 SDK or later versions.
  • Un editor de texto o un editor de código de su elección.A text editor or code editor of your choice.

Crear el proyecto de origenCreating the source project

Abra una ventana del Shell.Open a shell window. Cree un directorio llamado unit-testing-using-nunit que contenga la solución.Create a directory called unit-testing-using-nunit to hold the solution. En este directorio nuevo, ejecute el comando siguiente para crear un archivo de solución nuevo para la biblioteca de clases y el proyecto de prueba:Inside this new directory, run the following command to create a new solution file for the class library and the test project:

dotnet new sln

A continuación, cree un directorio PrimeService.Next, create a PrimeService directory. En el esquema siguiente se muestra la estructura de directorios y archivos hasta el momento:The following outline shows the directory and file structure so far:

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

Convierta PrimeService en el directorio actual y ejecute el siguiente comando para crear el proyecto de origen:Make PrimeService the current directory and run the following command to create the source project:

dotnet new classlib

Cambie el nombre de Class1.cs a PrimeService.cs.Rename Class1.cs to PrimeService.cs. Creará una implementación de errores de la clase PrimeService:You create a failing implementation of the PrimeService class:

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 a unit-testing-using-nunit.Change the directory back to the unit-testing-using-nunit directory. Ejecute el siguiente comando para agregar el proyecto de biblioteca de clases a la solución:Run the following command to add the class library project to the solution:

dotnet sln add PrimeService/PrimeService.csproj

Crear el proyecto de pruebaCreating the test project

A continuación, cree el directorio PrimeService.Tests.Next, create the PrimeService.Tests directory. En el esquema siguiente se muestra la estructura de directorios:The following outline shows the directory structure:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Convierta el directorio PrimeService.Tests en el directorio actual y cree un proyecto nuevo con el comando siguiente:Make the PrimeService.Tests directory the current directory and create a new project using the following command:

dotnet new nunit

El comando dotnet new crea un proyecto de prueba que usa NUnit como la biblioteca de pruebas.The dotnet new command creates a test project that uses NUnit as the test library. La plantilla generada configura el ejecutor de pruebas en el archivo PrimeService.Tests.csproj:The generated template configures the test runner in the PrimeService.Tests.csproj file:

<ItemGroup>
  <PackageReference Include="nunit" Version="3.13.1" />
  <PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
</ItemGroup>

El proyecto de prueba requiere otros paquetes para crear y ejecutar pruebas unitarias.The test project requires other packages to create and run unit tests. En el paso anterior, dotnet new agrega el SDK de prueba de Microsoft, el marco de pruebas de NUnit y el adaptador de prueba de NUnit.dotnet new in the previous step added the Microsoft test SDK, the NUnit test framework, and the NUnit test adapter. Ahora, agregue la biblioteca de clases PrimeService como otra dependencia al proyecto.Now, add the PrimeService class library as another dependency to the project. Use el comando dotnet add reference:Use the dotnet add reference command:

dotnet add reference ../PrimeService/PrimeService.csproj

Puede ver todo el archivo en el repositorio de muestras en GitHub.You can see the entire file in the samples repository on GitHub.

En el esquema siguiente se muestra el diseño de solución final:The following outline shows the final solution layout:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

Ejecute el comando siguiente en el directorio unit-testing-using-nunit:Execute the following command in the unit-testing-using-nunit directory:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Crear la primera pruebaCreating the first test

Escribirá una prueba de errores, la aprobará y, luego, repetirá el proceso.You write one failing test, make it pass, then repeat the process. En el directorio PrimeService.Tests, cambie el nombre del archivo UnitTest1.cs por PrimeService_IsPrimeShould.cs y reemplace todo su contenido por el código siguiente:In the PrimeService.Tests directory, rename the UnitTest1.cs file to PrimeService_IsPrimeShould.cs and replace its entire contents with the following code:

using NUnit.Framework;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestFixture]
    public class PrimeService_IsPrimeShould
    {
        private PrimeService _primeService;

        [SetUp]
        public void SetUp()
        {
            _primeService = new PrimeService();
        }

        [Test]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 should not be prime");
        }
    }
}

El atributo [TestFixture] indica una clase que contiene pruebas unitarias.The [TestFixture] attribute denotes a class that contains unit tests. El atributo [Test] indica que un método es un método de prueba.The [Test] attribute indicates a method is a test method.

Guarde este archivo y ejecute dotnet test para compilar las pruebas y la biblioteca de clases y luego ejecutar las pruebas.Save this file and execute dotnet test to build the tests and the class library and then run the tests. El ejecutor de pruebas de NUnit tiene el punto de entrada del programa para ejecutar las pruebas desde la consola.The NUnit test runner contains the program entry point to run your tests. dotnet test inicia el ejecutor de pruebas con el proyecto de prueba unitaria que creó.dotnet test starts the test runner using the unit test project you've created.

La prueba produce un error.Your test fails. Todavía no ha creado la implementación.You haven't created the implementation yet. Cree esta prueba que se supera escribiendo el código más simple en la clase PrimeService que funciona:Make this test pass by writing the simplest code in the PrimeService class that works:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

En el directorio unit-testing-using-nunit, vuelva a ejecutar dotnet test.In the unit-testing-using-nunit directory, run dotnet test again. El comando dotnet test ejecuta una compilación del proyecto PrimeService y luego del proyecto PrimeService.Tests.The dotnet test command runs a build for the PrimeService project and then for the PrimeService.Tests project. Después de compilar ambos proyectos, se ejecuta esta única prueba.After building both projects, it runs this single test. Pasa.It passes.

Agregar más característicasAdding more features

Ahora que la prueba se ha superado, es el momento de escribir más.Now that you've made one test pass, it's time to write more. Hay algunos otros casos simples para números primos: 0, -1.There are a few other simple cases for prime numbers: 0, -1. Puede agregar pruebas nuevas con el atributo [Test], pero enseguida este proceso se hace tedioso.You could add new tests with the [Test] attribute, but that quickly becomes tedious. Hay otros atributos de NUnit que le permiten escribir un conjunto de pruebas similares.There are other NUnit attributes that enable you to write a suite of similar tests. Un atributo [TestCase] se usa para crear un conjunto de pruebas que ejecutan el mismo código pero tienen diferentes argumentos de entrada.A [TestCase] attribute is used to create a suite of tests that execute the same code but have different input arguments. Puede usar el atributo [TestCase] para especificar valores para esas entradas.You can use the [TestCase] attribute to specify values for those inputs.

En lugar de crear pruebas, aplique este atributo para crear una sola prueba controlada por datos.Instead of creating new tests, apply this attribute to create a single data driven test. La prueba controlada por datos es un método que prueba varios valores menores que dos, que es el número primo menor:The data driven test is a method that tests several values less than two, which is the lowest prime number:

[TestCase(-1)]
[TestCase(0)]
[TestCase(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 no se superarán.Run dotnet test, and two of these tests fail. Para superar todas las pruebas, cambie la cláusula if al principio del método Main en el archivo PrimeService.cs:To make all of the tests pass, change the if clause at the beginning of the Main method in the PrimeService.cs file:

if (candidate < 2)

Puede continuar recorriendo en iteración agregando más pruebas, más teorías y más código en la biblioteca principal.Continue to iterate by adding more tests, more theories, and more code in the main library. Ya tiene la versión terminada de las pruebas y la implementación completa de la biblioteca.You have the finished version of the tests and the complete implementation of the library.

Ha creado una biblioteca pequeña y un conjunto de pruebas unitarias para esa biblioteca.You've built a small library and a set of unit tests for that library. Ha estructurado la solución, por lo que agregar pruebas y paquetes nuevos es parte del flujo de trabajo normal.You've structured the solution so that adding new packages and tests is part of the normal workflow. Ha centrado la mayor parte del tiempo y del esfuerzo en resolver los objetivos de la aplicación.You've concentrated most of your time and effort on solving the goals of the application.