Pensando em Java
Turbinando seus testes
Turbinar os testes?
Mas eu sou desenvolvedor,
não faço testes!!!
Testes são de
responsabilidade da equipe
de qualidade.
O que podemos fazer como desenvolvedores ?
Testes de Unidade
Verifica uma unidade (a menor parte do software) para garantir que tem o comportamento esperado. Neste tipo
de teste, a unidade é testada de forma isolada, sem considerar nenhuma dependência ou integração
Testes de Integração
Verifica que uma unidade tem o comportamento esperado quanto funciona integrada com as partes das quais
depende. Pode verificar a integração entre uma classe e o banco de dados, entre um módulo e um web service,
etc.
Tipos de Teste
X de testes
Tipos de teste
https://martinfowler.com/bliki/TestPyramid.html
OK. Vou
tentar!!!
Por onde eu
começo ?
Testes de Unidade
Teste de Unidade
● Deve ser simples e sem dependências externas
● Sem anotações do tipo @SpringBootTest
● Pode ou não fazer uso de mock
● Princípio FIRST
FIRST: Fast, Independent, Repeatable, Self-Verifying, Timely
Exemplo de teste de unidade
Classe CalculadoraSimples com apenas um método
public double calcula(double val1, double val2, String
operador)
Uma Classe de teste usando JUnit
Teste de Unidade - F-I-R-S-T
● F: Fast. Tem que ser rápido do tipo menos de 1 segundo
● I: Independent. Um teste não pode depender de outro, inclusive podendo rodar em
qualquer ordem. Isolado
● R: Repeatable. Um teste pode ser executado quantas vezes eu quiser e quando eu
quiser e sempre deve retornar no mesmo resultado.
● S: Self-Verifying. Auto verificado. O teste deve saber quando sua execução foi correta
ou quando falhou. Uso de assert;
● T: Timely. Oportuno. O teste deve ser criado no momento certo.
Teste de Unidade - Padrão AAA
AAA (Arrange, Act, Assert)
● Cenário (Entrada). Pode ser no próprio método de teste ou nos métodos Before
● Ação. Executa a ação contra o método alvo
● Validação. Verifica o retorno
Teste de Unidade - Pacote
● A classe de teste deve obedecer a mesma estrutura de pacotes que a classe
alvo, pois é possível acessar as variáveis públicas, protegidas e default.
Caso contrário, somente as públicas serão visualizadas. Então a boa prática
é sempre deixar no mesmo pacote.
Teste de Unidade - Before e After
● Os métodos @Before e @After são executados respectivamente antes e
depois de cada teste. O Before é mais utilizado.
● Caso seu cenário seja utilizado por muitos testes e precise ser criado apenas
uma vez, utilize as anotações @BeforeClass e @AfterClass (ambos os
métodos devem ser estáticos)
Teste de Unidade - Ordem de execução
O Junit não garante a ordem de execução, por isso, não deixe seus testes
dependentes uns dos outros. Existem formas de fazer o Junit executar os testes
em sequência utilizando a anotação @FixMethodOrder, porém não é uma boa
prática.
Teste de Unidade - Asserts
● Assert.assertTrue
● Assert.assertFalse
● Assert.assertEquals
● Assert.assertThat with fluent interface
● Core Matchers hamcrest
Formas de organizar o teste
Várias assertivas podem ser problema no seu teste. Caso o teste falhe nas primeiras assertivas. Caso o cenário e ação forem os
mesmos, sem problemas ter vários asserts
Prós: concentra a lógica do mesmo teste
Cons: não é rastreável
Quando precisar agrupar muitos Asserts no teste, utilize o ErrorCollector
Teste de Unidade - Hamcrest vs. AssertJ
Teste de Unidade - Hamcrest vs. AssertJ
Testes de Unidade - Verificando a cobertura
Após escrever alguns testes, verificamos a cobertura.
Alto % de cobertura garante a qualidade?
Mocks
Testes de Unidade - Mocks
Testes de Unidade - Mockito
Testes de Unidade - Mock
Testes de Unidade - Mock
Teste Integrado
Teste Integrado
REST API
Database
Teste Integrado - Database
Testcontainers is a Java library that supports JUnit tests, providing lightweight,
throwaway instances of common databases, Selenium web browsers, or anything
else that can run in a Docker container.
+
Teste Integrado - Rest API
REST Assured is a Java DSL for simplifying testing of REST based services built on top
of HTTP Builder
Perguntas
Obrigado!
https://github.com/sandrogiacom
https://www.linkedin.com/in/sandrogiacomozzi

Pensando em java univali turbinando seus testes

  • 1.
  • 2.
    Turbinar os testes? Maseu sou desenvolvedor, não faço testes!!! Testes são de responsabilidade da equipe de qualidade.
  • 3.
    O que podemosfazer como desenvolvedores ? Testes de Unidade Verifica uma unidade (a menor parte do software) para garantir que tem o comportamento esperado. Neste tipo de teste, a unidade é testada de forma isolada, sem considerar nenhuma dependência ou integração Testes de Integração Verifica que uma unidade tem o comportamento esperado quanto funciona integrada com as partes das quais depende. Pode verificar a integração entre uma classe e o banco de dados, entre um módulo e um web service, etc.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
    Teste de Unidade ●Deve ser simples e sem dependências externas ● Sem anotações do tipo @SpringBootTest ● Pode ou não fazer uso de mock ● Princípio FIRST FIRST: Fast, Independent, Repeatable, Self-Verifying, Timely
  • 10.
    Exemplo de testede unidade Classe CalculadoraSimples com apenas um método public double calcula(double val1, double val2, String operador) Uma Classe de teste usando JUnit
  • 11.
    Teste de Unidade- F-I-R-S-T ● F: Fast. Tem que ser rápido do tipo menos de 1 segundo ● I: Independent. Um teste não pode depender de outro, inclusive podendo rodar em qualquer ordem. Isolado ● R: Repeatable. Um teste pode ser executado quantas vezes eu quiser e quando eu quiser e sempre deve retornar no mesmo resultado. ● S: Self-Verifying. Auto verificado. O teste deve saber quando sua execução foi correta ou quando falhou. Uso de assert; ● T: Timely. Oportuno. O teste deve ser criado no momento certo.
  • 12.
    Teste de Unidade- Padrão AAA AAA (Arrange, Act, Assert) ● Cenário (Entrada). Pode ser no próprio método de teste ou nos métodos Before ● Ação. Executa a ação contra o método alvo ● Validação. Verifica o retorno
  • 13.
    Teste de Unidade- Pacote ● A classe de teste deve obedecer a mesma estrutura de pacotes que a classe alvo, pois é possível acessar as variáveis públicas, protegidas e default. Caso contrário, somente as públicas serão visualizadas. Então a boa prática é sempre deixar no mesmo pacote.
  • 14.
    Teste de Unidade- Before e After ● Os métodos @Before e @After são executados respectivamente antes e depois de cada teste. O Before é mais utilizado. ● Caso seu cenário seja utilizado por muitos testes e precise ser criado apenas uma vez, utilize as anotações @BeforeClass e @AfterClass (ambos os métodos devem ser estáticos)
  • 15.
    Teste de Unidade- Ordem de execução O Junit não garante a ordem de execução, por isso, não deixe seus testes dependentes uns dos outros. Existem formas de fazer o Junit executar os testes em sequência utilizando a anotação @FixMethodOrder, porém não é uma boa prática.
  • 16.
    Teste de Unidade- Asserts ● Assert.assertTrue ● Assert.assertFalse ● Assert.assertEquals ● Assert.assertThat with fluent interface ● Core Matchers hamcrest Formas de organizar o teste Várias assertivas podem ser problema no seu teste. Caso o teste falhe nas primeiras assertivas. Caso o cenário e ação forem os mesmos, sem problemas ter vários asserts Prós: concentra a lógica do mesmo teste Cons: não é rastreável Quando precisar agrupar muitos Asserts no teste, utilize o ErrorCollector
  • 17.
    Teste de Unidade- Hamcrest vs. AssertJ
  • 18.
    Teste de Unidade- Hamcrest vs. AssertJ
  • 19.
    Testes de Unidade- Verificando a cobertura Após escrever alguns testes, verificamos a cobertura. Alto % de cobertura garante a qualidade?
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    Teste Integrado -Database Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. +
  • 28.
    Teste Integrado -Rest API REST Assured is a Java DSL for simplifying testing of REST based services built on top of HTTP Builder
  • 29.
  • 30.

Notas do Editor

  • #3 Se você pensa assim, pense novamente. Devops. você é responsável por aquilo que você produz Cada vez mais as empresas valorizam este tipo de profissional
  • #4 Porque eu deveria escrever um teste de soma?
  • #7 show calc code
  • #8 Exemplo de um teste estúpido. calculadora
  • #17 não consigo escrever teste do meu método. qual o problema? não sei escrever teste ou o design do metodo pode ser melhorado?
  • #18 AssertJ permite uso de autocomplete
  • #19 AssertJ permite uso de autocomplete
  • #22 Exemplo da CalculadoraService
  • #23 CalculadoraServiceTest
  • #24 CalculadoraServiceTest doNothing().when(repositorio).salvaCalculo(new Calculadora());
  • #28 throwaway instâncias descartáveis DbMigrationIT System.out.println("mysql --user=" + mySql.getUsername() + " --password=" + mySql.getPassword() + " " + mySql.getDatabaseName()); Thread.sleep(60 * 2000);
  • #29 UserControllerIT