Teste de unidade
Os aplicativos multiplataforma devem ser testados como seriam usados no mundo real, a fim de aprimorar a qualidade, confiabilidade e desempenho deles. Muitos tipos de teste devem ser executados em um aplicativo, incluindo teste de unidade, teste de integração e teste de interface do usuário. O teste de unidade é a forma mais comum de fazer isso e é essencial para criar aplicativos de alta qualidade.
Um teste de unidade usa uma pequena unidade de um aplicativo (normalmente um método), a isola do restante do código e verifica se ela se comporta conforme o esperado. Sua meta é verificar se cada unidade de funcionalidade é executada conforme o esperado, para que os erros não se propaguem por todo o aplicativo. Detectar um bug onde ele ocorre é mais eficiente do que observar o efeito de um bug indiretamente em um ponto de falha secundário.
Os testes de unidade normalmente usam o padrão preparar – agir – avaliar:
Etapa | Descrição |
---|---|
Organizar | Inicialize objetos e defina o valor dos dados que são passados para o método em teste. |
Atuar | Invoque o método em teste com os argumentos necessários. |
Assert | Verifique se a ação do método em teste se comporta conforme o esperado. |
Esse padrão garante que os testes de unidade sejam legíveis, autodescritivos e consistentes.
O teste de unidade tem o efeito mais significativo na qualidade do código quando é parte integrante do fluxo de trabalho de desenvolvimento de software. Os testes de unidade podem atuar como documentação de design e especificações funcionais para o aplicativo. Assim que um método tiver sido escrito, devem ser gravados testes de unidade que verifiquem o comportamento do método em resposta a casos de dados de entrada padrão, limite e incorretos e verifiquem qualquer suposição explícita ou implícita feita pelo código. Como alternativa, com o desenvolvimento controlado por teste, os testes de unidade são gravados antes do código.
Importante
Os testes de unidade são muito eficazes em relação à regressão. Ou seja, funcionalidade que costumava funcionar, mas sofreu interferência por uma atualização com falha.
O xUnit é a estrutura de teste recomendada para aplicativos do .NET MAUI.
Adicionar testes xUnit a uma solução do .NET MAUI
Para adicionar testes xUnit à sua solução do .NET MAUI, realize uma das seguintes escolhas:
Use o Visual Studio para adicionar um novo projeto de teste xUnit à sua solução.
OR
Use a CLI do .NET para criar um projeto de teste xUnit e adicioná-lo à sua solução. Para obter mais informações, consulte Teste de unidade de C# no .NET usando o teste dotnet e xUnit.
O arquivo de projeto (.csproj) para o projeto de teste xUnit será semelhante ao seguinte exemplo:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>
A propriedade de build $(TargetFramework)
especifica a estrutura de destino para o projeto de teste. Esta será a versão mais recente do .NET instalada em seu computador.
O pacote xunit
traz pacotes filho que incluem a estrutura de teste propriamente dita e analisadores Roslyn que detectam problemas comuns com testes de unidade. Os pacotes xunit.runner.visualstudio
e os pacotes Microsoft.NET.Test.Sdk
são necessários para executar os testes de unidade no Visual Studio, bem como com o comando dotnet test
. Os pacotes coverlet.collector
permitem coletar cobertura de código. Se você não pretende coletar cobertura de código, poderá remover essa referência de pacote. Para obter mais informações sobre a cobertura de código para teste de unidade, consulte Usar a cobertura de código para teste de unidade.
Há duas abordagens principais para estruturar seu aplicativo para testes de unidade:
- O código no qual você fará o teste de unidade está em um projeto de biblioteca de classes do .NET MAUI.
- O código no qual você fará o teste de unidade está em um projeto de aplicativo do .NET MAUI.
Cada abordagem requer uma configuração específica.
Configurar um projeto de biblioteca de classes do .NET MAUI para teste de unidade
Com essa abordagem, o código que você deseja fazer teste de unidade está em um projeto de biblioteca de classes do .NET MAUI que é consumido pelo seu projeto de aplicativo do .NET MAUI. Para gravar testes de unidade na biblioteca de classes do .NET MAUI, você precisará atualizar as estruturas de destino usadas pelo projeto. Isso pode ser obtido adicionando o valor da propriedade de build $(TargetFramework)
do arquivo de projeto de teste xUnit (.csproj) à propriedade de build $(TargetFrameworks)
no arquivo de projeto da biblioteca de classes do .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
Neste exemplo, um valor net8.0
foi adicionado à propriedade de build $(TargetFrameworks)
no arquivo de projeto da biblioteca de classes do .NET MAUI.
Em seguida, você precisa adicionar uma referência ao projeto de biblioteca de classes do .NET MAUI do seu projeto de teste xUnit.
Configurar um projeto de aplicativo do .NET MAUI para teste de unidade
Com essa abordagem, o código no qual você deseja fazer teste de unidade está em um projeto de aplicativo do .NET MAUI. Para gravar testes de unidade no projeto do aplicativo .NET MAUI, você precisará atualizar as estruturas de destino usadas pelo projeto. Isso pode ser obtido adicionando o valor da propriedade de build $(TargetFramework)
do arquivo de projeto de teste xUnit (.csproj) à propriedade de build $(TargetFrameworks)
no arquivo de projeto do aplicativo .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
Neste exemplo, um valor de net8.0
foi adicionado à propriedade de build $(TargetFrameworks)
no arquivo de projeto do aplicativo .NET MAUI.
Também é necessário modificar seu projeto de aplicativo .NET MAUI para que ele não produza um executável para a estrutura de destino usada pelo projeto de teste xUnit. Isso pode ser obtido adicionando uma condição à propriedade de build $(OutputType)
no arquivo de projeto do aplicativo .NET MAUI:
<OutputType Condition="'$(TargetFramework)' != 'net8.0'">Exe</OutputType>
Neste exemplo, o projeto de aplicativo do .NET MAUI só produz um executável quando a estrutura de destino não é net8.0
.
Em seguida, você precisa adicionar uma referência ao seu projeto de aplicativo .NET MAUI do seu projeto de teste xUnit.
Escrever testes de unidade
O xUnit dá suporte a dois tipos diferentes de testes de unidade:
Tipo de teste | Atributo | Descrição |
---|---|---|
Fatos | Fact |
Testes sempre verdadeiros, que testam condições invariáveis. |
Teorias | Theory |
Testes que só são verdadeiros para um determinado conjunto de dados. |
Os testes de unidade devem ser colocados em seu projeto de teste xUnit e decorados com o atributo [Fact]
ou [Theory]
. O seguinte exemplo mostra testes de unidade que usam o atributo [Fact]
:
namespace MyUnitTests
{
public class MyTests
{
[Fact]
public void PassingTest()
{
Assert.AreEqual(4, 2+2);
}
[Fact]
public void FailingTest()
{
Assert.AreEqual(5, 2+2);
}
}
}
Neste exemplo, os testes representam um teste de aprovação e falha deliberada.
O seguinte exemplo mostra testes de unidade que usam o atributo [Theory]
:
namespace MyUnitTests
{
public class MyTests
{
[Theory]
[InlineData(3)]
[InlineData(4)]
[InlineData(5)]
public void MyTheoryTest(int value)
{
Assert.True(value % 2 == 1);
}
}
}
Neste exemplo, embora haja apenas um método de teste, existem, na verdade, três testes porque a teoria será executada uma vez para cada item de dados.
Dica
Teste uma operação com cada teste de unidade. À medida que a complexidade de um teste se expande, torna a verificação desse teste mais difícil. Limitando um teste de unidade a apenas uma preocupação, você pode garantir que seus testes sejam repetíveis, isolados e tenham um tempo de execução mais curto. Para obter mais informações, confira Melhores práticas para teste de unidade.
Executar testes de unidade
Os testes de unidade podem ser executados no Gerenciador de Testes no Visual Studio ou com o comando dotnet test
. Para obter informações sobre o Gerenciador de Testes, consulte Executar testes de unidade com o Gerenciador de Testes. Para obter informações sobre o comando dotnet test
, consulte Teste de unidade de C# no .NET usando teste dotnet e xUnit e teste do dotnet.
Executar testes de unidade usando executores de dispositivo
Os testes de unidade também podem ser executados em um dispositivo com um executor de dispositivo. Um executor de dispositivo é um aplicativo executor de teste que fornece um shell de executor visual e alguns ganchos a serem executados da CLI usando XHarness. Para obter mais informações, consulte a documentação no Wiki de executores de dispositivo de teste.