Testes com Java

Basis Tecnologia da Informação S.A. - 2019

Porque devo escrever testes?

Os testes devem ser escritos a fim de evitar problemas com evoluções realizadas ao longo da fase de desenvolvimento das aplicações, a implementação dos testes nos dá uma visão completa do impacto que determinada manutenção e ou modificações de uma determinadas funcionalidades podem afetar seu sistema.

Quando Testar

É recomendável que se realize os testes durante todo o ciclo de vida da aplicação.

O que testar?

Tudo o que possa falhar

Tipos de Teste

  • Caixa Preta

  • Caixa Branca

Caixa Preta

Não conhecemos a estrutura interna do sistema. É também conhecido como teste funcional, pois é baseado nos requisitos funcionais do software. O foco, nesse caso, é nos requisitos da aplicação, ou seja, nas ações que ela deve desempenhar.

Caixa Branca

É uma técnica de teste que usa a perspectiva interna do sistema para modelar os casos de teste. No caso o código fonte, trabalhando o componente do software avaliando fluxo de dados, caminhos lógicos.

Metodologias de Teste

  • TDD

  • BDD

TDD

Test Driven Development ou Desenvolvimento orientado a Testes é uma técnica de desenvolvimento de software, onde os testes são criados antes do código. Esta técnica permite saber quais serão os comportamentos das funcionalidades antes da implementação.

Mantra TDD

tdd ciclo

BDD

Behavior Driven Development ou Desenvolvimento orientado a comportamento. São de dois tipos:

  • StoryBDD

  • SpecBDD

StoryBDD

Se preocupa mais com o comportamento de mais alto nível da aplicação

Exemplo: Checar se um determinado relatório é gerado e enviado por e-mail.

SpecBDD

Se preocupa mais com o comportamento de baixo nível da aplicação

Exemplo: Checa se determinado método gera corretamente um relatório a partir de um conjunto de dados e o envia por e-mail corretamente.

Diferenças

A diferença entres os dois está no escopo e na visão negocial, pois o StoryBDD possui uma visão mais gerencial

Exemplo: Essa funcionalidade deve gerar um relatório e me enviar por e-mail. Já o SpecBDD possui uma visão mais voltada para a funcionalidade em si

Exemplo: Este método deve receber um array de dados gerar um PDF e o envia-lo por e-mail.

Dublês de Teste

Mock

É um objeto que assume o papel de um outro objeto e registra as chamadas que ele recebe e permite verificação à posteriori das chamadas que recebeu.

Stub

É um objeto com estado pré-definido e comportamento fixo e previsível.

Spy

É um objeto semelhante ao Mock, mas não necessariamente subscreve o objeto inteiro. Pode ser criado à partir de objetos reais e subistituir somente os comportamentos desejados do objeto real.

Fake

É um objeto que contém implementação, geralmente diferente e/ou simplificada em relação a implementação de produção. (InMemDB)

Dummy

É um objeto cujo único intúito é preencher lacunas de dados. (Placeholder)

Testes

  • Unit Test

  • Funcional Test

  • Integration Test

  • Acceptance Test

Unit Test

Teste de Unidade ou Teste unitário é o responsável por testar cada unidade da aplicação isoladamente

Functional Test

Functional Test ou Teste Funcional é responsável por testar funcionalidades (requisitos funcionais) da aplicação, considerando apenas a sua entrada e sua saída.

Integration Test

Integration Test ou Teste de Integração é responsável por testar funcionalidades da aplicação considerando a interação entre os seus componentes.

Acceptance Test

Acceptance Test ou Teste de Aceitação é responsável por testar funcionalidades da aplicação levando em consideração os requisitos originais da aplicação em relação ao produto final.

JUnit5

O JUnit é um framework open-source, que facilita a criação e manutenção do código para a automação de testes com apresentação dos resultados.

JUnit 5 Modulos

  • JUnit Plataform - A base de estruturas de teste na JVM. Permite que os testes sejam executados a partir de um console, ou ferramentas como Maven e Gradle

  • JUnit Jupiter - Modelo de programação para escrever testes e extensões para JUnit

  • JUnit Vintage - Fornece um mecanismo de teste para executar testes JUnit 3 e JUnit 4.

Anotações JUnit

  • @Test - Marca o metodo que irá testar

  • @BeforeEach - Método executado antes de cada teste

  • @AfterEach - Método executado depois de cada teste

  • @BeforeAll - Método estático executado antes de todos os casos de testes

  • @AfterAll - Método estático executado após todos os casos de testes

Anotações JUnit4 x JUnit5

@Before

@BeforeEach

@After

@AfterEach

@BeforeClass

@BeforeAll

@AfterClass

@AfterAll

Anotações JUnit4 x JUnit5

@RunWith()

@ExtendWith()

@Test(expected = Foo.class)

Assertions.assertThrows(FooException.class)

@Test(timeout = 1)

Assertions.assertTimeout(Duration…​)

Ciclo de vida JUnit

ciclo junit

Mockito

Mockito é o framework de simulação mais popular para testar Java.

Tipos de Mocks

  • Mocks - Uma implementação falsa de uma classe usada para teste.

  • Spy - No Mockito Spy é Mock como Wrappers em torno do objeto real.

  • Stub - Um objeto com respostas predefinidas para chamadas de método

Anotações Mockito

@Mock

Usado para criar mock

@Spy

Usado para criar spy

@InjectMocks

Injetar mocks/spy em uma classe com testes

@Captor

Capura argumentos do Mock

Exemplos na prática

loja dominio