Unit Tests vale a pena?
Se há um assunto em desenvolvimento de software onde há bastante ceticismo quanto a seus benefícios, esse assunto é, sem dúvidas, testes unitários. O pensamento convencional e aparentemente lógico, tende a achar que escrever testes duplica o esforço e o tempo de programação.
Pesquisando sobre Unit tests, muitas vezes me deparei com frases como essa:
“Amo testes unitários, pois me possibilita fazer mudanças no código e ter certeza que não quebrei nada.“
Parece simples, mas os benefícios da aplicação de TDD nem sempre são óbvios, porém seu uso é indispensável para o desenvolvimento de software de qualidade.
Uso TDD não apenas porque Robert C. Martin e Martin Fowler dizem que é bom, mas me perguntando o porquê de usar e recomendar o uso de TDD, consegui obter as seguintes respostas:
1. Testes de unidade me permite realizar grandes alterações de código rapidamente e ter certeza que tudo continua funcionando, para isso eu não preciso de grandes sacrifícios, mas simplesmente criar e executar testes. Isso reduz tempo de desenvolvimento, minimiza a possibilidade de retrabalho e, consequentemente, traz economia para o projeto;
2. TDD me mostra quando parar de codificar um determinado ponto e passar para o próximo. Vou escrevendo um método e testando até que o TDD me avisa que não há mais nada a fazer;
3. Escrever código de produção e testes juntos faz seu trabalho ter mais qualidade. Isso porque o código fica mais objetivo, sem voltas e com um mínimo possível de complexidade;
4. Unit Tests me ajuda a entender melhor o design do código que estou desenvolvendo. Em vez de escrever códigos para fazer algo, vou delineando todas as condições e requisitos que o código precisa atender;
5. Os testes me dão um feedback visual instantâneo me avisando se estou no caminho certo ou não. Com certeza, há um efeito psicológico. É gratificante escrever uma condição, executar testes, ver os testes falharem, fazer a correção, rodar novamente os testes e ver uma linha verde sinalizando que tudo está funcionando;
6. Contrariando as crenças, escrever código com testes não torna o tempo desenvolvimento mais lento e não me faz codificar em dobro, muito pelo contrário, código testado tem mais qualidade, menos bugs, além de ser mais robusto. Outro ponto a ser considerado, é que códigos de testes são, geralmente, triviais e não sobrecarregam o trabalho.
7. Testes servem como documentação. Um código conciso é melhor do que muitos parágrafos de documentação;
8. Código testado não é uma garantia anti-bugs, mas reduz drasticamente a possibilidade de inserção de erros.
TDD é uma ótima prática, é algo viciante, mas isto acontece apenas quando começamos a entender os conceitos e obter os benefícios de seu uso. Independente do tamanho do projeto, testes unitários e integração deveriam ser obrigatórios.
Olá Marcelo, 🙂
A pergunta que eu faço é: Qual foi o é o custo de escrever e manter um código de teste?
Por exemplo, se você demorou 20 horas para fazer algo que faria em 10 sem testes unitários, e 5 horas para seguir um roteiro de testes mais abstrato, você no final das contas perdeu 5 horas fazendo testes unitários.
Eu não sei dizer se isso é um fato, mas ao que me parece, o sobrepeso de escrever testes unitários e mantê-los (o mais custoso) não é um custo irrelevante que deve ser assumido sem pensar.
Menos retrabalho, menos complexidade e demora na hora de dar manutenção, código mais enxuto e objetivo. Escrever código testado é pensar lá na frente e fazer algo com mais qualidade.
Marcelo, muito interessante o conceito. Sou designer e ilustrador e estou entrando na área de games, obviamente inciando também em programação. Ou seja, sou bem iniciante. Fazendo uma analogia com minha área, em design 3D há momentos que uma cena está tão complexa que curiosamente eu faço algo similar ao conceito que você explanou. Imaginando uma cena de uma cidade inteira em que eu tenha problemas no processo de renderização de um determinado objeto, eu isolo esse objeto em uma nova cena e lá eu testo e verifico o problema até descobrir se foi nesse objeto ou em outra coisa.
Em programação (C ou qualquer outra) isso que eu descrevi de isolar algo seria esse processo de testes que você comenta. Se sim, como seria um exemplo? Você isola trecho do código em um projeto novo, os compiladores tem recursos que ajudam nesses testes etc?
Bom minha dúvida é essa.
A definição de teste unitário é justamente essa que você citou e o próprio nome diz: testar unidades isoladamente. Alguns exemplos de testes na linguagem PHP você encontra no manual do PHPUnit(https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html). O conceito e lógica são os mesmos em outras linguagens. Obrigado pelo comentário!