Skip to content

Instantly share code, notes, and snippets.

@delso-ferreira
Last active March 8, 2024 19:08
Show Gist options
  • Save delso-ferreira/0a943c3cf6505a8793e4ff8765652ea9 to your computer and use it in GitHub Desktop.
Save delso-ferreira/0a943c3cf6505a8793e4ff8765652ea9 to your computer and use it in GitHub Desktop.
Criando Testes em C#

Testes em C#

Os testes em C# não ficam em camadas da aplicação, no caso, para desenvolver um teste, criamos uma aplicação nova de testes. Verificando nos templates que o C# disponibiliza através de:

dotnet new --list

Poderemos ver o template de 'xUnit Test Project', ou seja, é um tipo de biblioteca que o Asp.Net tem para testar aplicações.

1 - Primeiramente, fora do diretório da API principal, executamos o comando:

dotnet new xunit -o [nome_do_projeto.test]

Um novo diretório paralelo ao diretório principal vai ser criado e automaticamente um arquivo solution vai ser criado, que serve para integrar vários projetos diferentes.

2 - Criando um novo arquivo solution:

dotnet new sln --name [nome da solution]

3 - Adicionando para integrar o projeto de teste e a aplicação. Um projeto em C# é identificado pelo arquivo .csproj, para adicionar na solution os dois projetos:

dotnet add sln [diretório]

Tanto para a aplicação como para o projeto de teste, por exemplo:

dotnet add sln Projeto/Projeto.csproj

dotnet add sln Projeto.Teste/Projeto.Teste.csproj

4 - Os projetos devem ser referenciados um ao outro. No projeto principal deve ser incluido dentro do arquivo .csproj uma tag dessa forma o projeto tem uma visibilidade interna para o projeto de teste:

<ItemGroup>
  InternalVisibleTo Include = "Nome_do_projeto_de_teste" />
</ ItemGroup>

5 - No projeto de teste devemos adicionar uma referencia para a aplicação, onde também devemos utilizar uma tag e adicionar todo o caminho:

<ItemGroup>
  <ProjectReference Include = ".../caminho_do_projeto.csproj"
</ ItemGroup>

Assim como um npm install no Node.js devemos adicionar alguns pacotes para trabalhar com testes, no .NET utilizamos o comando 'dotnet add package'.

6 - Seguindo a orientação de um novo projeto em MVC podemos adicionar:

dotnet add package Microsoft.AspNetCore.MVC.Testing --version [escolher a versão]
  • Hosting, que serve para simular a API principal dentro da API de testes:
dotnet add package Microsfot.AspNetCore.Hosting --version [escolher a versão]
  • Para trabalhar com testes é importante ler e manipular arquivos JSON:
dotnet add package Newtonsoft.Json --version [escolher a versão]
  • Pacote responsável para realização de mocks:
dotnet add package Moq --version [escolher a versão]

7 - Na raiz do projeto da API principal, no arquivo Program.cs é preciso fazer uma alteração para o teste construir a aplicação, após a última linha do app.run():

public partial class Program()

Partial serve para substituir o funcionamento da classe Program, ou seja, quando você declara uma classe como partial, você pode definir diferentes partes dessa classe em arquivos separados. Todas essas partes são combinadas durante a compilação para formar uma única definição da classe, ou seja, no projeto de teste vai ser identificado a classe Program.


Na Api de teste

Existem alguns atributos para testes que são usados no framework de testes xUnit.net para escrever e organizar testes.

Fact

O Fact é usado para definir um teste unitário simples. Ele indica que um método é um teste que deve ser executado sem parâmetros. Cada método marcado com Fact é executado como um teste independente.

Exemplo:

public class MathTests
{
    [Fact]
    public void TestAddition()
    {
        Assert.Equal(4, 2 + 2);
    }
}

Theory

O Theory, por outro lado, é usado para escrever testes parametrizados. Você fornece dados de entrada para um Theory através de atributos de dados. O teste é então executado com diferentes conjuntos de dados de entrada, permitindo testar vários cenários com a mesma lógica de teste.

Exemplo:

public class MathTests
{
    [Theory(DisplayName = "Testando Soma"]
    [InlineData(3, 1, 2)]
    [InlineData(5, 2, 3)]
    public void TestAddition(int expected, int a, int b)
    {
        Assert.Equal(expected, a + b);
    }
}

No exemplo acima são realizados dois testes com um único método de teste.

Para verificar apenas um teste específico na sua aplicação:

dotnet test --filter NomedaClassedeTeste

Ou ainda o teste específico dentro da sua classe de teste:

dotnet test --filter NomedaClassedeTeste.Método

Refs

Testing in C#

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment