AEXO TI
Boas práticas de desenvolvimento Orientado
a Testes (TDD)
Separação de Conceitos
Testes manuais
Testes de Unidade
Testes de Integração
Testes de Aceitação
Testes de Carga
Testes de...
Anatomia de Teste (jUnit)
Um teste deve testar apenas uma pequena
funcionalidade
Deve ser claro o que o teste deve fazer
Exemplo:
Teste conciso?
Diz claramente o que
está sendo testado?
public class RotinaBackupTest {
public void setup() {.......
Exemplo:
Diz
claramente
o que está
sendo
testado
AGORA?
public class RotinaBackupTest {
@Test
public void deveriaCriarArqu...
Nomes são importantes
Lembre-se quando você bater o olho no
método do teste, você deve saber exatamente
o que está sendo t...
Testes de integração
Testam a interação entre componentes do
sistema
Usado geralmente nas fronteiras do sistema:
Banco de ...
Testes de integração
Devem ser isolados também, pois o
comportamento deve ser repetitível.
São mais difíceis de ser escrit...
Outros tipos de testes
Testes de aceitação - testes desenvolvidos
para que o usuário final possa averiguar se o
sistema es...
Outros tipos de testes
Testes de carga: testes que tem como
premissa gerar um carga no sistema simulando
o seu comportamen...
Outros tipos de testes
Testes de Stress: testes que tem como
premissa gerar um stresse no sistema para ver
como ele se com...
Piramide de testes
99% do código deve ser testado
60% deve ser testado
10% deve ser testado
Cobertura do teste
Problemas comuns nos testes
Os testes de unidade devem ser isolados:
● somente uma classe deve ser testada
● Dependências ...
Mockito
Biblioteca usada para fazer mocks de classes
Permite definir o comportamento das
dependencias
Simples de usar
Exemplo:
public class CadastroDeUsuarioActionTest {
@Mock
private GerenciadorUsuarios gerenciadorUsuarios;
@Mock
private M...
Exemplo: Continuação
@Test
public void deveriaEmitirAlertaParaUsuarioParaErrosDeCadastramentoNoGerenciadorUsuarios(){
Usua...
DSL para gravação comportamento
doReturn(usuario).when(cadastroUsuario).salvar(usuario);
doCallRealMethod().when(cadastroU...
Lembrete:
Use static imports:
HamCrest
Biblioteca para gerar asserções
Melhor que asserts do junit
possui dsl para tratamento de asserções
Exemplo: Hamcrest
assertThat(usuario, is(notNullValue()));
// coleções
assertThat(usuario, isIn(usuarios));
assertThat(usu...
Lembrete:
static imports amém!
Finalmente:
Dicas finais:
Jcobertura - dedo duro do codigo não testado
SonarQube já tem jcobertura por padrão para
os proj...
Fim
Próximos SlideShares
Carregando em…5
×

Aexo TI - Boas práticas de testes tdd

406 visualizações

Publicada em

Boas práticas de desenvolvimento orientado a testes.

Publicada em: Software
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Aexo TI - Boas práticas de testes tdd

  1. 1. AEXO TI Boas práticas de desenvolvimento Orientado a Testes (TDD)
  2. 2. Separação de Conceitos Testes manuais Testes de Unidade Testes de Integração Testes de Aceitação Testes de Carga Testes de Stress
  3. 3. Anatomia de Teste (jUnit) Um teste deve testar apenas uma pequena funcionalidade Deve ser claro o que o teste deve fazer
  4. 4. Exemplo: Teste conciso? Diz claramente o que está sendo testado? public class RotinaBackupTest { public void setup() {.... } public void tearDown() {..... } @Test public void testBackup() { ... } }
  5. 5. Exemplo: Diz claramente o que está sendo testado AGORA? public class RotinaBackupTest { @Test public void deveriaCriarArquivoTemporarioAoRealizarBackup() { ... } @Test public void deveriaCompactarArquivoAoFinalizarBackup() { ... } }
  6. 6. Nomes são importantes Lembre-se quando você bater o olho no método do teste, você deve saber exatamente o que está sendo testado.
  7. 7. Testes de integração Testam a interação entre componentes do sistema Usado geralmente nas fronteiras do sistema: Banco de dados Acesso a Ldap Leitura de arquivos etc...
  8. 8. Testes de integração Devem ser isolados também, pois o comportamento deve ser repetitível. São mais difíceis de ser escritos. bibliotecas que ajudam: DBUnit - permite mockar banco de dados Unboundid - instancia um servidor de ldap Jetty - pemite subir um container de servlet Etc...
  9. 9. Outros tipos de testes Testes de aceitação - testes desenvolvidos para que o usuário final possa averiguar se o sistema está tendo o comportamento esperado, devido a fragilidade destes testes, são raramente implementados. Ferramentas: Selenium, Phantomjs, Capybara, etc...
  10. 10. Outros tipos de testes Testes de carga: testes que tem como premissa gerar um carga no sistema simulando o seu comportamento quando diversos usuários estão usando o programa. Ferramentas: JMetter, apache AB, Selenium Grid, etc...
  11. 11. Outros tipos de testes Testes de Stress: testes que tem como premissa gerar um stresse no sistema para ver como ele se comporta. Será que vai perder dados? Será que o número do pool está bem escalonado? Ferramentas: JMetter, apache AB, etc...
  12. 12. Piramide de testes 99% do código deve ser testado 60% deve ser testado 10% deve ser testado Cobertura do teste
  13. 13. Problemas comuns nos testes Os testes de unidade devem ser isolados: ● somente uma classe deve ser testada ● Dependências devem ser mockadas
  14. 14. Mockito Biblioteca usada para fazer mocks de classes Permite definir o comportamento das dependencias Simples de usar
  15. 15. Exemplo: public class CadastroDeUsuarioActionTest { @Mock private GerenciadorUsuarios gerenciadorUsuarios; @Mock private MensagensTela mensagensTela; private CadastroUsuarioAction cadastroUsuario; @Before public void setup(){ // use static imports para classes mockito initMocks(this); cadastroUsuario = new CadastroUsuarioAction(); cadastroUsuario.gerenciadorUsuarios = gerenciadorUsuarios; cadastroUsuario.mensagensTela = mensagensTela; }
  16. 16. Exemplo: Continuação @Test public void deveriaEmitirAlertaParaUsuarioParaErrosDeCadastramentoNoGerenciadorUsuarios(){ Usuario usuario = new Usuario(); doThrow(new CadastroInconsistenteException()).when(gerenciadorUsuarios).salvar(usuario); cadastroUsuario.salvar(usuario); verify(mensagensTela).adicionarMensagemErro("Cadastro inconsistente"); } }
  17. 17. DSL para gravação comportamento doReturn(usuario).when(cadastroUsuario).salvar(usuario); doCallRealMethod().when(cadastroUsuario).salvar(usuario); doAnswer(answer).when(cadastroUsuario).salvar(usuario); doThrow(toBeThrown).when(cadastroUsuario).salvar(usuario); reset(cadastroUsuario);
  18. 18. Lembrete: Use static imports:
  19. 19. HamCrest Biblioteca para gerar asserções Melhor que asserts do junit possui dsl para tratamento de asserções
  20. 20. Exemplo: Hamcrest assertThat(usuario, is(notNullValue())); // coleções assertThat(usuario, isIn(usuarios)); assertThat(usuarios, hasItems(helena,joana)); // reflections assertThat(usuario, hasProperty("nome")); assertThat(usuario, hasProperty("nome",is("carlos"))); assertThat(nomeUsuario, not(is("carlos"))); assertThat(saldoConta, is(positivo)); // milagre
  21. 21. Lembrete: static imports amém!
  22. 22. Finalmente: Dicas finais: Jcobertura - dedo duro do codigo não testado SonarQube já tem jcobertura por padrão para os projetos analisados. Use TDD (tente pelo menos), o efeito colateral é que já terá um teste implementado para cada implementação de código que fizer.
  23. 23. Fim

×