1 of 35

Introdução ao TDD e Testes Unitários Automatizados

Java - Spring Boot - JUnit5

2 of 35

Conteúdo

  • Pirâmide de Testes
  • TDD
  • Junit5
  • Aplicação de Exemplo

3 of 35

Pirâmide de Testes

4 of 35

Alguns tipos de testes

  • Unit Tests : Testam a menor unidade de código possível. Ex: Classes.
  • Integration Tests: Testam a integração das unidades, por exemplo, um endpoint em uma API.
  • Component Tests: Testam um componente, por exemplo um módulo, isolado.
  • System Tests: Testam o sistema como um todo, ou seja, todos os módulos e componentes através das operações do negócio.

5 of 35

Alguns tipos de testes

Em relação a execução:

  • Testes Automatizados: menos custosos. Unit Test, Integration Test, Component Test.
  • Testes Manuais: mais custosos, System Test, UI Test

6 of 35

TDD - Test Driven Development

7 of 35

TDD - Test Driven Development

TDD pode ser aplicada a vários tipos de testes, mas também é muito útil para os testes unitários.

8 of 35

TDD - Test Driven Development.

1 - Entenda bem o requisito a ser construído. Pense nas classes/interfaces. Crie os Dto’s, Models, Entities e classes de apoio.

2 - Crie a classe de teste; todos os métodos devem falhar.

3 - Implemente os métodos da classe a ser testada.

4 - Rode os testes novament, até que todos passem.

5 - Refatore.(Clean Code)

6 - Rode os testes...

9 of 35

TDD - Test Driven Development.

10 of 35

TDD - Test Driven Development com Unit Tests.

Lembre-se: somente a classe em questão deve ser testada, todas as suas dependências devem ser simuladas (mocks).

11 of 35

TDD - Dicas para os Unit Tests

  • A classe de teste deve ser fácil de fazer e de entender, o mais simples possível. Se ficar muito complicado, então pode-se avaliar refatoração ou mesmo deixar o teste para um segundo momento.
  • Testes unitários não devem subir o contexto da aplicação durante sua execução, pois todas as depêndicas devem ser mocadas.

12 of 35

TDD - Dicas para os Unit Tests

Coloque nomes claros para os métodos de testes, indicando o método que será testado e o que deve acontecer:

13 of 35

TDD - Dicas para os Unit Tests

  • Use as palavras Given, When, Then e Should como guias para construir o teste e até mesmo na nomenclatura.
  • Use o comando Verify para ter certeza de que métodos em classes referenciadas foram chamados.

14 of 35

15 of 35

TDD - Frameworks

  • JUnit4
  • JUnit5
  • TestNG
  • JBehave (BDD)
  • Mockito
  • Hamcrest (matchers->assertions)

16 of 35

JUnit 5

O SpringBoot 2.2.0 já vem com o JUnit5, Mockito e Hamcrest. (Spring boot starter test)

17 of 35

JUnit 5

Algumas anotações:

@Test = define um método de teste.

@BeforeEach = anota um método para rodar antes de cada teste.

@AfterEach = anota um método para executar depois de cada teste.

@BeforeAll = anota um método estático para ser executada antes da instanciação da classe.

@AfterAll = anota um método estático para ser executada depois da execução de todos os testes

@DisplayName = permite descrever o teste em alto nível.

@Mock = define um mock, mas não o inicializa. Para isso, use: MockitoAnnotations.openMocks(this);

18 of 35

JUnit 5

@TestInstance([Lifecicle])

Esta anotação define o cliclo de vida da classe de teste:

  • LifeCycle.PER_METHOD = para cada método de teste será criada uma instância da classe. Default.
  • LifeCycle.PER_CLASS = será criada apenas uma instância da classe.

19 of 35

Execução dos testes

  • Os testes podem ser executados através do IDE via plugins.
  • Pelo maven, através do plugin surefire: mvn clean test
  • Em esteiras de CI/CD através do jenkins/maven e outros.

20 of 35

Aplicação de Exemplo: Account-Api

21 of 35

Aplicação de Exemplo: Account-Api

  • A criação da conta precisa ser validada pelo financeiro através do id do correntista.
  • Empréstimos (Loan) precisam ser validados pelo financeiro.
  • Operações de saque e depósito (Withdraw and Deposit) precisam ter valores menores ou iguais ao limite da conta.
  • Atualizar o saldo da conta ao final das operações Loan, Deposit e Withdraw.

22 of 35

Aplicação de Exemplo: Account-Api

23 of 35

Aplicação de Exemplo: Account-Api

24 of 35

Aplicação de Exemplo: Account-Api

25 of 35

Aplicação de Exemplo: AccountService

26 of 35

Aplicação de Exemplo: AccountService

27 of 35

Aplicação de Exemplo: AccountService

28 of 35

Aplicação de Exemplo:teste do serviço

29 of 35

30 of 35

31 of 35

Teste da operação de Empréstimo

32 of 35

Teste da operação de Empréstimo

33 of 35

Teste da operação de Empréstimo - service

34 of 35

35 of 35

Obrigado!

O projeto completo pode ser clonado em:

https://github.com/alabvix/account-api

Referências:

JUnit5

Pirâmide de Testes

TDD