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 mostra como criar uma solução contendo um projeto de teste de unidade e um projeto de código-fonte. Para seguir o tutorial usando uma solução pré-criada, exiba ou baixe o código de exemplo. Para obter instruções de download, consulte Exemplos e Tutoriais.
Criar a solução
Nesta seção, é criada uma solução que contém os projetos de origem e de teste. A solução concluída tem a seguinte estrutura de diretórios:
/unit-testing-using-dotnet-test
unit-testing-using-dotnet-test.sln
/PrimeService
PrimeService.cs
PrimeService.csproj
/PrimeService.Tests
PrimeService_IsPrimeShould.cs
PrimeServiceTests.csproj
As instruções a seguir fornecem as etapas para criar a solução de teste. Consulte Comandos para criar solução de teste para obter instruções sobre como criar a solução de teste em uma etapa.
Abra uma janela de terminal.
Execute o seguinte comando:
dotnet new sln -o unit-testing-using-dotnet-test
O comando
dotnet new sln
cria uma nova solução no diretório unit-testing-using-dotnet-test.Altere o diretório para a pasta unit-testing-using-dotnet-test.
Execute o seguinte comando:
dotnet new classlib -o PrimeService
O comando
dotnet new classlib
cria um novo projeto de biblioteca de classes na pasta PrimeService. A nova biblioteca de classes conterá o código a ser testado.Renomeie Class1.cs para PrimeService.cs.
Substitua o código no PrimeService.cs pelo seguinte código:
using System; namespace Prime.Services { public class PrimeService { public bool IsPrime(int candidate) { throw new NotImplementedException("Not implemented."); } } }
Atualmente, esse código lança um NotImplementedException, mas você implementará o método mais adiante no tutorial.
No diretório unit-testing-using-dotnet-test, execute o seguinte comando para adicionar o projeto de biblioteca de classes à solução:
dotnet sln add ./PrimeService/PrimeService.csproj
Criar o projeto PrimeService.Tests executando o seguinte comando:
dotnet new xunit -o PrimeService.Tests
O comando anterior cria o projeto PrimeService.Tests no diretório PrimeService.Tests . O projeto de teste usa xUnit como a biblioteca de teste. O comando também configura o executor de teste adicionando os seguintes
<PackageReference />
elementos ao arquivo de projeto:Microsoft.NET.Test.Sdk
xunit
xunit.runner.visualstudio
coverlet.collector
Adicione o projeto de teste ao arquivo de solução executando o seguinte comando:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Adicione a biblioteca de classes
PrimeService
como dependência do projeto PrimeService.Tests.dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
Comandos para criar a solução
Esta seção resume todos os comandos na seção anterior. Ignore esta seção se tiver concluído as etapas na seção anterior.
Os comandos a seguir criam a solução de teste em uma máquina Windows. Para macOS e Unix, atualize o comando ren
para a versão do sistema operativo de ren
para renomear um ficheiro.
dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.cs PrimeService.cs
dotnet sln add ./PrimeService/PrimeService.csproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Siga as instruções para "Substituir o código no PrimeService.cs pelo código a seguir" na seção anterior.
Criar um teste
Uma abordagem popular no desenvolvimento orientado a testes (TDD) é escrever um teste (com falha) antes de implementar o código de destino. Este tutorial usa a abordagem TDD. O IsPrime
método é chamável, mas não implementado. Uma chamada de teste para IsPrime
falha. Ao utilizar TDD, escreve-se um teste que se sabe que vai falhar. Em seguida, você atualiza o código de destino para fazer o teste passar. Você continua repetindo essa abordagem, escrevendo um teste que falha e, em seguida, atualizando o código de destino para que passe.
Atualize o projeto PrimeService.Tests:
Exclua PrimeService.Tests/UnitTest1.cs.
Crie um arquivo PrimeService.Tests/PrimeService_IsPrimeShould.cs .
Substitua o código no PrimeService_IsPrimeShould.cs pelo seguinte código:
using Xunit; using Prime.Services; namespace Prime.UnitTests.Services { public class PrimeService_IsPrimeShould { [Fact] public void IsPrime_InputIs1_ReturnFalse() { var primeService = new PrimeService(); bool result = primeService.IsPrime(1); Assert.False(result, "1 should not be prime"); } } }
O atributo [Fact]
declara um método de teste que é executado pelo executante de testes. Na pasta PrimeService.Tests, execute dotnet test
. O comando dotnet test cria ambos os projetos e executa os testes. O executor de teste xUnit contém o ponto de entrada do programa para executar os testes.
dotnet test
inicia o executor de testes usando o projeto de testes unitários.
O teste falha porque IsPrime
não foi implementado. Usando a abordagem TDD, escreva apenas código suficiente para que esse teste seja aprovado. Atualize IsPrime
com o seguinte código:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
Execute dotnet test
. O teste passa.
Adicionar mais testes
Adicione testes de número primo para 0 e -1. Você pode copiar o teste criado na etapa anterior e fazer cópias do código a seguir para testar 0 e -1. Mas não o faça, pois há uma maneira melhor.
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
Copiar o código de teste quando apenas um parâmetro é alterado resulta em duplicação de código e inchaço de teste. Os seguintes atributos xUnit permitem escrever um conjunto de testes semelhantes:
-
[Theory]
representa uma bateria de testes que executam o mesmo código, mas têm argumentos de entrada diferentes. - O atributo
[InlineData]
especifica valores para essas entradas.
Em vez de criar novos testes, aplique os atributos xUnit anteriores para criar uma única teoria. Substitua o seguinte código...
[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
}
... com o seguinte código:
[Theory]
[InlineData(-1)]
[InlineData(0)]
[InlineData(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.False(result, $"{value} should not be prime");
}
No código anterior, [Theory]
e [InlineData]
permitem testar vários valores menores que dois. Dois é o menor número primo.
Adicione o seguinte código após a declaração de classe e antes do [Theory]
atributo:
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
Execute dotnet test
, e dois dos testes falham. Para que todos os testes sejam aprovados, atualize o método IsPrime
com o seguinte código:
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
Seguindo a abordagem TDD, adicione mais testes com falha e, em seguida, atualize o código de destino. Veja a versão concluída dos testes e a implementação completa da biblioteca.
O método IsPrime
concluído não é um algoritmo eficiente para verificar números primos.
Recursos adicionais
- Site oficial do xUnit.net
- Testar a lógica do controlador no ASP.NET Core
dotnet reference add