Basis Tecnologia da Informação S.A. - 2019
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.
É recomendável que se realize os testes durante todo o ciclo de vida da aplicação.
Tudo o que possa falhar
Caixa Preta
Caixa Branca
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.
É 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.
TDD
BDD
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.

Behavior Driven Development ou Desenvolvimento orientado a comportamento. São de dois tipos:
StoryBDD
SpecBDD
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.
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.
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.
É 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.
É um objeto com estado pré-definido e comportamento fixo e previsível.
É 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.
É um objeto que contém implementação, geralmente diferente e/ou simplificada em relação a implementação de produção. (InMemDB)
É um objeto cujo único intúito é preencher lacunas de dados. (Placeholder)
Unit Test
Funcional Test
Integration Test
Acceptance Test
Teste de Unidade ou Teste unitário é o responsável por testar cada unidade da aplicação isoladamente
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 ou Teste de Integração é responsável por testar funcionalidades da aplicação considerando a interação entre os seus componentes.
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.
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 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.
@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
@Before | @BeforeEach |
@After | @AfterEach |
@BeforeClass | @BeforeAll |
@AfterClass | @AfterAll |
@RunWith() | @ExtendWith() |
@Test(expected = Foo.class) | Assertions.assertThrows(FooException.class) |
@Test(timeout = 1) | Assertions.assertTimeout(Duration…) |

Mockito é o framework de simulação mais popular para testar Java.
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
@Mock | Usado para criar mock |
@Spy | Usado para criar spy |
@InjectMocks | Injetar mocks/spy em uma classe com testes |
@Captor | Capura argumentos do Mock |
