Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tutorial leva você através de uma experiência interativa criando uma solução de exemplo passo a passo para aprender conceitos de teste de unidade. Se preferir seguir o tutorial usando uma solução pré-construída, baixe ou visualize o código de exemplo antes de começar. Para obter instruções de download, consulte Exemplos e Tutoriais.
Este artigo é sobre como testar um projeto .NET Core. Se você estiver testando um projeto ASP.NET Core, consulte Testes de integração no ASP.NET Core.
Pré-requisitos
- O mais recente SDK do .NET
- Editor de código do Visual Studio
- O Kit de Desenvolvimento C#
Criando o projeto de origem
Abra uma janela de shell. Crie um diretório chamado unit-testing-using-nunit para armazenar a solução. Dentro desse novo diretório, execute o seguinte comando para criar um novo arquivo de solução para a biblioteca de classes e o projeto de teste:
dotnet new sln
Em seguida, crie um diretório PrimeService. O seguinte esboço apresenta o diretório e a estrutura de ficheiros até agora:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Faça PrimeService o diretório atual e execute o seguinte comando para criar o projeto de origem:
dotnet new classlib
Renomeie Class1.cs para PrimeService.cs. Você cria uma implementação com falha da classe PrimeService
:
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
Altere o diretório de volta para unit-testing-using-nunit. Execute o seguinte comando para adicionar o projeto de biblioteca de classes à solução:
dotnet sln add PrimeService/PrimeService.csproj
Criando o projeto de teste
Em seguida, crie o diretório
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Torne o diretório PrimeService.Tests o diretório atual e crie um novo projeto usando o seguinte comando:
dotnet new nunit
O comando dotnet new cria um projeto de teste que usa NUnit como a biblioteca de teste. O modelo gerado configura o executor de teste no arquivo PrimeService.Tests.csproj:
<ItemGroup>
<PackageReference Include="nunit" Version="4.3.2" />
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NUnit.Analyzers" Version="4.9.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
Observação
Antes do .NET 9, o código gerado pode fazer referência a versões mais antigas da estrutura de teste NUnit. Você pode usar a CLI dotnet para atualizar os pacotes. Como alternativa, abra o arquivo PrimeService.Tests.csproj e substitua o conteúdo do grupo de itens de referências de pacote pelo código acima.
O projeto de teste requer outros pacotes para criar e executar testes de unidade. O comando dotnet new
na etapa anterior adicionou o SDK de teste da Microsoft, a estrutura de teste NUnit e o adaptador de teste NUnit. Agora, adicione a biblioteca de classes PrimeService
como outra dependência ao projeto. Use o comando dotnet reference add
:
dotnet reference add ../PrimeService/PrimeService.csproj
Você pode ver o arquivo inteiro no repositório de amostras no GitHub.
O esquema a seguir mostra o layout final da solução.
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
Execute o seguinte comando no diretório unit-testing-using-nunit:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Criando o primeiro teste
Você escreve um teste que falha, faz com que ele passe, e depois repete o processo. No diretório PrimeService.Tests, renomeie o arquivo UnitTest1.cs para PrimeService_IsPrimeShould.cs e substitua todo o seu conteúdo pelo seguinte código:
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.That(result, Is.False, "1 should not be prime");
}
}
}
O atributo [TestFixture]
denota uma classe que contém testes de unidade. O atributo [Test]
indica que um método é um método de teste.
Salve esse arquivo e execute o comando dotnet test
para criar os testes e a biblioteca de classes e executar os testes. O executor de teste NUnit contém o ponto de entrada do programa para executar seus testes.
dotnet test
inicia o executor de teste usando o projeto de teste de unidade que você criou.
O seu teste falha. Você ainda não criou a implementação. Faça o teste passar escrevendo o código mais simples na classe PrimeService
que funciona:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
No diretório unit-testing-using-nunit, execute dotnet test
novamente. O comando dotnet test
executa uma compilação para o projeto PrimeService
e, em seguida, para o projeto PrimeService.Tests
. Depois de compilar ambos os projetos, ele executa este teste individual. Passa.
Adicionando mais recursos
Agora que você fez um teste aprovado, é hora de escrever mais. Existem alguns outros casos simples para números primos: 0, -1. Você pode adicionar novos testes com o atributo [Test]
, mas isso rapidamente se torna tedioso. Existem outros atributos NUnit que permitem escrever um conjunto de testes semelhantes. Um atributo [TestCase]
é usado para criar um conjunto de testes que executam o mesmo código, mas têm argumentos de entrada diferentes. Você pode usar o atributo [TestCase]
para especificar valores para essas entradas.
Em vez de criar novos testes, aplique esse atributo para criar um único teste controlado por dados. O teste orientado por dados é um método que testa vários valores menores que dois, que é o número primo mais baixo:
[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService?.IsPrime(value);
Assert.That(result, Is.False, $"{value} should not be prime");
}
Execute dotnet test
e dois desses testes falharão. Para que todos os testes sejam aprovados, altere a cláusula if
no início do método Main
no arquivo PrimeService.cs:
if (candidate < 2)
Continue a iterar adicionando mais testes, teorias e código na biblioteca principal. Você tem a versão concluída dos testes e a implementação completa da biblioteca.
Você criou uma pequena biblioteca e um conjunto de testes unitários para essa biblioteca. Você também estruturou a solução para que a adição de novos pacotes e testes faça parte do fluxo de trabalho padrão. Você concentrou a maior parte do seu tempo e esforço na resolução dos objetivos do aplicativo.