Além dos Testes unitários: Não é somente escrever
Tags: testing, culture, qa, agile
Published: 2023-10-15 19:06:24

Este artigo expande o tópico anterior sobre [Como implementar uma Cultura de Testes Unitários na sua Equipe](https://dev.to/marlonbelomarques/como-implementar-uma-cultura-de-testes-unitarios-na-sua-equipe-2oc1). Mergulhando mais profundamente nos Testes Automatizados para impulsionar o Desenvolvimento Ágil.

_Agora que a sua equipe realiza entregas de funcionalidades com testes unitários. Os incidentes caíram em 90%, não existem mais bombeiros para apagar incêndio, os QAs não encontram mais bugs e estão destinados apenas em validar a qualidade do software. Bem, era isso que eu queria poder dizer, mas não é bem assim rs._

Ao alcançar entregas de funcionalidades com testes unitários, pode-se esperar uma significativa redução de incidentes e uma transição suave para uma cultura de desenvolvimento mais segura. No entanto, a realidade muitas vezes não reflete essa expectativa inicial, como será discutido ao longo deste artigo.

## Longo prazo vs Curto prazo

Aprender a arte dos testes unitários enquanto se realiza entregas de funcionalidades não é uma tarefa trivial e impacta o tempo de entrega. No entanto, esse esforço inicial é um investimento fundamental na qualidade a longo prazo. Além dos pontos negativos iniciais, como o esforço adicional e o aumento do tempo de entrega, os benefícios começam a surgir à medida que a equipe ganha experiência.

- **Esforço**: Obviamente, escrever testes unitários não é nada fácil. Além de ter que pensar em como validar uma funcionalidade, você tem que saber utilizar artifícios para que isso se torne possível. Alguns desses artifícios são por exemplo: Mock's, Spies etc.

- **Aumento do tempo de entrega**: Alinhado ao esforço, acaba-se levando mais tempo para entregar uma funcionalidade, é claro, além de implementar, ainda é necessário testar (que saco 😵‍💫).

Entregas mais rápidas tornam-se possíveis à medida que os desenvolvedores dominam a prática de escrever testes unitários, o que acaba levando a uma redução de bugs encontrados.

- **Entregas mais rápidas**: O que antes exigia um maior esforço, acabou-se tornando menos burocrático, devido a experiência obtida na arte de escrever testes unitários, levando a entregas mais rápidas.

- **Redução de bugs**: Isso, por sua vez, leva a uma redução significativa nos bugs encontrados durante as revisões das funcionalidades pelos QAs, resultando em menos incidentes após a implantação.

## Qualidade do Código

Muitos autores citam que os testes unitários devem ser tão legíveis quanto o código (ou talvez até mais), porém, como você vai escrever um teste legível se você ainda está sofrendo para fazê-lo passar?

A qualidade dos testes unitários é crucial para o sucesso a longo prazo. Embora, inicialmente, os testes possam parecer longos e complexos, a prática constante leva a uma compreensão mais clara e a testes mais eficientes. Com isso, surgem conceitos como Injeção de Dependência e Inversão de Dependência. Abordagens essas, não apenas aprimoram a legibilidade dos testes, mas também contribuem para um código mais limpo e menos acoplado.

## Os fantasmas voltam a assombrar a equipe

_Vocês estão indo bem, os testes unitários estão evoluindo, mais entregas sendo feitas com testes unitários. Vocês começam a definir uma régua para a Cobertura do Código. Agora todos tem o costume de rodar os testes unitários para verificar se a cobertura de código está sendo respeitada. Porém, o fantasma volta a te assombrar!_

Mesmo com o progresso, os testes unitários não são imunes a desafios. A questão dos [Testes Não-Determinísticos](https://martinfowler.com/articles/nonDeterminism.html) pode surgir, causando inconsistências nos resultados dos testes. (_Para que serve um teste que não podemos confiar? De nada!_) 

Martin Fowler sugere uma solução prática: mover esses testes para quarentena. Isso envolve segregá-los para que não impactem a confiança nos testes unitários enquanto são analisados e corrigidos.

## Integração Continua

Após superar desafios, a equipe amadurece para adotar os Testes Unitários como métrica de confiança e qualidade do software. A Integração Contínua, ativada sempre que um PR é feito para a branch de desenvolvimento, desempenha um papel crucial nesse processo. Alguns pontos importantes a serem seguidos incluem:

- Com o consentimento da equipe, não reduzir a régua da cobertura dos testes unitários.
- O PR não é mesclado se a cobertura ficar abaixo do estipulado.
- Se algum teste quebrar durante a varredura dos testes unitários, o PR não é mesclado até que o teste seja corrigido.

Por fim, algo de suma importância é não dar um passo para atrás. No decorrer desse processo, você pode se deparar com cenários como: Remover a régua da cobertura dos testes unitários, ou abrir uma exceção para um PR de incidente etc. Esses são males que você deve resistir se quiser alcançar um software de qualidade.

## Conclusão

Escrever testes unitários vai além da codificação; é uma questão cultural e organizacional. Embora inicialmente desafiador, o investimento em práticas eficazes de testes unitários resulta em entregas mais rápidas, qualidade de código aprimorada e uma experiência mais estável para os usuários. Como defensores da Qualidade de Software, é crucial manter a integridade dos testes unitários, apoiando a equipe para alcançar a cobertura desejada. Em última análise, aproveitar todo o potencial dos testes unitários exige uma abordagem holística e contínua.