Baixe o app para aproveitar ainda mais
Prévia do material em texto
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 (SQLinjection, 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/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) ● 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 Testada Classe Referenciada pela Classe Testada Testes Unitários Classe Testada Interface Implementação da Interface Mock Object 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-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 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/) Ambientede 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 Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73 Slide 74 Slide 75 Slide 76 Slide 77 Slide 78 Slide 79 Slide 80 Slide 81 Slide 82 Slide 83 Slide 84 Slide 85 Slide 86 Slide 87 Slide 88 Slide 89 Slide 90 Slide 91 Slide 92 Slide 93 Slide 94 Slide 95 Slide 96 Slide 97 Slide 98 Slide 99 Slide 100 Slide 101 Slide 102 Slide 103 Slide 104 Slide 105 Slide 106 Slide 107 Slide 108 Slide 109 Slide 110 Slide 111 Slide 112 Slide 113
Compartilhar