Testes automatizados de software: Um guia prático
5/5
()
Sobre este e-book
Testar custa caro, é demorado e é chato. Mas tudo isso só é verdade, pois ainda delegamos essas tarefas para um ser humano. Este livro mostra de maneira prática como escrever um programa que fará esse teste por você!
Mergulhe de cabeça nessa ideia, aprenda a escrever testes automatizados, e passe a dormir bem, tranquilo, pois seu software agora funciona.
Leia mais títulos de Mauricio Aniche
Introdução à programação em C: Os primeiros passos de um desenvolvedor Nota: 4 de 5 estrelas4/5Orientação a Objetos e SOLID para Ninjas: Projetando classes flexíveis Nota: 5 de 5 estrelas5/5Test-Driven Development: Teste e Design no Mundo Real com PHP Nota: 0 de 5 estrelas0 notasTest-driven development: Teste e design no mundo real com Ruby Nota: 0 de 5 estrelas0 notas
Relacionado a Testes automatizados de software
Ebooks relacionados
Aplicações Java para a web com JSF e JPA Nota: 0 de 5 estrelas0 notasDesbravando Java e Orientação a Objetos: Um guia para o iniciante da linguagem Nota: 5 de 5 estrelas5/5Test-Driven Development: Teste e Design no Mundo Real com .NET Nota: 5 de 5 estrelas5/5Arquitetura de software distribuído: Boas práticas para um mundo de microsserviços Nota: 0 de 5 estrelas0 notasJavaScript Assertivo: Testes e qualidade de código em todas as camadas da aplicação Nota: 0 de 5 estrelas0 notasCanivete suíço do desenvolvedor Node Nota: 0 de 5 estrelas0 notasRefatorando com padrões de projeto: Um guia em Java Nota: 0 de 5 estrelas0 notasCaixa de Ferramentas DevOps: Um guia para construção, administração e arquitetura de sistemas modernos Nota: 0 de 5 estrelas0 notasJava SE 8 Programmer I: O guia para sua certificação Oracle Certified Associate Nota: 0 de 5 estrelas0 notasJava 8 Prático: Lambdas, Streams e os novos recursos da linguagem Nota: 5 de 5 estrelas5/5RSpec: Crie especificações executáveis em Ruby Nota: 0 de 5 estrelas0 notasVire o jogo com Spring Framework Nota: 0 de 5 estrelas0 notasFront-end com Vue.js: Da teoria à prática sem complicações Nota: 5 de 5 estrelas5/5Guia prático de TypeScript: Melhore suas aplicações JavaScript Nota: 0 de 5 estrelas0 notasDevOps na prática: Entrega de software confiável e automatizada Nota: 0 de 5 estrelas0 notaseXtreme Programming: Práticas para o dia a dia no desenvolvimento ágil de software Nota: 0 de 5 estrelas0 notasASP.NET Core MVC: Aplicações modernas em conjunto com o Entity Framework Nota: 5 de 5 estrelas5/5JPA Eficaz: As melhores práticas de persistência de dados em Java Nota: 0 de 5 estrelas0 notasArmazenando dados com Redis Nota: 0 de 5 estrelas0 notasIntrodução à computação: Da lógica aos jogos com Ruby Nota: 0 de 5 estrelas0 notasA lógica do jogo: Recriando clássicos da história dos videogames Nota: 0 de 5 estrelas0 notasProgramação Java Nota: 4 de 5 estrelas4/5Programação em C# Para Iniciantes Nota: 5 de 5 estrelas5/5Elasticsearch: Consumindo dados real-time com ELK Nota: 0 de 5 estrelas0 notasAzure: Coloque suas plataformas e serviços no cloud Nota: 0 de 5 estrelas0 notasJava 9: Interativo, reativo e modularizado Nota: 0 de 5 estrelas0 notasSistemas reativos: Não confundir com sistemas radioativos Nota: 0 de 5 estrelas0 notasTest-Driven Development: Teste e Design no Mundo Real Nota: 0 de 5 estrelas0 notasFragmentos de um programador: Artigos e insights da carreira de um profissional Nota: 5 de 5 estrelas5/5Coletânea Front-end: Uma antologia da comunidade front-end brasileira Nota: 0 de 5 estrelas0 notas
Aplicativos Empresariais para você
Pacote Microsoft Office Capacitação Nota: 0 de 5 estrelas0 notasExcel 2013 Técnicas Avançadas – 2ª edição Nota: 4 de 5 estrelas4/5Do Mil Ao Milhão Com Pouco Investimento: Guia Completo Nota: 0 de 5 estrelas0 notasA Bíblia Do Swing Trader Nota: 0 de 5 estrelas0 notasE-book Microsoft Excel 2010 Nota: 0 de 5 estrelas0 notasExcel Definitivo Nota: 0 de 5 estrelas0 notasCurso Excel Nota: 0 de 5 estrelas0 notasA Fórmula Do Afiliado Profissional Nota: 0 de 5 estrelas0 notasExcel para o dia a dia: Seus primeiros passos no mundo das planilhas Nota: 0 de 5 estrelas0 notas12 Técnicas Para Dominar As Planilhas Financeiras Nota: 0 de 5 estrelas0 notas47 Dicas Para Ganhar Na Mega-sena Nota: 0 de 5 estrelas0 notasExcel Avançado 2016/365: aplicado à administração Nota: 0 de 5 estrelas0 notasExcel Básico Nota: 0 de 5 estrelas0 notasMarketing Digital, Segredo Para Aumentar Suas Vendas Nota: 0 de 5 estrelas0 notasBitcoin Para Leigos Nota: 0 de 5 estrelas0 notasExcel De Zero Para Especialista Nota: 0 de 5 estrelas0 notasBusiness Intelligence: Implementar do jeito certo e a custo zero Nota: 4 de 5 estrelas4/5Power Bi Black Belt Nota: 0 de 5 estrelas0 notasDescomplicando Passo A Passo Nota: 0 de 5 estrelas0 notasScrum: Gestão ágil para produtos de sucesso Nota: 0 de 5 estrelas0 notasAprendendo A Programar Nota: 0 de 5 estrelas0 notasProgramação Para Internet Nota: 0 de 5 estrelas0 notasComo Crescer No Instagram E Se Tornar Um Influenciador De Sucesso No Instagram Nota: 0 de 5 estrelas0 notasProgramando Em Java Com Banco De Dados Nota: 0 de 5 estrelas0 notasFunções Financeiras Com Microsoft Excel Nota: 0 de 5 estrelas0 notasHtml - Passo A Passo Nota: 0 de 5 estrelas0 notasBI e Big Data Management Nota: 0 de 5 estrelas0 notasAbap Passo A Passo Nota: 0 de 5 estrelas0 notasConceitos Gerais De Business Intelligence Nota: 0 de 5 estrelas0 notasDo jeito certo: Gestão de produtos no mundo das startups Nota: 0 de 5 estrelas0 notas
Avaliações de Testes automatizados de software
1 avaliação0 avaliação
Pré-visualização do livro
Testes automatizados de software - Mauricio Aniche
Sumário
Quem sou eu?
Capítulo 1: Testes de Unidade
1.1 Um código qualquer
1.2 Implementando uma nova funcionalidade
1.3 O que aconteceu?
1.4 Olá mundo, JUnit!
1.5 Convenções na escrita de testes
1.6 Mas será que sou produtivo assim?
1.7 Testando o que realmente é necessário
1.8 Classes de equivalência
1.9 Import estático do Assert
1.10 A próxima funcionalidade: os 3 maiores lances
1.11 Testando casos especiais
1.12 A bateria de testes nos salvou mais uma vez!
1.13 Quais são as dificuldades?
1.14 Cuidando dos seus testes
1.15 Test Data Builders
1.16 @After, @BeforeClass e @AfterClass
1.17 Acoplamento entre testes e produção
1.18 Cuide bem dos seus testes
1.19 Testando exceções
1.20 Melhorando a legibilidade dos testes
1.21 100% de cobertura de testes?
Capítulo 2: Praticando Test-Driven Development (TDD)
2.1 Testes, do jeito que você já sabe
2.2 Mudando a maneira de desenvolver
2.3 Test-Driven Development
2.4 Efeitos no design de classes
2.5 Baby steps
2.6 Devo ver o teste falhar?
2.7 TDD 100% do tempo?
2.8 Onde posso ler mais sobre isso?
Capítulo 3: Mock Objects
3.1 Simulando a infraestrutura
3.2 Mock Objects
3.3 Mocks estritos e acoplamento
3.4 Fugindo de métodos estáticos
3.5 Garantindo que métodos foram invocados
3.6 Contando o número de vezes que o método foi invocado
3.7 Outros métodos de verificação
3.8 Mocks que lançam exceções
3.9 Simulando exceções
3.10 Capturando argumentos recebidos pelo mock
3.11 Isolando para testar
3.12 Criando abstrações para facilitar o teste
3.13 O que mockar e o que não mockar?
Capítulo 4: Testes de Integração
4.1 Devemos mockar um DAO?
4.2 Testando DAOs
4.3 Testando cenários mais complexos
4.4 Praticando com consultas mais complicadas
4.5 Testando alteração e deleção
4.6 Organizando testes de integração
Capítulo 5: Testes de Sistema
5.1 Automatizando o primeiro teste de sistema
5.2 Novamente, as vantagens do teste automatizado
5.3 Boas práticas: Page Objects
5.4 Testando formulários complexos
5.5 Classes de teste pai
5.6 Como limpar o banco em testes de sistema?
5.7 Requisições Ajax
5.8 Builders em testes de sistema
5.9 API para criação de cenários
Capítulo 6: Testes de serviços web
6.1 Usando o Rest-Assured
6.2 Testando JSONs
6.3 Enviando dados para o WebService
6.4 Outros recursos do Rest-Assured
Capítulo 7: E agora?
7.1 Não há mais nenhum tipo de teste?
7.2 Não preciso nunca de testes manuais?
7.3 Testes de sistema o tempo todo?
7.4 Onde posso falar mais sobre o assunto?
7.5 Obrigado!
Visite o site da Editora Casa do Código e conheça os livros com preços promocionais - www.casadocodigo.com.br.
Quem sou eu?
Meu nome é Mauricio Aniche, e trabalho com desenvolvimento de software há por volta de 10 anos. Em boa parte desse tempo, atuei como consultor para diferentes empresas do mercado brasileiro e internacional. Com certeza, as linguagens mais utilizadas por mim ao longo da minha carreira foram Java, C# e C.
Como sempre pulei de projeto em projeto (e, por consequência, de tecnologia em tecnologia), nunca fui a fundo em nenhuma delas. Pelo contrário, sempre foquei em entender princípios que pudessem ser levados de uma para outra, para que no fim, o código saísse com qualidade, independente da tecnologia.
Em meu último ano da graduação, 2007, comecei a ler mais sobre a ideia de testes automatizados e TDD. Achei muito interessante e útil a ideia de se escrever um programa para testar seu programa, e decidi praticar tudo isso, por conta própria, para entender melhor como funcionava.
Gostei muito do que vi. De 2007 em diante, resolvi praticar, pesquisar e divulgar melhor minhas ideias sobre o assunto. Comecei devagar, apenas blogando o que estava na minha cabeça e sobre o que gostaria de feedback de outros desenvolvedores. Mas para fazer isso de maneira mais decente, resolvi ingressar no programa de Mestrado da Universidade de São Paulo. Lá, pesquisei sobre os efeitos da prática de TDD no design de classes.
Ao longo desse tempo participei da grande maioria dos eventos relacionados ao assunto. Palestrei nos principais eventos de métodos ágeis do país (como Agile Brazil, Encontro Ágil), de desenvolvimento de software (QCON SP e DNAD), entre outros menores. Cheguei a participar de eventos internacionais também; fui o único palestrante brasileiro no Primeiro Workshop Internacional sobre TDD, em 2010, na cidade de Paris. Isso mostra também que tenho participado dos eventos acadêmicos. Em 2011, apresentei um estudo sobre TDD no WBMA (Workshop Brasileiro de Métodos Ágeis), e em 2012, no maior simpósio brasileiro sobre engenharia de software, o SBES.
Atualmente trabalho pela Caelum, como consultor e instrutor. Também sou aluno de doutorado pela Universidade de São Paulo, onde continuo a pesquisar sobre a relação dos testes de unidade e qualidade do código.
Portanto, esse é meu relacionamento com TDD e testes. Nos últimos anos tenho olhado-o de todos os pontos de vista possíveis: de praticante, de acadêmico, de pesquisador, de apaixonado, de frio. Esse livro é o relato de tudo que aprendi nesses últimos anos.
Capítulo 1:
Testes de Unidade
Com certeza, todo desenvolvedor de software já escreveu um trecho de código que não funcionava. E pior, muitas vezes só descobrimos que o código não funciona quando nosso cliente nos reporta o bug. Nesse momento, perdemos a confiança no nosso código (já que o número de bugs é alto) e o cliente perde a confiança na equipe de desenvolvimento (já que ela não entrega código de qualidade). Mas será que isso é difícil de acontecer?
1.1 Um código qualquer
Para exemplificar isso, imagine que hoje trabalhamos em um sistema de leilão. Nesse sistema, um determinado trecho de código é responsável por devolver o maior lance de um leilão. Veja a implementação deste código:
1 class Avaliador { 2 3 private double maiorDeTodos = Double.NEGATIVE_INFINITY; 4 5 public void avalia(Leilao leilao) { 6 7 for(Lance lance : leilao.getLances()) { 8 if(lance.getValor() > maiorDeTodos) { 9 maiorDeTodos = lance.getValor(); 10 } 11 } 12 } 13 14 public double getMaiorLance() { 15 return maiorDeTodos; 16 } 17 }
1 class TesteDoAvaliador { 2 3 public static void main(String[] args) { 4 Usuario joao = new Usuario(Joao
); 5 Usuario jose = new Usuario(José
); 6 Usuario maria = new Usuario(Maria
); 7 8 Leilao leilao = new Leilao(Playstation 3 Novo
); 9 10 leilao.propoe(new Lance(joao,300.0)); 11 leilao.propoe(new Lance(jose,400.0)); 12 leilao.propoe(new Lance(maria,250.0)); 13 14 Avaliador leiloeiro = new Avaliador(); 15 leiloeiro.avalia(leilao); 16 17 // imprime 400.0 18 System.out.println(leiloeiro.getMaiorLance()); 19 } 20 }
Esse código funciona. Ao receber um leilão, ele varre a lista buscando o maior valor. Veja que a variável maiorDeTodos é inicializada com o menor valor que cabe em um double. Isso faz sentido, já que queremos que, na primeira vez que o for seja executado, ele caia no if e substitua o menor valor do double pelo primeiro valor da lista de lances.
1.2 Implementando uma nova funcionalidade
A próxima funcionalidade a ser implementada é a busca pelo menor lance de todos. Essa regra de negócio faz sentido estar também na classe Avaliador. Basta acrescentarmos mais uma condição, desta vez para calcular o menor valor:
1 class Avaliador { 2 3 private double maiorDeTodos = Double.NEGATIVE_INFINITY; 4 private double menorDeTodos = Double.POSITIVE_INFINITY; 5 6 public void avalia(Leilao leilao) { 7 8 for(Lance lance : leilao.getLances()) { 9 if(lance.getValor() > maiorDeTodos) { 10 maiorDeTodos = lance.getValor(); 11 } 12 else if(lance.getValor() < menorDeTodos) { 13 menorDeTodos = lance.getValor(); 14 } 15 } 16 } 17 18 public double getMaiorLance() { return maiorDeTodos; } 19 public double getMenorLance() { return menorDeTodos; } 20 }
1 class TesteDoAvaliador { 2 3 public static void main(String[] args) { 4 Usuario joao = new Usuario(Joao
); 5 Usuario jose = new Usuario(José
); 6 Usuario maria = new Usuario(Maria
); 7 8 Leilao leilao = new Leilao(Playstation 3 Novo
); 9 10 leilao.propoe(new Lance(joao,300.0)); 11 leilao.propoe(new Lance(jose,400.0)); 12 leilao.propoe(new Lance(maria,250.0)); 13 14 Avaliador leiloeiro = new Avaliador(); 15 leiloeiro.avalia(leilao); 16 17 // imprime 400.0 18 System.out.println(leiloeiro.getMaiorLance()); 19 // imprime 250.0 20 System.out.println(leiloeiro.getMenorLance()); 21 } 22 }
Tudo parece estar funcionando. Apareceram na tela o menor e maior valor corretos. Vamos colocar o sistema em produção, afinal está testado!
Mas será que o código está realmente correto? Veja agora um outro teste, muito parecido com o anterior:
1 class TesteDoAvaliador { 2 3 public static void main(String[] args) { 4 Usuario joao = new Usuario(Joao
); 5 Usuario jose = new Usuario(José
); 6 Usuario maria = new Usuario(Maria
); 7 8 Leilao leilao = new Leilao(Playstation 3 Novo
); 9 10 leilao.propoe(new Lance(maria,250.0)); 11 leilao.propoe(new Lance(joao,300.0)); 12 leilao.propoe(new Lance(jose,400.0)); 13 14 Avaliador leiloeiro = new Avaliador(); 15 leiloeiro.avalia(leilao); 16 17 // imprime 400.0 18 System.out.println(leiloeiro.getMaiorLance()); 19 // INFINITY 20 System.out.println(leiloeiro.getMenorLance()); 21 } 22 }
Veja que, para um cenário um pouco diferente, nosso código