Você está na página 1de 113

Práticas e Técnicas de

Testes Ágeis

Delmar de Castro Mehret Filho


SUPDE/DECTA
Testes Ágeis

● São práticas de testes de acordo com os princípios do


desenvolvimento ágil e que permeiam todo o ciclo de
desenvolvimento, constituindo uma atividade constante do
projeto e não uma fase
● Testes são imprescindíveis ao desenvolvimento de software
– Produto de software que não seja construído sob
constante verificação da sua eficácia e eficiência é um
produto inacabado!
● Os testadores tanto zelam pela qualidade externa e visão do
cliente como atuam na construção da qualidade interna definida
pelo time
● É fundamental balancear o uso dos diversos níveis e tipos de
testes através de práticas, técnicas e ferramentas de apoio
Estratégia de Teste Ágil
Estratégia de Teste Ágil
Tipos de Testes
Testes Manuais Funcionais

● Indispensáveis ao projeto:
– Fornecem a primeira validação do atendimento aos
requisitos funcionais e não-funcionais do sistema
– Consideram fatores subjetivos como a experiência do
usuário, interface do sistema, ...
– Variação no fluxo de execução das funcionalidades
– Aceitação do usuário
Testes Manuais Funcionais - Projeto
● Casos de Uso
– Derivação de casos de teste a partir das regras e fluxos
de execução descritos no requisito
Testes Manuais Funcionais - Projeto
● Casos de Uso
– Derivação de casos de teste a partir das regras e fluxos
de execução descritos no requisito
Testes Manuais Funcionais - Projeto

● Histórias de Usuário
– Descrição geral dos objetivos de uma funcionalidade do
ponto de vista do usuário
– http://wiki.cta.serpro/index.php/User_Stories_e_Ce%C
3%A1rios_de_Uso
Testes Manuais Funcionais - Projeto

● Cenários de Uso
– Descrição que contém atores, as informações por trás
deles, informações sobre o seu ambiente, os seus
objetivos e sequências de ações e eventos
– Pode incluir também os obstáculos, contingências e
êxitos dos atores
– http://wiki.cta.serpro/index.php/User_Stories_e_Ce%C
3%A1rios_de_Uso
Testes Manuais Funcionais - Projeto

● Especificação por Exemplos


– Abordagem colaborativa para definição de requisitos e
testes funcionais orientados ao negócio para produtos de
software baseados na captura e ilustração de requisitos
usando exemplos realísticos ao invés de afirmações
abstratas
Testes Manuais Funcionais - Projeto

● BDD (Behaviour Driven Development):


– O BDD é uma técnica de desenvolvimento de software
onde os programadores desenvolvem o sistema guiados
por comportamentos (testes de aceitação)
– Os comportamentos são descritos em uma linguagem
natural similar a linguagem do negócio, a qual deve ser
facilmente entendida pelo cliente e demais membros do
time
Testes Manuais Funcionais - Projeto
Tipos de Testes
Testes Exploratórios

● Aprendizado, criação e execução de um teste ao


mesmo tempo
● Normalmente o testador não tem informações
detalhadas sobre o que vai testar e como vai testar:
– Baseia-se na experiência, assim como no conhecimento
adquirido sobre o sistema durante a execução do teste
– A partir dessa perspectiva, podemos afirmar que o teste
exploratório:
– É uma atividade iterativa e empírica de exploração
que exige idas e vindas num processo de
investigação contínuo
– A intuição, a criatividade e a experiência do
testador são indispensáveis para garantir a
eficiência do teste
Testes Exploratórios

● Características:
– Não são ad-hoc e nem criados com antecedência
– Não segue um roteiro rígido (segue guias e diretrizes)
– Baseado em pensamento estruturado e exploração livre
– Adaptativo e flexível
– Enfoca o aprendizado em paralelo
– A execução do teste é guiada/aprimorada com base em
execuções anteriores
– Exige profissionais experientes
– Expande o escopo dos testes tradicionais baseados em
roteiros (introduz variação aos casos de testes)
– Fluxo imediato de feedback (e correção de curso)
– Amplifica a cobertura dos testes
Testes Exploratórios

● O oráculo é o Testador:
– A experiência afeta diretamente a qualidade do teste
– Criatividade
– Observação cuidadosa
– Metódico
– Pensamento crítico
– Aprendizado rápido
– Intuição e Improviso
– Auto-gerenciamento
– Ideias diversificadas: baseia na sua experiência, mas usa
heurísticas, checklists, diretrizes e técnicas formais (classes
de equivalência, valores limítrofes, tabelas de decisão,
diagramas de estado, fluxogramas, etc)
– Recursos: usa ferramentas de apoio
Testes Exploratórios

Ferramentas?
Testes Exploratórios

● Algumas referências:
● Ferramenta para gravação de vídeos:
– http://www.debugmode.com/wink/
● Algumas heurísticas para testes exploratórios em
aplicações web
– http://voce.serpro/04151765905/blog/algumas-heuristicas
-para-testes-exploratorios-em-aplicacoes-web
Tipos de Testes
Testes de Acessibilidade

● “A construção de sítios acessíveis é uma exigência do decreto


5.296, publicado em dezembro de 2004, que torna obrigatória a
acessibilidade nos portais e sítios eletrônicos da administração
pública na rede mundial de computadores para o uso das
pessoas com necessidades especiais, garantindo-lhes o pleno
acesso aos conteúdos disponíveis”
● “O Modelo de Acessibilidade de Governo Eletrônico (e-MAG),
consiste em um conjunto de recomendações a ser considerado
para que o processo de acessibilidade dos sítios e portais do
governo brasileiro seja conduzido de forma padronizada e de
fácil implementação"
● Para conhecer vários conceitos básicos relacionados a
acessibilidade e o e-MAG, recomenda-se fortemente a leitura
do documento de Modelo de Acessibilidade do e-MAG
Testes de Acessibilidade

● Algumas referências:
– https://www.w3.org/WAI/ER/tools/
– http://www.utad.pt/wai/wai-pageauth.html
– http://www.acessibilidadelegal.com/13-validacao.php
– http://wiki.cta.serpro/index.php/Roteiro_para_Avalia
%C3%A7%C3%A3o_de_Acessibilidade
– http://wiki.cta.serpro/index.php/Checklist_para_Aval
ia%C3%A7%C3%A3o_de_Acessibilidade
Tipos de Testes
Testes de Usabilidade

● Teste de Usabilidade tem por objetivo verificar a facilidade que o software


ou site possui de ser claramente compreendido e manipulado pelo usuário
● Verifica se o sistema utiliza manuais, ajuda, assistentes eletrônicos, ...
● Para avaliar a usabilidade de um sistema podemos aplicar uma metodologia
chamada Avaliação Heurística, definida por Nielsen e Molich (1994), onde
são abordadas 10 questões:
– Visibilidade do status do sistema
– Compatibilidade entre o sistema e o mundo real
– Controle e liberdade para o usuário
– Consistência e padrões
– Prevenção de erros
– Reconhecimento em lugar de lembrança
– Flexibilidade e eficiência de uso
– Projeto minimalista e estético
– Auxiliar os usuários a reconhecer, diagnosticar e recuperar erros
– Ajuda e documentação
Testes de Usabilidade

● Algumas referências:
● Heurísticas de Nielsen:
– http://wiki.cta.serpro/index.php/Heur%C3%ADsticas_de_
Nielsen
● Lista de verificação para Testes de Usabilidade:
– http://wiki.cta.serpro/index.php/Lista_de_Verifica%C
3%A7%C3%A3o_de_Usabilidade
Tipos de Testes
Testes de Segurança

● Avaliar as vulnerabilidades em aplicações e serviços


frente a diferentes tipos de ataques de segurança –
como ataques de negação de serviço ou ataque man-
in-the-middle – e descobrir novas vulnerabilidades
antes que sejam exploradas por atacantes
● COGSI – Coordenação Geral de Gestão da
Segurança da Informação
● http://cogsi.serpronet.serpro/conteudo/institucional
● Norma SG 021
● http://sinor.portalcorporativo.serpro/documento.php?
cod=MzAxODk
=
Testes de Segurança

● Vulnerabilidades a serem verificadas (Norma SG 021):


– Injeção de código (SQL injection, Xpath injection, XML
injection, command injection, LDAP injection, ...)
– Forçar a execução de códigos ou requisições no lado
cliente (cross site scripting, cross frame scripting, cross
site request forgery, click injection, ...)
– Listar, acessar e/ou alterar dados não autorizados
– Quebrar os algoritmos criptográficos utilizados pela
aplicação
– Comprometer senhas, chaves ou tokens de sessão
– Visualizar o tráfego de informações privadas
– Alterar o conteúdo e/ou layout da aplicação
– Redirecionar vítimas para sites maliciosos
RQM

● Rational Quality Manager (RQM)


● Registro das atividades de testes por projeto do
sistema:
– Plano de Testes, Casos de Teste, Resultados e
Relatórios
● Integração com o módulo de requisitos (RM):
– Usa requisitos registrados
– Fornece casos de teste (validado por)
● Integração com o módulo de gestão (CCM):
– Usa planos de desenvolvimento e defeitos
RQM

Fonte: https://jazz.net/wiki/bin/view/Main/RqmApi
RQM

PSDS RQM

Planejar e Acompanhar Testes - Criar e Preencher o Plano de Teste


- Aprovar Plano

Projetar Testes - Criar e preencher os Casos de Teste

Implementar Testes - Criar Scripts de Teste

Executar Testes - Executar Casos de Teste


- Relatar Defeitos
- Acompanhar Defeitos

Avaliar Resultados de Testes - Visualizar Resultado dos Casos de Teste


- Gerar Relatórios (Elaborar e Manter)
- Visualizar Artefatos
RQM

● Algumas referências:
● Material de treinamento:
– http://portal.alm.serpro.gov.br/materiais-de-treinamento/r
qm
● Mentores de ferramentas:
– http://portal.alm.serpro.gov.br/mentores-de-ferramentas
/copy4_of_rqm
Automação de Testes

● Prós:
– Testes de regressão (refatorações e novas
implementações)
– Integração contínua
– Feedback rápido (tempo de execução)
– Confiabilidade do software
– …
● E Contras (?):
– Manutenção
Automação de Testes

● Quando automatizar testes


– Sempre que possível!
– Funcionalidades principais do sistema
– Alto volume de refatorações
● Indefinições de requisitos
● Arquitetura
– Atividades repetitivas nos testes manuais
– Complexidade de fluxos, regras, cálculos...
Automação de Testes

● Automação nos diferentes níveis e tipos de teste


● Paradigmas de automação de testes:

– Testes caixa preta

– Testes caixa branca


Tipos de Testes
Testes Unitários

● O desenvolvedor também é responsável pelos testes:


– Testam sob a perspectiva do código (método por
método) com o objetivo de prevenir e detectar defeitos
– Garantir a qualidade de cada unidade do código
individualmente
– Unidade, neste contexto, deve ser entendida como o
menor trecho de código de um software que pode ser
testado, podendo ser uma função ou procedimento em
linguagens de programação procedurais ou métodos de
classes em linguagens orientadas a objetos
– São utilizados casos de testes criados a partir:
● Das classes de equivalência, ou seja, o conjunto de estados
válidos e inválidos para as condições de entrada
● Da análise dos valores limites, ou seja, entradas e saídas que
estão nas extremidades destas classes
Testes Unitários

● Benefícios:
– Feedback imediato ao desenvolvedor
– Segurança em mudanças e refatorações através dos
testes de regressão
– Ajudam na identificação e isolamento de defeitos
– Em conjunto com plugins de cobertura fornecem uma
visualização das áreas do software cobertas por testes
– Fornecem um exemplo executável de como funciona o
código (ou como deveria funcionar)
Testes Unitários

● TDD (Test Driven Development)


– Escrita dos testes antes da implementação do código:
● Direcionam como o código deverá ser estruturado
● Irão assegurar o comportamento adequado do código
– Nenhum código vai para produção sem ter pelo menos
um teste associado a ele
– Facilita o rastreamento de erro caso uma mudança
ocasione um problema
– Facilita refatoração
– Você só implementa o mínimo que deve ser
implementado, sem código em excesso
Testes Unitários

● TDD (Test Driven Development)


Testes Unitários

● JUnit
– Framework opensource, integrado ao Eclipse, com
suporte à criação de testes automatizados na linguagem
de programação Java
– Facilita a criação de código para a automação de testes
unitários com apresentação dos resultados
– Possibilita verificar se cada método de uma classe
funciona da forma esperada, exibindo possíveis erros ou
falhas, podendo ser utilizado tanto para a execução de
baterias de testes como para extensão
Testes Unitários

● JUnit
● Principais Facilidades
– Permite criação de testes unitários para métodos
pertencentes a uma classe
– Permite a definição e execução de um conjunto de testes
unitários – Suites de Teste
– Permite a execução de teste com relato de problemas
ocorridos e onde especificamente ocorreram os erros
– Uma vez escritos, os testes são executados rapidamente
sem que, para isso, seja interrompido o processo de
desenvolvimento
– Facilmente integrável com as IDEs Java já existentes
(Eclipse, Netbeans, JBuilder, ...)
Testes Unitários
Testes Unitários

● Mock
– É uma simulação do objeto real
● Implementa a interface e o comportamento do objeto

real identicamente para viabilizar testes


– Também validam se o código que os utiliza está correto
● Para passar da validação do mock, outros objetos devem
chamar os métodos corretos, com os parâmetros
esperados, na ordem esperada
● Um objeto de teste que simplesmente substitui um
objeto real sem promover tal verificação não é um
mock e sim um stub
Testes Unitários

Classe Referenciada
Classe Testada pela
Classe Testada
Testes Unitários

Classe Testada Interface

Mock Implementação
Object da
Interface
Testes Unitários

● Razões para utilizar Mock


– Ajuda no desacoplamento de código
– Verifica a utilização de código de outro objeto
– Direcionamento de código de teste
– Testes mais rápidos
– Simula interação com dispositivos externos e remotos
– Protela a implementação de classes
– Isolamento de testes
– Utilização e refinamento de interface
– Testa situações incomuns difíceis de reproduzir
Testes Unitários

● EasyMock
● Foi o primeiro gerador dinâmico de objetos mock, aliviando
os utilizadores manuais, ou a geração de código para eles:
– Criação dinâmica de objetos Mock
– Especifica os valores retornados por casos de teste
– Define apenas o que é necessário
– Código mais légivel
– Pode necessitar de refatoramento no código
– Não simula métodos estáticos e final
Testes Unitários

● JMockit
– Permite que os desenvolvedores escrevam testes
unitários e de integração
– Os testes podem ser facilmente escritos com mock final,
classes e métodos, métodos estáticos, construtores, e
assim por diante; não há limitações
– API de simulação simples e consistente
– Não há métodos especiais ou anotações que devem ser
usados no código de teste, com exceção daqueles que
realmente fazem sentido
Testes Unitários

● EasyMock x JMockit
– O EasyMock (o mesmo é verdadeiro para a maioria dos
frameworks de simulação) não simula métodos static ou
final, podendo apenas simular métodos públicos
– Muitos métodos estáticos no sistema:
● Problema de arquitetura?
● Refatoração?
● Bibliotecas externas?
– JMockit é uma pequena estrutura que pode ajudar
nesses casos
● Permite substituir os métodos dinamicamente com novas
definições
● Permite redefinir métodos privados, static, final e
construtores sem argumentos
Testes Unitários
Testes Unitários
Testes Unitários
Testes Unitários
● EclEmma
– Plugin para o Eclipse que mede e apresenta a cobertura
de testes em percentual
– Os testes são executados no próprio Eclipse e a
apresentação dos trechos cobertos e descobertos é
integrada ao editor Java
– Não requer modificações nos projetos ou qualquer outra
configuração (não-invasivo)
Testes Unitários

● Algumas referências:
● DECTA Ágil – Testes Unitários
– http://voce.serpro/articles/public/0108/5950/DECTA-TV-Te
stesUnit_rios.pdf
● Boas práticas em Testes Unitários:
– http://voce.serpro/siscoaf2/blog/testes-unitarios-boas-prat
icas
● Orientações para Testes Unitários:
– http://wiki.cta.serpro/index.php/Orienta%C3%A7%C3%
B5es_para_Testes_Unit%C3%A1rios
Tipos de Testes
Testes de Integração

● Testes que são executados em uma combinação de


componentes
– Verifica-se a corretude desses componentes em conjunto
– Assegura-se que as interfaces entre eles funcionam de
forma prevista e que os dados estão sendo processados
conforme especificado
– Unidades, Componentes, Sub-sistemas, API / WEB Services,
Hardware, Banco de dados
– Teste de baixo nível dos componentes e APIs internas do
sistema sem acesso a interface gráfica
Testes de Integração
Testes de Integração

● DbUnit
– Extensão do JUnit direcionado para projetos de banco de
dados que, entre outras coisas, coloca seu banco de
dados em um estado conhecido entre as execuções de
testes
– O banco pode ser populado com dados antes dos testes
unitários serem executados
– O banco pode retornar para o estado anterior ao teste
unitário
Testes de Integração / Funcionais

● SoapUI
● Ferramenta open source escrita em Java cuja principal
função é consumir e testar web services
● Dentre as suas principais características, podemos destacar
as seguintes:
– Importação e geração automática das requisições descritas no
WSDL
– Gerenciamento de múltiplos endpoints para cada web service
– Validação das respostas (asserções) de um web service
– Testes funcionais, carga e stress
– Execução de diversos testes em paralelo
– Criação de mock para testes de web service
– Suporta criação de testes complexos utilizando scripts Groovy
Testes de Integração / Funcionais

● SoapUI
● Para iniciar o teste de um web service com o SoapUI,
basta criar um novo projeto e informar o endereço do
WSDL:
Testes de Integração / Funcionais

● SoapUI
● O SoapUI disponibilizará uma request com os dados
necessários para serem informados no web service. Os
campos aparecem com um ponto de interrogação:
Testes de Integração / Funcionais

● SoapUI
● Execução e resultados obtidos:
Testes de Integração / Funcionais

● SoapUI
● É possível criar uma suíte de testes, onde será
possível observar o resultado da execução de todos os
testes, ou analisar os detalhes de cada um deles:
Testes de Integração / Funcionais
● SoapUI
● Exemplo de asserção de um teste que falhou:
Testes de Integração / Funcionais
Testes de Integração / Funcionais

● SoapUI
● Algumas referências:
– http://www.soapui.org/
– http://supst.serpronet.serpro/conteudo/produtos-e-servi
cos/framework-e-componentes/web-services/
Tipos de Testes
Testes de Integração / Funcionais

● Arquitetura REST
– Representational State Transfer
– Arquitetura utilizada para criação de APIs
– Trabalha, geralmente, sobre o protocolo HTTP/HTTPS
usando métodos GET, POST, PUT, DELETE, OPTIONS,
PATCH e HEAD
– Utiliza respostas no formato JSON ou XML
– Demoiselle 2.5
● HTML + REST
● Validação dos serviços que a aplicação expõe para outros
sistemas (integração) e que são consumidos pelas telas do
próprio software (funcional)
Testes de Integração / Funcionais

● Arquitetura REST
– Como testar manualmente:
● Curl em sistemas Unix
● Plugins para navegadores: RESTClient, Poster, ...
– RestAssured:
● Biblioteca Java para simplificar testes de serviços baseados em
REST
● Compatível com os principais métodos
● Possui mecanismos de validação de esquema, corpo e
cabeçalho de requisições
● Utiliza a sintaxe de especificação por exemplos, o Given-When-
Then, muito conhecida em testes dirigidos por comportamento
(BDD)
● https://code.google.com/p/rest-assured/
Testes de Integração / Funcionais
Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


– Passos para execução das chamadas REST
Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


– Passos para execução das chamadas REST
Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


– Cenários de reuso (passo a passo)
Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


– Passos de negócio (testes)
Testes de Integração / Funcionais

● RestAssured + Demoiselle Behave


– Configuração e execução dos testes
Tipos de Testes
Testes Funcionais Automatizados

● Demoiselle Behave (http://www.dbehave.com/)


● Framework de integração de ferramentas para uso de
técnicas de Desenvolvimento Orientado a Comportamento –
Behaviour-Driven Development (BDD)
● Além de uma ferramenta BDD
– Abstração de ferramentas BDD
● JBehave

– Abstração de ferramentas de automação de testes


● WebDriver

● Fest

– Abstração de ferramentas de gestão de testes


● RQM

● Subprojeto do Framework Demoiselle


Testes Funcionais Automatizados
Testes Funcionais Automatizados
Testes Funcionais Automatizados

● Passos de negócio (testes)


Testes Funcionais Automatizados

● Cenários de reuso (passo a passo)


Testes Funcionais Automatizados

● Passos de negócio + Cenários de reuso


Testes Funcionais Automatizados
Testes Funcionais Automatizados

● Desktop (Fest)
Testes Funcionais Automatizados

● Web (Selenium WebDriver)


Testes Funcionais Automatizados
Testes Funcionais Automatizados

● Desktop (Fest)
– Seleção do Driver
Testes Funcionais Automatizados

● Desktop (Fest)
– Frame principal da aplicação
Testes Funcionais Automatizados

● Desktop (Fest)
– Configuração e execução
Testes Funcionais Automatizados

● Web (Selenium WebDriver)


– Seleção do Driver
Testes Funcionais Automatizados

● Web (Selenium WebDriver)


– Configuração e execução
Testes Funcionais Automatizados
Testes Funcionais Automatizados

● Registro dos casos de teste e resultados no RQM


Testes Funcionais Automatizados

● Registro dos casos de teste e resultados no RQM


Testes Funcionais Automatizados
● Relatórios JBehave
Testes Funcionais Automatizados
● Relatórios JBehave
Testes Funcionais Automatizados
● Relatórios JBehave
Tipos de Testes
Testes Não Funcionais

● JMeter
● Software open-source, 100% escrito em Java, mantido pelo
grupo Jakarta Apache, que tem a capacidade de executar
planos de testes configurados através da sua ferramenta
gráfica
● Pode ser utilizado para teste de performance de aplicativos,
simulando uma determinada demanda
● Também é possível adaptá-lo para testes de caixa preta
Testes Não Funcionais

● JMeter
● Requisição HTTP
Testes Não Funcionais

● JMeter
● Resposta de requisição HTTP com asserções
Testes Não Funcionais

● JMeter
● Exemplo de relatório de consulta a um banco de dados
Testes Não Funcionais

● JMeter
● Exemplo de relatório estatístico
Tipos de Testes
Ambiente de Integração Contínua

● Jenkins (http://jenkins.aic.serpro/)
– Ambiente AICAT
– Slaves dedicados a execução de testes automatizados
– Registro dos resultados no RQM e geração de relatórios
– Qualquer pessoa pode disparar os testes
– Possibilidade de disparar, antes da execução dos testes
funcionais automatizados, o job responsável por gerar e
publicar a build do sistema a ser testado
Ambiente de Integração Contínua

● Jenkins (http://jenkins.aic.serpro/)
Ambiente de Integração Contínua

● Jenkins (http://jenkins.aic.serpro/)
Radar de Práticas SUPDE
http://10.200.118.38/techradar/examples/
Tipos de Testes
Conclusão

● A qualidade interna do código deve favorecer a resposta rápida


à mudanças, acelerando a identificação de falhas no ciclo de
desenvolvimento. Isso só é possível com o uso frequente de
testes (desde os unitários até os funcionais de sistema), tanto
para atuar na prevenção de defeitos (já que os testes guiam o
desenvolvimento) como para proporcionar a velocidade
adequada na detecção de falhas
● Com o código sendo construído desde o início com qualidade,
os testes exploratórios e de aceitação deverão, oportunamente,
levantar as possíveis falhas de negócio que poderiam
comprometer o produto
● É fundamental balancear o uso dos diversos níveis de testes!
Obrigado!

Delmar de Castro Mehret Filho


SUPDE/DECTA/DE9CT
delmar.mehret@serpro.gov.br
#41 8584

Você também pode gostar