Teste unitários no C# com o NUnit \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 01 Horas 

 41 Min 

 06 Seg 

   Tempo restante da oferta: 01 41 06 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Teste unitários no C# com o NUnit  [ Testes e Projetos ](https://www.treinaweb.com.br/blog/categoria/testes-e-projetos) [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# Teste unitários no C# com o NUnit

 Testes unitários ajudam a garantir a qualidade de uma aplicação. No C# temos a biblioteca NUnit. Veja aqui como adicioná-la no seu projeto.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/12175052/NUNIT.png)  

Um hábito que estou procurando cultivar nos últimos tempos é sempre adicionar testes unitários nas minhas aplicações. Qualquer desenvolvedor sabe (ou deveria saber) os [benefícios de se adicionar testes unitários em uma aplicação](https://www.treinaweb.com.br/blog/por-que-escrever-testes-automatizados/), mas infelizmente não são todos que seguem esta filosofia. Para ajudar nisso, criarei uma série de artigos falando sobre as bibliotecas de testes unitários do C#, começando pela [NUnit](https://nunit.org/).

## Conhecendo a biblioteca NUnit

O **NUnit** é uma biblioteca open source de teste unitários, que nasceu como um porte para o .NET da biblioteca de teste unitários do Java, a [JUnit](https://junit.org). Com o tempo ela foi sendo reescrita em C#. Agora, na versão atual, a 3, a biblioteca foi totalmente reescrita para que fosse adicionado novos recursos e fizesse uso de recursos fornecidos pela plataforma .NET.

Devido a sua gama de recursos e facilidade de uso, no momento, é a biblioteca de testes unitários mais popular do .NET.

Para conhecê-la, vamos colocar a mão na massa.

## Criando o projeto que será testado

Diferente de outras bibliotecas, os testes unitários devem ser adicionados em um projeto a parte. O .NET fornece templates de projetos para algumas bibliotecas de testes, incluindo o NUnit, mas caso seja necessário definir isso manualmente, basta criar um projeto de biblioteca de classes.

Por necessitar de dois projetos, vamos iniciar a criação da aplicação utilizada neste artigo com a criação da solução:

```dos
dotnet new sln -n teste-unitario-com-nunit

```

Dentro da pasta da solução, crie uma biblioteca de classes:

```dos
dotnet new classlib -n calculos

```

No projeto criado, renomeie o arquivo `Class1` para `Calculadora` e nela adicione os métodos abaixo:

```csharp
public class Calculadora
{
    public int Soma(int operador1, int operador2) => operador1 + operador2;
    public int Subtracao(int operador1, int operador2) => operador1 - operador2;
    public int Multiplicacao(int operador1, int operador2) => operador1 * operador2;
    public int Divisao(int dividendo, int divisor) => dividendo / divisor;
    public (int quociente, int resto) RestoDivisao(int dividendo, int divisor) => (dividendo / divisor, dividendo % divisor);
}

```

[  ![C# (C Sharp) - TDD](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp-tdd.svg)   Curso C# (C Sharp) - TDD Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-avancado-tdd)

Por fim, adicione o projeto na solução:

```dos
dotnet sln teste-unitario-com-nunit.sln add calculos/calculos.csproj

```

## Criando o projeto de teste

Como disse, o .NET fornece alguns templates de projetos de teste para algumas bibliotecas. Para a NUnit, o projeto pode ser criado com o comando abaixo:

```csharp
dotnet new nunit -n calculos.tests

```

Adicione este projeto na solução:

```dos
dotnet sln teste-unitario-com-nunit.sln add calculos.tests/calculos.tests.csproj

```

E adicione ao projeto a referência da nossa biblioteca de classes, o projeto **calculos**:

```dos
dotnet add calculos.tests/calculos.tests.csproj reference calculos/calculos.csproj

```

Agora renomeie o arquivo **UnitTest1.cs** para **CalculadoraTest.cs** e altere o código do arquivo para:

```csharp
using NUnit.Framework;
using calculos;

namespace calculos.tests
{
    [TestFixture]
    public class CalculadoraTest
    {
        [Test]
        public void Soma_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.Soma(10, 20);
            //Verifica se o resultado é igual a 30
            Assert.AreEqual(30, resultado);
        }
    }
}

```

No código acima, o atributo `[TestFixture]` indica que a classe contém testes unitários. Já o atributo `[Test]` indica que o método é um método de teste. É através desses atributos que o comando `dotnet test` e o [**Test Explorer**](https://docs.microsoft.com/pt-br/visualstudio/test/improve-code-quality) do Visual Studio conseguem localizar os testes unitários do projeto.

Dentro do nosso método de teste, é utilizado a classe estática `Assert` para ter acesso ao método `AreEqual`, que verifica se o primeiro parâmetro é igual ao segundo.

Na versão 3 da biblioteca foi introduzido a sintaxe “constraint”, onde o teste acima pode ser escrito da seguinte forma:

```csharp
[Test]
public void Soma_DeveRetornarOValorCorreto()
{
    Calculadora c = new Calculadora();
    var resultado = c.Soma(10, 20);
    //Verifica se o resultado é igual a 30
    Assert.That(30, Is.EqualTo(resultado));
}

```

Como a biblioteca recomenda o uso desta sintaxe, todos os testes mostrados neste artigo implementarão ela.

Com o teste definido, podemos executá-lo com o comando abaixo:

```dos
dotnet test

```

O resultado será:

![](https://dkrn4sk0rn31v.cloudfront.net/2019/09/12142902/execucao_teste_unitario_um_teste.png)

O nosso único teste passou.

Um outro recurso adicionado na última versão da biblioteca é a possibilidade de agrupar os comparadores:

```csharp
[Test]
public void Divisao_DeveRetornarOValorCorreto()
{
    Calculadora c = new Calculadora();
    var resultado = c.RestoDivisao(10, 3);
    //Verifica se o quociente da divisão é 3 e o resto 1
    Assert.Multiple(() =>
    {
        Assert.That(3, Is.EqualTo(resultado.quociente));
        Assert.That(1, Is.EqualTo(resultado.resto));
    });
}

```

A vantagem de se agrupar comparadores é que caso qualquer um falhe, o teste não é finalizado. A falha é salva e os demais testes são executados. Ao final, o resultado de todos é agrupado. O teste só será finalizado caso seja gerada alguma exceção não tratada. Além disso, o bloco aceita outros códigos além de asserts, mas não é permitido o uso os asserts abaixo:

- `Assert.Pass`;
- `Assert.Ignore`;
- `Assert.Inconclusive`;
- `Assume.That`.

## Definindo vários testes unitários de uma só vez

No momento definimos apenas dois testes. Seguindo a lógica mostrada, para cada teste unitário é necessário definir um método de teste. Felizmente, o NUnit possui o atributo `TestCase`, que nos permite definir mais de um teste, variando apenas os argumentos:

```csharp
[TestCase(1)]
[TestCase(2)]
[TestCase(3)]
public void RestoDivisao_DeveRetornarZero(int value)
{
    Calculadora c = new Calculadora();
    var resultado = c.RestoDivisao(12, value);
    //Verifica se o resto da divisão é 0
    Assert.That(0, Is.EqualTo(resultado.resto));
}

```

Desta forma, para o NUnit estão sendo definidos três métodos de teste, por isso que ao executá-los é mostrado cinco testes:

![](https://dkrn4sk0rn31v.cloudfront.net/2019/09/12142903/execucao_teste_unitario_cinco_teste.png)

Por fim, para que a [cobertura dos testes](https://www.treinaweb.com.br/blog/analisando-cobertura-de-testes-em-aplicacoes-net-com-o-opencover/) seja 100%, vamos definir método de testes para os outros métodos da nossa classe de `Calculadora`:

```csharp
using NUnit.Framework;
using calculos;

namespace calculos.tests
{
    [TestFixture]
    public class CalculadoraTest
    {
        [Test]
        public void Soma_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.Soma(10, 20);
            //Verifica se o resultado é igual a 30
            Assert.That(30, Is.EqualTo(resultado));
        }

        [Test]
        public void RestoDivisao_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.RestoDivisao(10, 3);
            //Verifica se o quociente da divisão é 3 e o resto 1
            Assert.Multiple(() =>
            {
                Assert.That(3, Is.EqualTo(resultado.quociente));
                Assert.That(1, Is.EqualTo(resultado.resto));
            });
        }

        [TestCase(1)]
        [TestCase(2)]
        [TestCase(3)]
        public void RestoDivisao_DeveRetornarZero(int value)
        {
            Calculadora c = new Calculadora();
            var resultado = c.RestoDivisao(12, value);
            //Verifica se o resto da divisão é 0
            Assert.That(0, Is.EqualTo(resultado.resto));
        }

        [Test]
        public void Subtracao_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.Subtracao(20, 10);
            //Verifica se o resultado é igual a 10
            Assert.That(10, Is.EqualTo(resultado));
        }

        [Test]
        public void Divisao_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.Divisao(100, 10);
            //Verifica se o resultado é igual a 10
            Assert.That(10, Is.EqualTo(resultado));
        }

        [Test]
        public void Multiplicacao_DeveRetornarOValorCorreto()
        {
            Calculadora c = new Calculadora();
            var resultado = c.Multiplicacao(5, 2);
            //Verifica se o resultado é igual a 10
            Assert.That(10, Is.EqualTo(resultado));
        }
    }
}

```

[  ![Teste de Software Básico](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/teste-software.svg)   Curso Teste de Software Básico Conhecer o curso ](https://www.treinaweb.com.br/curso/teste-de-software-basico)

## Demais comparadores do NUnit

O exemplo mostrado aqui é simples, mas ele demonstra a importância da definição de testes em uma aplicação. Agora sempre que os métodos da classe `Calculadora` forem alterados, os testes podem ser executados e verificados se algum dos comportamentos existentes foi impactado com a alteração.

Neste exemplo é utilizado apenas o comparador de igualdade, que é um dos mais comuns. Você pode ver os demais comparadores disponíveis na [documentação do NUnit](https://github.com/nunit/docs/wiki/Constraints).

No meu próximo artigo abordarei o [XUnit](https://www.treinaweb.com.br/blog/testes-unitarios-no-c-com-o-xunit/), até lá :)

- [ #C# ](https://www.treinaweb.com.br/blog/tag/csharp)
- [ #Testes unitários ](https://www.treinaweb.com.br/blog/tag/testes-unitarios)
- [ #Teste de Software ](https://www.treinaweb.com.br/blog/tag/teste-de-software)
- [ #NUnit ](https://www.treinaweb.com.br/blog/tag/nunit)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/17134625/MSTEST-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ Testes unitários no C# com MSTest ](https://www.treinaweb.com.br/blog/testes-unitarios-no-c-com-mstest) 

     Testes unitários ajudam a garantir a qualidade de uma aplicação. Uma forma de garantir isso no C# é através da biblioteca MSTest. Veja como como utilizá-la.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/30170147/XUNIT-400x280.png)  [ Testes e Projetos ](https://www.treinaweb.com.br/blog/categoria/testes-e-projetos) 

     7 anos atrás

    ##  [ Testes unitários no C# com o xUnit ](https://www.treinaweb.com.br/blog/testes-unitarios-no-c-com-o-xunit) 

     Testes unitários ajudam a garantir a qualidade de uma aplicação. Uma forma de garantir isso no C# é através da biblioteca xUnit. Veja como como utilizá-la.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/10/06103451/cobertura-codigos-testes-automatizados-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Analisando a cobertura de testes em aplicações .NET com o OpenCover ](https://www.treinaweb.com.br/blog/analisando-cobertura-de-testes-em-aplicacoes-net-com-o-opencover) 

     Conheça o OpenCover, ferramenta open-source para análise de cobertura de testes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/04105137/tdd-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

    ##  [ Afinal, o que é TDD? ](https://www.treinaweb.com.br/blog/afinal-o-que-e-tdd) 

     Veja nesse artigo como funciona o TDD e quais seus benefícios.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/c-sharp-consumindo-apis-com-flurl-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ C# - Testando requisições com Flurl ](https://www.treinaweb.com.br/blog/c-testando-requisicoes-com-flurl) 

     Implemente testes unitários em requisições HTTP com o auxílio de Flurl.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/depura--o-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Depuração de código PHP ](https://www.treinaweb.com.br/blog/depuracao-de-codigo-php) 

     Como fazer a depuração de código PHP? Essa é uma dúvida recorrente do pessoal que está vindo de outras linguagens ou que está começando a escrever projetos um pouco mais complexos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/IDE-CSHARP-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     7 anos atrás

    ##  [ Principais IDEs para desenvolvimento C# ](https://www.treinaweb.com.br/blog/principais-ides-para-desenvolvimento-c) 

     Veja neste artigo as principais IDEs para desenvolvimento C#.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/introducao-ao-maven-aprenda-como-criar-e-gerenciar-projetos-java-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ Introdução ao Maven, aprenda como criar e gerenciar projetos Java ](https://www.treinaweb.com.br/blog/introducao-ao-maven-aprenda-como-criar-e-gerenciar-projetos-java) 

     Neste artigo veremos como instalar o Maven e como podemos utilizá-lo para nos auxiliar na criação e no gerenciamento de dependência de um projeto Java.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/IDE-PHP-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Principais IDEs para desenvolvimento PHP ](https://www.treinaweb.com.br/blog/principais-ides-para-desenvolvimento-php) 

     Veja neste artigo as principais IDEs para desenvolvimento PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/IDE-PYTHON-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     7 anos atrás

    ##  [ Principais IDEs para desenvolvimento Python ](https://www.treinaweb.com.br/blog/principais-ides-para-desenvolvimento-python) 

     Veja neste artigo as principais IDEs para desenvolvimento Python.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/relat-rio-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Relatório de cobertura de testes (Code Coverage) com o PHPUnit ](https://www.treinaweb.com.br/blog/relatorio-de-cobertura-de-testes-code-coverage-com-o-phpunit) 

     O PHPUnit é um framework para a criação de testes unitários. Nesse artigo vamos falar sobre a geração de relatórios de cobertura de testes (Code Coverage).

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/15163425/github-actions-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Integração contínua para aplicações PHP usando Github Actions ](https://www.treinaweb.com.br/blog/integracao-continua-para-aplicacoes-php-usando-github-actions) 

     Veja como usar Github Actions para criar um workflow de análise e teste do seu projeto desenvolvido em PHP

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **01h 41min 06s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
