práticas e técnicas de testes Ágeis - assiste...

113
Práticas e Técnicas de Testes Ágeis Delmar de Castro Mehret Filho SUPDE/DECTA

Upload: phungtram

Post on 09-Nov-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

Práticas e Técnicas de Testes Ágeis

Delmar de Castro Mehret FilhoSUPDE/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%C3%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

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

RQM

● Algumas referências:● Material de treinamento:

– http://portal.alm.serpro.gov.br/materiais-de-treinamento/rqm

● 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)

● 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

Testes Unitários

● TDD (Test Driven Development)

● 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 TestadaClasse Referenciada pelaClasse Testada

Testes Unitários

Classe Testada Interface

Implementaçãoda

Interface

MockObject

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

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-TestesUnit_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 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

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 SUPDEhttp://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

[email protected]

#41 8584