Just Java 2009 Novas Ferramentas de Teste na plataforma Java Jorge Diz Workshop de testes para aplicativos web Slide 1
Quem sou eu? Jorge Alberto Diz ( 95 Mestre em Eng. Elétrica (UNICAMP ( 89 Bach. em Ciência da Computação (UNICAMP Programando desde 84, em Java desde 99 Automação de testes desde 94 Ensinando desde 01, na Globalcode desde 06 Consultoria em testes e métodos ágeis Certificado SCJP, SCWCD, CSM Workshop de testes para aplicativos web Slide 2
Apresentação da agenda Novos modelos de testes: pirâmides e quadrantes Apoio ao desenvolvimento: unitários/dublês Apoio à comunicação: prosa/planilhas/convergência Teste de interface usuário Testes difíceis Futuro Workshop de testes para aplicativos web Slide 3
Ssuporte ao time Scrítica crítica ao produto Quadrantes de Marick voltados ao Negócio Q2: GUI, regras de negócio Q3: Exploratório, usabilidade, aceitação funcional Testes Q1: Unitários, componentes Q4: Desempenho / segurança voltados à Tecnologia Workshop de testes para aplicativos web Slide 4
Pirâmide de testes: frágil Interface Usuário Regras de Negócio Unidades Workshop de testes para aplicativos web Slide 5
Pirâmide de testes: ágil (Mike Cohn) Interface Usuário Regras de Negócio Unidades Workshop de testes para aplicativos web Slide 6
(* Huggins ) A pirâmide de testes (*) Jason Huggins, autor do Selenium Workshop de testes para aplicativos web Slide 7
A pirâmide alimentar Workshop de testes para aplicativos web Slide 8
( poucos ) Consensos Não é possível testar tudo Quem testa deve ter atitude crítica Testes têm custo Testes informam sobre riscos Áreas concentram defeitos (bug clusters): se uma técnica de teste encontra problemas, outra técnica encontrará problemas na mesma área. Workshop de testes para aplicativos web Slide 9
Testes Unitários (Q1) Voltados à tecnologia, apoiam a equipe O problema: isolamento das partes sendo testadas A solução: projetar para o teste (testabilidade) projetar através dos testes (TDD) dublés de teste técnicas ninja para legados Workshop de testes para aplicativos web Slide 10
Teste Unitário: premissas (teste unitário centrado no desenvolvedor) Resultado independente da ordem de execução Independência entre métodos de teste A suite executa em alguns segundos Todo recurso está sob controle do programador Não é testada a integração Testes na mesma linguagem que o código sob teste Resultado não sujeito a interpretação ( output (Guru checks Workshop de testes para aplicativos web Slide 11
Testar estado X testar interação Modalidade Ciclo da lógica de teste comportamento Ferramentas Estado setup play verify Verifica o estado da classe-alvo depois de exercitar uma funcionalidade JUnit Interação (comporta ( mento setup ( record ) play ( verify ) Verifica se as interações da classe-alvo com seus colaboradores seguem um roteiro JUnit + dublês de teste Workshop de testes para aplicativos web Slide 12
( Meszaros Dublês de teste (s. Papel Substitui Variantes O que ele faz Dummy ( laranja ) Objeto Está ai apenas para cumprir tabela Stub ( eletrônica (sec. Método Responder, Saboteur Retorna uma resposta pré-definida Mock ( impostor ) Objeto Nice, Strict, Partial Define previamente o comportamento esperado das interações da classealvo com o colaborador Fake ( brinquedo ) Serviço, Objeto Substitui um serviço por uma implementação mais apropriada para o teste. Spy ( grampo ) Método, Objeto Registra comportamento para verificação posterior Workshop de testes para aplicativos web Slide 13
Dublês de teste Colaboradores: objetos/classes/serviços dos quais o código sendo testado depende. Dublês de Teste == Colaboradores substitutos para efeito de teste Verificam o comportamento da classe-alvo: teste ( spies baseado em interação (mocks, Amenizam efeitos da dependência no teste (fakes, ( dummies stubs, ( saboteurs ) Injetam falhas a serem detectadas Adicionam funcionalidades específicas para teste Workshop de testes para aplicativos web Slide 14
Dublês de teste Ferramentas genéricas: Jmock EasyMock Mockito PowerMock JMockit Específicas de APIs Mockrunner EJBMock SpringUnit Fakes Web containers leves, BDs / ORMs em memória, HTMLUnit Workshop de testes para aplicativos web Slide 15
Teste de interação: Spy X Mock Tipo de dublê Especificação do comportamento esperado Verificação do comportamento Vantagens Spy ( grampo ) Depois do teste Depois do teste Simplicidade de especificação / implementação Mock ( impostor ) Antes do teste Durante o teste Falhas são detectadas ( fail-fast ) antes Pilha de execução é preservada Workshop de testes para aplicativos web Slide 16
Teste Contínuo Testes são executados automaticamente toda vez que o fonte é alterado Infinitest JUnitMax (comercial) Autotest (JRuby) Workshop de testes para aplicativos web Slide 17
Testes de Interface Usuário Ferramentas: Selenium WebDriver Selenium 2 Canoo WebTest Interaction Design: CubicTest Workshop de testes para aplicativos web Slide 18
Família Selenium CubicTest plugin CubicTest StoryTest IQ Selenium On Rails Eclipse IDE Selenium RC Client ( Java ) API Selenium RC Client ( Ruby ) API * Selenium RC Server Java Selenium Core JavaScript DOM (X)HTML Browser: IE, Firefox, Safari,... Selenium IDE ( Firefox (só Workshop de testes para aplicativos web Slide 19
Selenium IDE Workshop de testes para aplicativos web Slide 20
Selenium IDE TestRunner Workshop de testes para aplicativos web Slide 21
Story Test IQ Workshop de testes para aplicativos web Slide 22
Cubic Test Workshop de testes para aplicativos web Slide 23
Teste de regras de negócio Não passa pela interface usuário Mais rápido Entendível por especialistas no domínio Ferramenta FitNesse (planilha) > ferramenta Wiki que pode ser utilizada por analistas de teste e de negócios > especificação de requisitos em planilhas > codificação de fixtures pode ser feita por programadores > Base para outros tipos de teste (GUI, unitários, banco de dados) Outras Ferramentas: > GreenPepper, Robot framework Workshop de testes para aplicativos web Slide 24
Fitnesse - arquitetura diagrama extraído do site http://fitnesse.org Workshop de testes para aplicativos web Slide 25
Fit planilha original Workshop de testes para aplicativos web Slide 26
FitNesse tabela Wiki Workshop de testes para aplicativos web Slide 27
FitNesse fixture package br.com.globalcode.aceitacao; import fit.columnfixture; import br.com.globalcode.impostos.rendanafonte; public class ImpostoDeRendaNaFonteFixture extends ColumnFixture{ public double salariobruto; public int dependentes; public double impostoretido() { return RendaNaFonte.desconto(salarioBruto); } public double salarioliquido() { return RendaNaFonte.liquido(salarioBruto); } } Workshop de testes para aplicativos web Slide 28
FitNesse classe de negócio package br.com.globalcode.impostos; public class RendaNaFonte { public static double desconto(double bruto) { return bruto * 0.2; } public static double liquido(double bruto) { return bruto * 0.8; } } Workshop de testes para aplicativos web Slide 29
FitNesse resultado Workshop de testes para aplicativos web Slide 30
DSLs em planilhas FIT DSL = domain-specific language Linguagens específicas para um determinado domínio de aplicação. Ex: teste de GUI, seguro de automóvel Criadas caso-a-caso, aproveitam o motor do FIT Podem ser implementadas utilizando fixtures customizadas ( DoFixture ) Workshop de testes para aplicativos web Slide 31
Behavior Driven Development Especificação das funcionalidades em prosa. Sendo um <role> Eu Quero: <funcionalidade> Para que: <benefício> Workshop de testes para aplicativos web Slide 32
Behavior Driven Development Detalhamento da funcionalidade: Dado que: <precondições> Quando: <ação> Então: <verificação> Workshop de testes para aplicativos web Slide 33
Behavior Driven Development Ferramentas: JBehave EasyB (Groovy) Cucumber + JRuby Fitnesse DoFixture Workshop de testes para aplicativos web Slide 34
Teste de componentes JavaEE Fora do container utilizando objetos que simulam os componentes gerenciados (mock ( objects Não é necessário executar o servidor de aplicações Não é testada a interação do componente com o servidor no qual ele será instalado Dentro do container são necessárias ferramentas específicas configuração mais complexa os ambientes são testados num ambiente mais próximo do real Workshop de testes para aplicativos web Slide 35
Cactus - arquitetura 1:beginX 1b <<new> > () setup :2 () testx :3 () teardown :4 MeuTestCase 5: endx <<Servlet>> MeuTestCase beginxyz Proxy setup* testxyz* setup teardown* testxyz endxyz teardown Container JEE (Ex: Jetty Web ( Container (*) no servidor A classe de caso de teste é instanciada duas vezes pelo test runner Os métodos setup, testx e teardown executam dentro do container Workshop de testes para aplicativos web Slide 36
Testes difíceis Banco de dados Bungee-jump Pequenas massas de dados com DB Fit Especificar dados esperados interceptando chamadas ao banco com Mockrunner JDBC Geração de massa com Benerator Web Services Concorrência Workshop de testes para aplicativos web Slide 37
Novas Ferramentas Build, gestão de dependências Maven, Ant+Ivy Integração Contínua Hudson, Continuum, Twist Dashboard Sonar, XRadar Sensores + Mineração Hackystat Diagnóstico TestabilityExplorer, Yslow! Workshop de testes para aplicativos web Slide 38
Novas ferramentas Análise estática de código PMD, FindBugs, Checkstyle Cobertura de testes Cobertura, JMockit Coverage Mutantes Jester Geração de massa de dados: Benerator Desempenho / Carga Jmeter, TheGrinder Workshop de testes para aplicativos web Slide 39
Futuro? > comunicação, feedback, aviso rápido > nuvem como desafio e oportunidade serviços especializados para teste de configuração/volume/ desempenho profissional de testes como embaixador da qualidade > uso de linguagens dinâmicas ciclos de implantação + curtos / contínuos (Agile operations) framework XYZ ==> XYZ test. Frameworks sem um ambiente de teste associado serão inaceitáveis. Workshop de testes para aplicativos web Slide 40