Unidade, integração ou sistema? Qual teste fazer?

Uma confusão bastante comum na comunidade de desenvolvimento é justamente sobre qual nome dar para o tipo de teste. Esse é um teste de unidade, integração ou sistema? Apesar de parecer uma discussão boba, é importante que desenvolvedores usem os mesmos termos para se comunicar; isso facilita e acelera o entendimento.

Um teste de unidade é aquele que testa uma única unidade do sistema. Ele a testa de maneira isolada, geralmente simulando as prováveis dependências que aquela unidade tem. Em sistemas orientados a objetos, é comum que a unidade seja uma classe. Ou seja, quando queremos escrever testes de unidade para a classe Pedido, essa bateria de testes testará o funcionamento da classe Pedido, isolada, sem interações com outras classes.

Um teste de integração é aquele que testa a integração entre duas partes do seu sistema. Os testes que você escreve para a sua classe PedidoDao, por exemplo, onde seu teste vai até o banco de dados, é um teste de integração. Afinal, você está testando a integração do seu sistema com o sistema externo, que é o banco de dados. Testes que garantem que suas classes comunicam-se bem com serviços web, escrevem arquivos texto, ou mesmo mandam mensagens via socket são considerados testes de integração.

Já um teste de sistema garante que o sistema funciona como um todo. Este nível de teste está interessado se o sistema funciona como um todo, com todas as unidades trabalhando juntas. Ele é comumente chamado de teste de caixa preta, já que o sistema é testado “com tudo ligado”: banco de dados, serviços web, batch jobs, e etc. Os testes de aceitação, famosos com a onda ágil, são, no fim, testes de sistema. Testes de aceitação são aqueles onde as equipes ágeis dizem se uma determinada funcionalidade está “aceita” ou não.

Independente do nível do teste, todos eles tem vantagens e desvantagens. Um teste de unidade, por exemplo, é bastante fácil de ser e roda muito fácil; mas não é um teste que simula bem o mundo real. Por outro lado, um teste de sistema faz uma simulação bastante real, mas é muito mais difícil de ser escrito, dá mais trabalho de manutenção e leva mais tempo para executar.

Mas qual nível de teste usar então? A ideia é que você escolha o nível de teste certo para aquele problema. Uma classe de negócio pode ser testada de maneira isolada; já um DAO precisa ser testado junto a um banco de dados. Lembre-se: o teste deve dar feedback rico; um teste que nunca quebra não serve de nada.

Por curiosidade, é comum que as pessoas digam testes unitários ao invés de testes de unidade. Escrevi um e-mail para a ABL (Associação Brasileira de Letras) alguns anos atrás e a resposta foi que o termo correto seria “testes de unidade”, mas como o termo “testes unitários” é bastante comum na área, ele também pode ser usado. Eu, particularmente, prefiro testes de unidade.

A discussão sobre testes e seus níveis vai longe. Discutimos muito isso em nossos livros, nos cursos online de testes automatizados do Alura e nos nossos cursos. E você, usa alguma nomenclatura diferente nos seus testes?

17 Comentários

  1. Nykolas Lima 02/07/2014 at 10:26 #

    Muito bom o post Aniche!

    Muitas pessoas acabam sendo “radicais” de escolher fazer ou testes de unidade ou de integração. E acabam por ter uma suite de testes que ou não trazem muita segurança(só unitários) ou que tem um feedback muito demorado(só integração).
    Acho que o segredo está no bom senso, escrever testes de unidade durante a fase de desenvolvimento, para te ajudar com um feedback constante do que está sendo feito e fechar com chave de ouro com um teste de integração para garantir que tudo está funcionando como deveria.

  2. Denilson Telaroli 03/07/2014 at 08:57 #

    Muito bom mesmo.

    Quanto ao nome, acredito que é porque é mais fácil falar testes unitários pela dinâmica dos fonemas e pela preguiça de falar uma palavra de duas letras a mais.

  3. Raphael Lacerda 04/07/2014 at 11:20 #

    Muito bom Aniche!

    Post básico, esclarecedor e beeemmm didático.

    Cansei já de explicar pra Gerente que fala Testes de Unidade como se fosse Testes de Sistema.

    Vou só passar o link do post agora

  4. Jonatas Fazer 04/07/2014 at 20:30 #

    ficou muito bom e claro o post! parece coisa “”básica”” mas é essencial ter as definicoes bem esclarecidas para melhor comunição de quem faz parte!

  5. Rafael Ponte 07/07/2014 at 15:34 #

    Muito bom o post, Aniche.

    Esclarecer a diferença entre cada um ajuda bastante na comunicação da equipe e mesmo durante a escrita e organização de cada teste no projeto.

  6. Bernardo 09/07/2014 at 18:51 #

    No meu projeto atual passei por uma grande confusão da equipe sobre o que deve ser testado. Uma aplicação em Grails aplicando o MVC e não se tinha certeza do que deveria testar. Controller, Services, Domains? O que é unitário e o que é integrado?

    Defendi exatamente esses pontos do post. Precisa encontrar o teste certo para a situação em sim?

    Muito bom ter 100 testes unitários implementados na Classe e sem nenhuma quebra. Mas o que isso te garante? Esse é o ponto.

  7. Dilnei Cunha 16/07/2014 at 14:27 #

    Ótimo post, simples, mas muitos não sabem 🙂

  8. Diogo Fernandes 23/07/2014 at 12:41 #

    Parabéns! pois o texto está muito claro e bem explicado sobre os testes de unidade, de integração e de sistema e qual a vantagem/onde de se aplicar cada um.

  9. Sidney Amaral 27/04/2015 at 15:59 #

    Toda iniciativa de difusão de conhecimento merece parabéns, então, como seu post ajuda a comunidade neste sentido: parabéns!!

    Só gostaria de fazer uma observação sobre a afirmação “… teste de sistema … é comumente chamado de teste de caixa preta”. Ainda que (sintaticamente) não esteja afirmando que ‘teste de sistema’ e ‘teste e caixa preta’ são a mesma coisa, o texto leva o leitor à esta conclusão.

    Um teste de sistema/aceitação é um teste que segue a técnica de testar software chamada “caixa preta” (http://pt.wikipedia.org/wiki/Teste_de_software#Caixa-preta).

    Abraço e mais uma vez, parabéns.

  10. Marcio 02/07/2015 at 16:13 #

    Excelente post!! Parabéns pela didática e por abordar um assunto de extrema importância para quem trabalha com sistemas de informação.

  11. Diego 17/07/2015 at 23:57 #

    Dúvida: se faço um teste de integração, mas utilizo um mock no lugar do serviço externo, o teste ainda deve ser considerado um teste de integração, eu seria melhor classificado como de unidade?
    A propósito, gostei muito do post, parabéns pela iniciativa.

  12. claudio 13/09/2015 at 20:26 #

    Ola , eu gostaria de saber mais sobre teste de sistemas, sei que é teste de caixa preta , mas gostaria de algo mais profundo ? como é testado? algo mais aprofundado? alguma dica ?

  13. Heber 06/10/2015 at 09:33 #

    Muito boa a abordagem sobre o assunto, simples mas ao mesmo tempo muito bem explicativa
    Parabens e obrigado!

  14. Sousa 23/02/2017 at 19:00 #

    Obrigado, muito útil.

Deixe uma resposta