Escolar Documentos
Profissional Documentos
Cultura Documentos
DE TESTES
QUEM SOU EU?
Jefferson Cavalcante
Pessoas e Ferramentas
Testes de aceitação
Inputs da turma
Simplificação do trabalho, ganho de tempo
Introducao de melhoria impactava outras funcionalidades
Lenvanta-se duvidas se o sistema continua funcionando
corretamente
Quando o software era planejado “de uma vez”, sabia-se o que e como testar com bastante
antecedência
Descobriu como caças F-86 americanos venciam caças MIG-15 russos muito
superiores
Pequenos movimentos mas com menos esforço físico (manche hidráulico) garantiam mais
vitórias
Nesse cenário, testar cada entrega manualmente pode tomar MUITO tempo do time
DA CASCATA AO ÁGIL
Nesse cenário, testar cada entrega manualmente pode tomar MUITO tempo do time
https://medium.com/background-thread/accidental-and-essential-complexity-programming-word-of-the-day-b4db4d2600d4
COMPLEXIDADE DO SISTEMA
Complexidade inerente
No desenvolvimento de sistemas, é inevitável adicionar complexidade ao se implementar uma nova
feature
Mesmo que ela tenha sido muito bem projetada e com antecedência
COMPLEXIDADE DO SISTEMA
Essa complexidade que poderia ser reduzida é parte natural de todo desenvolvimento de software
COMPLEXIDADE DO SISTEMA
Essa complexidade que poderia ser reduzida é parte natural de todo desenvolvimento de software
Complexidade acidental
COMPLEXIDADE DO SISTEMA
Leva-se mais tempo para adicionar features, testar tudo, corrigir bugs
Refatoração do código deve ser feita de forma regular, sempre seguida de testes de regressão
Refatoração do código deve ser feita de forma regular, sempre seguida de testes de regressão
Requisitos:
Classe claculadora que opera double: soma, subtração, multiplicação e divisão
Classe CLI que permite usar a calculadora pela linha de comando (exemplo: soma 10.0 20.0)
Tempo: 30 min
DE TESTES MANUAIS PARA TESTES AUTOMATIZADOS
PRÓXIMO PASSO
Como fazer?
Sugestões...
Sugestões:
GRAVAR E REPRODUZIR PASSOS
Uma abordagem seria printar a tela e comparar com o que havia sido gravado
Sensível a mudanças na resolução da tela, data/hora, outros dados que aparecem na tela
Outra abordagem seria capturar pacotes de requisição e resposta, reenviar as requisições e comparar
com os pacotes de resposta gravados
Sensível a mudanças nos campos de protocolos de rede (ip, porta, etc)
Como distinguir, de forma automática, o que é bug e o que é resultado de evoluções na aplicação?
Seria preciso regravar o teste manualmente de novo, e isso teria que ser feito com muita frequência
Perde-se parte do apelo da automação de testes
PENSANDO ERRADO...
Executamos testes de regressão para que tudo funcione como antes, certo?
Por outro lado, raramente um desenvedor vai querer mudar o código se não for para introduzir
mudanças na aplicação
Queremos re-executar testes somente quando algo mudar
E sempre que executamos testes é porque esperamos que algo tenha mudado
A QUESTÃO É...
Essas mudanças podem ser pequenas o suficiente para serem ignoradas em testes manuais
Para cada mudança na aplicação, testes continuarão falhando até que sejam regravados novamente
(1/4)
SEM RESULTADOS ESPERADOS CLAROS E CONCISOS...
Regravar os mesmos testes repetidas vezes pode introduzir problemas nos próprios testes
(2/4)
SEM RESULTADOS ESPERADOS CLAROS E CONCISOS...
Por exemplo: ao consertar o texto de um botão de uma tela, todos os testes que checam pelo botão
irão falhar, mesmo se tratando de uma mudança, não de um bug
(3/4)
SEM RESULTADOS ESPERADOS CLAROS E CONCISOS...
Investigar a diferença nos resultados pode não ajudar muito na identificação da causa do problema
O custo de investigar falhas nos testes pode se tornar maior que testar manualmente
(4/4)
EXTRAINDO O MELHOR DA AUTOMAÇÃO DE TESTES
Até agora vínhamos pensando como sair de testes manuais introduzindo automação
Vamos analisar o caso ideal de automação de testes e o que podemos aprender dele
EXTRAINDO O MELHOR DA AUTOMAÇÃO DE TESTES
Veremos um caso ideal, talvez tangível para alguns projetos, de onde há muito o que se aprender
Durante essa disciplina, esse caso ideal é o que se buscará durante o projeto e implementação de
testes automatizados
EXTRAINDO O MELHOR DA AUTOMAÇÃO DE TESTES
Imagine um sistema cujos testes de regressão cobrem todas as funcionalidades e rodam em poucos
minutos
Imagine que seu time já corrigiu todos os bugs conhecidos e todos os testes estão passando
Imagine também que qualquer dev do time pode rodar os testes em sua máquina de desenvolvimento
sempre que quiser
EXTRAINDO O MELHOR DA AUTOMAÇÃO DE TESTES
Como esse cenário mudaria a forma como você usa testes automatizados enquanto desenvolve novas
features?
Será que você colocaria para rodar apenas no fim do expediente para ver os resultados no outro dia?
Será que se, ao detectar um bug, faria um report para que fosse corrigido somente numa futura
release?
EXTRAINDO O MELHOR DA AUTOMAÇÃO DE TESTES
Comos os testes rodam rapidamente, você pode executá-los antes de cada commit
Isso faria com que todos os commits no repositório sempre passem em todos os testes disponíveis
Ou seja, se desde o início um sistema de CI previnea entrada de bugs por falha em testes de regressão
Se, ao introduzir novos testes de regressão, um desenvolvedor acha um bug, ele seria corrigido
imediatamente para manter o estado de zero bugs conhecidos no sistema
Já que um testes com tamanha cobertura garantiriam que nada foi quebrado com a refatoração
Quanto melhor a qualidade do código, mais fácil de manter sem introduzir novos bugs
Tempo: 30 min
TESTES MANUAIS VS AUTOMATIZADOS
Até agora já vimos que imitar cegamente o comportamento de um testador manual não é suficiente
Vimos também que uma implementação bem sucedida de automação de testes traz benefícios que
testes manuais não podem trazer
A diferença ente testes manuais e automatizados não é uma mera questão de conveniência
Alguns times realizam apenas testes exploratórios com alguns testes de sanidade
Testes dependentes da cabeça do tester
Mais comum em empreas pequenas, times pequenos
Manuais Automatizados
Passos dos casos de teste podem ser meio vagos Passos dos casos de teste precisam ser exatos
1/8
TESTES MANUAIS VS AUTOMATIZADOS
Mantenabilidade
Manuais Automatizados
Durante os testes, testadores podem facilmente Casos de teste devem ser atualizados com
entender se adaptar a mudanças recém absoluitamente cada mudança que os afete
introduzidas
Testes automatizados requerem manutenção
Espera-se que eles atualizem o plano de testes constante
com as mudanças que alterem seu procedimento
É importante escrever testes automatizados que
de execução
possam ser facilmente atualizáveis
2/8
TESTES MANUAIS VS AUTOMATIZADOS
Sensibilidade a mudanças
Manuais Automatizados
3/8
TESTES MANUAIS VS AUTOMATIZADOS
Tratamento de falhas
Primeiras execuções podem sofrer com casos não previstos na documentação inicial
4/8
TESTES MANUAIS VS AUTOMATIZADOS
Tratamento de falhas
Ambos podem sofrer com aqueles casos, mas como lidam é diferente
Seres humanos lidam mais facilmente com falhas provocadas por fatores externos
Mesmo em caso de novo bug detectado, o testador pode avaliar continuar os testes ou explorar mais
Para a máquina, qualquer problema é uma falha no teste e será reportado como tal
4/8
TESTES MANUAIS VS AUTOMATIZADOS
Tamanho de um caso de teste
Manuais Automatizados
Costumam ser grandes e tendem a cobrir uma Menores, verificando apenas uma coisa
funcionalidade por inteiro
Quase cada verificação deve ter seu caso de teste
5/8
TESTES MANUAIS VS AUTOMATIZADOS
Dependência entre testes
Manuais Automatizados
6/8
TESTES MANUAIS VS AUTOMATIZADOS
Coleta de evidências em caso de falha
Manuais Automatizados
Tester coleta informações relevantes durante a Testes automatizados trata qualquer problema
execução do teste que gerou a falha como falha e reporta
O tester pode explorar um pouco para encontrar Investigação da falha só pode ser realizada a
mais detalhes acerca da falha posteriori, possivelmente com perda de algumas
evidências (logs, por exemplo)
7/8
TESTES MANUAIS VS AUTOMATIZADOS
Confiança
Manuais Automatizados
8/8
CONCLUSÕES
Assim, tem-se uma suíte de testes confiáveis e que garantem a qualidade do produto
PAUSA PARA O ALMOÇO
Voltamos às 13h
PESSOAS E FERRAMENTAS
PARTE 1 - PESSOAS
COMO ESCOLHER BOAS FERRAMENTAS
Existem MUITAS ferramentas para automação de testes, como escolher a melhor para seu projeto?
Ferramentas estão dispostas em categorias, talvez você precise não de uma, mas de algumas...
Existem várias abordagens sobre quem do time ou na empresa estará responsável pelos testes
automatizados
É importante conhecer os pros e contras de cada abordagem, pois sua escolha depende da situação
do time ou da empresa
Parece uma boa ideia, podem ser profissionais que conhecem o sistema e o negócio
Já vimos que simplesmente automatizar passos manuais não é uma tarefa trivial
No início os desafios técnicos são menores, mas aumentam de complexidade com o tempo
(1/5)
PROMOVER TESTERS MANUAIS OU PROGRAMADORES INEXPERIENTES
A longo prazo, essa é uma abordagem arriscada, principalmente quando há alocação parcial
Nada sai direito, nem os testes manuais nem os automatizados
Não é um trabalho que possa ser feito nas horas vagas, por assim dizer, requer dedicação
Mais adequado para quando testes automatizados estão estabelecidos, com testadores experientes,
talvez não no início
(1/5)
TESTERS MANUAIS E PROGRAMADORES DE TESTES AUTOMATIZADOS
Existem ferramentas que requerem pouco código para a escrita de casos de teste
Costumam ser menos flexíveis do que as baseadas em orientação a objetos, por exemplo
(2/5)
TESTERS MANUAIS E PROGRAMADORES DE TESTES AUTOMATIZADOS
Foco em reuso das palavras-chave torna mais legível e fácil para testadores iniciantes
(2/5)
TESTERS MANUAIS E PROGRAMADORES DE TESTES AUTOMATIZADOS
Vantagens Desvantagens
(2/5)
UM TIME DEDICADO À AUTOMAÇÃO DE TESTES
Existem vantagens
Membros tem pleno domínio de tudo relacionado aos testes
Alto compartilhamento de conhecimento entre os membros
E desvantagens
A feature pode não ter sido escrita de um jeito facilmente testável pelo sistema de automação
Testes que passaram no manuial e falharam no automatizado podem bloquear até que o dev investigue
(3/5)
TESTER(S) ALOCADOS NO TIME DE DESENVOLVIMENTO
Times organizados por features e cuja empresa quer cobrir cada User Story com testes automatizados
É um modelo que garante entregas sempre testadas e torna difícil quebras por regressão
(4/5)
PROGRAMADORES RESPONSÁVEIS PELOS TESTES AUTOMATIZADOS
Alguns times levam isso a um outro patamar e os devs implementam todos os testes automatizados de
suas features
Pode ser uma exceletente abordagem quandos os devs tem skills de testes
Pode não ser uma boa estratégia adotar essa abordagem de forma inadvertida
Um time por vez para ver se funciona
Ter devs com experiência em automação de testes que ajudam a manter sua qualidade
(5/5)
RESUMO SOBRE QUEM ESCREVE OS TESTES AUTOMATIZADOS
Mas é importante ter em mente essas estratégias para tomar boas decisões e realizar experimentos
sem perder muito tempo e dinheiro
Mas antes...
ATIVIDADE 3
Vamos melhorar os testes unitários das nossa calculadora através da criação de comportamentos
Isso deve aumentar a legibilidade dos testes para viabilizar a escrita por quem não é desenvolvedor
É uma metodologia que dá ênfase na legibilidade dos testes (linguagem quase natural)
Vejamos como reescrever nossos testes da calculadora usando BDD com a biblioteca Behave
INSTALAR BIBLIOTECA BEHAVE
Vimos um tipo de teste automatizado que busca ser de fácil adoção e manutenção
Orientado a comportamentos (BDD), parecido com o orientado a palavras-chave (KDD)
Até agora introduzimos testes automatizados de funções de um programa, o que é muito comum
São sistemas que expõem uma API com funções que podem ser chamadas remotamente
APPLICATION PROGRAMMING INTERFACE (API)
APIs que são chamadas por um mesmo processo, algo que a gente já viu com nossa calculadura
A Classe calculadora expõe uma API para operações com números de ponto flutuante
Float Calculadora.soma(Float a, Float b)
Float Calculadora.mult(Float a, Float b)
Float Calculadora.soma(Float a, Float b)
Float Calculadora.soma(Float a, Float b)
PROTOCOLO DE COMUNICAÇÃO
Stubs são gerados (esqueletos) e são usados pelas aplicações para realizar as chamadas similar às
chamadas de métodos
Duas implementações famosas são o gRPC do Google e o RMI (mais comum no Java, orientado a
objetos)
APPLICATION PROGRAMMING INTERFACE (API)
http://localhost:5050/calc?val=10.0
EXEMPLO: CALCULADORA API EM PYTHON