A Pirâmide de teste e os Testes end-to-end

 





Testes “end-to-end” (E2E testing) são uma maneira de realizar testes atravessando todas as camadas da arquitetura de um sistema. Os testes são realizados do início ao fim, por exemplo, em uma arquitetura de sistema MVC (Model-View-Controller) os testes são realizados na camada de apresentação (view), validadando regras de negócio tratadas pelo controlador (controller) chegando até o modelo (model), onde os dados podem ser gravados e lidos a partir de um banco de dados.

No entanto, essa definição de E2E não parece muito diferente dos testes de sistema, que são testes que tratam o sistema como uma caixa-preta, cujos dados são passados em uma tela do sistema e o usuário recebe uma resposta na mesma interface do sistema.

Se observarmos a pirâmide de teste acima, nós percebemos que os testes E2E podem ser classificados como horizontal e vertical.
  • E2E horizontal: quando os testes são realizado em um mesmo nível de teste, considerando todos os fluxos do sistema. Tem como objetivo verificar se os componentes daquela camada, fazem o que deveriam fazer em um determinado contexto.
  • E2E vertical: quando os testes são realizados em vários níveis de teste. Dessa forma é possível identificar problemas nas diferentes camadas do sistema, desde o nível unitário até a integração de todos os componentes. Nesse caso o objetivo é verificar se cada camada do sistema funciona independentemente.

Através da pirâmide de teste, podemos observar que há diferenças conceituais entre testes E2E e testes de sistema.

Testes Funcionais

  1. O teste é limitado a uma única parte do código ou sistema.
  2. Garante que o software testado atende aos critérios de aceitação.
  3. Testa a maneira como um único usuário se envolve com o sistema.
  4. Valida o resultado de cada teste para entradas e saídas.

Testes End-to-End (E2E)

  1. O teste cruza vários sistemas e grupos de usuários.
  2. Garante que um sistema, ou parte dele, continue funcionando após alterações serem feitas.
  3. Testa a maneira como vários usuários interagem no sistema.
  4. Valida se cada etapa do processo foi concluída.

Pirâmide de Teste

Um ponto importante a se observar na Pirâmide de Teste é a sua forma, denotando a proporção de testes que devem ser realizados em cada nível de teste. Assim, os testes unitários devem ser realizados em maior quantidade, em seguida os testes de integração e por fim os testes de sistema.

Isso se deve ao fato que os testes que estão na base da pirâmide (testes unitários) possuem um custo de criação, execução e automação bem menor que os testes do topo da pirâmide. Além disso, em um cenário em que testes unitários e de integração são criados de forma efetiva, vários cenários de testes e regras de negócio podem ser validadas nesses níveis mais baixos. Com isso, é possível reduzir o número de testes de sistema (manuais e/ou automáticos) para os cenários de teste que já foram testados anteriormente em outros níveis.

Se quiser saber mais sobre pirâmide de teste, recomendo o artigo de Martin Fowler: https://martinfowler.com/bliki/TestPyramid.html

Ferramentas para E2E vertical

Testes de sistema (UI):
  • Selenium: realiza testes automáticos através da interface web de uma aplicação, independente da linguagem de programação que ela foi construída. Possui diferentes linguagens de programação, como python, java, ruby, etc. Tem fácil instalação, pois permite realizar testes através de um plugin para o navegador, utilizando o Selenium IDE, sem a necessidade de conhecimentos de programação.
  • Cypress: também realiza testes automáticos através da interface web de uma aplicação. Não depende da linguagem de programação utilizada no desenvolvimento. Os testes são construídos em JavaScript e requer a instalação do NodeJs, ou seja, conhecimentos de programação.

Testes de integração para APIs Rest
  • Cypress: permite realizar testes em API Rest. Os testes são escritos em JavaScript. Além disso, os testes podem ser agregados ao código do sistema, mas eles são executados de forma independente, sem nenhum vínculo às classes do sistema desenvolvido.

Testes unitários
  • JUnit: testes unitários padrão para a linguagem Java.
  • Mocha: testes unitários bastante utilizado por programadores JavaScript.
  • Jest: testes unitários desenvolvidos pelo Facebook e é bastante utilizado por programadores React.

Há outras ferramentas que podem ser utilizadas para outras finalidades. Gostei bastante do material desse blog abaixo: https://talkingabouttesting.com/2018/10/05/um-review-pessoal-de-ferramentas-para-testes-automatizados-no-mundo-javascript-parte-1/

Basicamente, a regra básica para garantir uma maior qualidade nos sistemas é comece a testar o mais cedo, se possível antes mesmo de criar a primeira linha de código. Separe os testes em diferentes níveis, para que cada tipo de teste detecte os possíveis erros de acordo com os objetivos de cada um. Não perca tempo testando o que já foi testado nos níveis anteriores.