Tecnologia / Artigos / O Guia Definitivo do Design de Software /
Teste tudo

Cléber

![furniture-shop.jpg](/files/156) *Photo by [Anastase Maragos](https://unsplash.com/@visualsbyroyalz) on [Unsplash](https://unsplash.com/s/photos/variety)* --- Digo, em cada teste unitário. Teste tudo. **Teste todo comportamento esperado**. É razoavelmente comum que testes de resposta a requisições a uma API, por exemplo, restrinjam-se a testar se determinada requisição retorna determinada resposta. Mas fica a questão: só o que queremos é que haja uma resposta em formato adequado? Por exemplo: um teste de CRUD, operação `PATCH` sobre um documento já existente: quais são os comportamentos esperados? Provavelmente você acabará com uma lista mais ou menos assim: 1. Não deve explodir; 2. Deve **alterar o documento** e persistir essas alterações no banco de dados; 3. Logar as ações; 4. Emitir uma resposta adequada. O teste de não-explosão, pelo menos, a gente consegue de graça, geralmente. Mas os demais também precisam ser testados, pois **são** comportamentos esperados. Cada um é livre para escolher como faz, mas eu gosto de ordenar os testes de comportamento dos mais "bobos" para os mais cruciais. Logging, por exemplo, apesar de importante, é um comportamento menos crítico do que a operação de CRUD em si. Mas também agrupo os mais cruciais por sua ordem lógica de execução, pois não gosto que os testes sejam complicados de entender (e geralmente quero que eles me ajudem a meio que "documentar" o comportamento do código em si). Logo, eu acabaria com uma lista de ações assim: 1. *Given* (configuração dos objetos no banco e eventuais *fixtures*) 2. *When* (simulação de um `PATCH`, seguindo nosso exemplo) 3. *Then* (as coisas que quero que sejam verdadeiras) 4. Fez o *logging*? 5. Alterou o registro no banco de dados? 6. Respondeu adequadametne? Foi um teste de *logging* que me mostrou, nesse *refactor* do artigo [Faça uma coisa por vez](https://mynotes.space/cleber/tecnologia/artigos/software-design/95), que minha função que cuidava disso tinha um erro, coisa que apenas lendo o código eu mesmo não percebi (que era: a mensagem de "terminou a execução" vinha depois de um `return`, então precisava estar dentro de um bloco `finally`). Testar tudo é mais ou menos como as pessoas que lidam com **armas**. Você já viu vídeos de profissionais? Tem lá duas pessoas falando sobre isso, e a arma troca de mãos. A primeira pessoa saca o pente, puxa o ferrolho, olha para ver se não tem uma bala ali, depois manda mais um "check-check" só para garantir e entrega a arma para a outra, com o cano apontando para o chão. Em seguida, a segunda pessoa pega a arma, saca o pente, puxa o ferrolho, olha para ver se não tem uma bala ali, depois manda mais um "check-check" só para garantir e só depois prossegue com o manuseio. Sim, é duplicado. Sim, a primeira pessoa já fez todas as checagens **na frente da segunda pessoa**, que estava prestando toda a atenção, e mesmo assim todo o procedimento é feito de novo. Por quê? Porque armas não são brinquedos e **eu** não devo confiar que se eu puxar o gatilho a bala não vai matar alguém baseado na **sua** checagem. É sério o bastante para que cada um seja absolutamente responsável pela segurança da operação. **É um risco que não se terceiriza**. Testes também são assim. **Não se terceiriza a segurança do projeto**. Não se diz "*ah, essa parte foi o Cléber quem programou, então com certeza não contém nenhum erro*". **Não!** O que não tem um bom teste para provar que está certo sempre estará potencialmente errado. É como ver um profissional extremamente experiente fazer toda a checagem de segurança em uma pistola, depois receber essa pistola e ouvir "*ela está segura, pode apontar para sua própria bunda e puxar o gatilho*". Olha, se isso fere os sentimentos do profissional, eu já peço desculpas, mas eu **vou** sacar o pente e **vou** puxar o ferrolho para ver se ali não tem uma bala e **vou** mandar um "check-check" "só pra garantir" (e **não vou** apontar uma arma para minha própria bunda, evidentemente). # Resumo * Teste todos os comportamentos desejados, não apenas os mais óbvios; * Não atire em sua própria bunda.

Curti

36 visitantes curtiram esse Item.

Anterior: Todo teste unitário começa com o banco zerado | Próximo: Fale inglês, não latim