[Artigo] Eu preciso mesmo de testes no meu projeto?
Vou comecar esse artigo com um ESTRIDENTE:
Qualidade é responsabilide de todo o time!
Não tem margem para discursão aqui, se voce faz codigo deveria estar preocupado com a qualidade.
se voce vive mesmo nesse século, qualidade não é assunto somente do time de QA.
Se voce é PROGRAMADOR, já sabe (ou pelo menos deveria mesmo saber) que testes são importes.
mas qual tipo de teste exatamente?
talvez já tenha ouvido:
Aqui na empresa, uma pessoa testa manualmente todas as versões do sistema
Essa pessoal é muito capaz e profissional, sempre atenta a novos BUGS os encontrando e avisando ao time de DEV antes da versão sair para os usuarios.
isso já funciona? de certa forma, funciona sim.
então não precisamos escrever aquele codigo de testes chato, CERTO?
ERRADO, TOTALMENTE ERRADO
- E se essa pessoa sair do projeto?
- E se o projeto crescer tanto que essa pessoa não consiga testar tudo a cada nova versão.
- E se por cansaço essa pessoa esquecer de testar uma funcionalide importante? sim é preciso levar em consideração em qualquer lugar que pessoas poder falhar
testes humanos são sim muito importantes, mas também são CAROS, e dão MUITO TRABALHO, precisamos de outras maneiras de testar a confiabilidade do nosso trabalho.
Então vamos explicar aqui os principais tipos de testes e como eles deveriam estar aplicados no seu projeto desde o dia zero.
- Testes unitário.
É a menor unidade de teste posssivel. se voce tem um if no seu código ele precisa ser testado.
fun String.numbersOnly(): String {
return Regex("[^0-9]").replace(this, "")
}
é uma função muito simples que remove tudo que não sejam numeros de uma string,
para testar bem isso, vamos precisar pensar nos cenarios que vamos usar,
por exemplo começando com letras no inicio no meio ou no final, com espaco em algum lugar.. emfim aqui uma input básico:
*------------*---------*---------------------------------------*
| Entra | Saida | O que fazer? |
*------------*---------*---------------------------------------*
| 123 | 123 | Não deve remover números |
| ABC123 | 123 | Deve remover letra no inico |
| 123ABC | 123 | Deve remover letras no final |
| AB123C | 123 | Deve remover letras no meio |
| AB 123 ADC| 123 | Deve remover espaços vazios |
*-----------*---------*------------------------------------------
assim vamos codar isso:
...
@Test
fun `should do not remove number`(){
assertEquals("123".numbersOnly(), "123")
}
@Test
fun `should remove letters on start`(){
assertEquals("ABC123".numbersOnly(), "123")
}
@Test
fun `should remove letters on end`(){
assertEquals("123ABC".numbersOnly(), "123")
}
@Test
fun `should remove letters on middle`(){
assertEquals("AB123Cda".numbersOnly(), "123")
}
@Test
fun `should remove empty spaces`(){
assertEquals("AB 123 ACD".numbersOnly(), "123")
}
...
Assim sendo, cada teste unitário deve ter um objetivo diferente, devemos pensar na maioria dos cenario relevantes.
- Testes do componente ou teste de integração
Esses são testes mais completos e realistas da aplicação. seria alguma coisa como:
Curl Post/Record
Se não entendeu, talves isso ajuda a entender:
- **Testes de fim-a-fim END-TO-END ou E2E **
São os testes mais completos possiveis, use com sabedoria.
No geral os testes do seu projeto deveriam estar distribuidos assim:
Teste unitário: 8090%15%
teste de componente: 5
teste E2E: <5%