Estratégias para testes:
a metáfora da pirâmide alimentar
Jorge Diz
Instrutor Globalcode
Kleber Xavier
Instrutor Globalcode
1
Globalcode – Open4Education
Agenda
>
>
>
>
O que são testes?
Tipos de testes
A pirâmide de testes (Huggins)
Testes antes, durante e depois
> Testes de aplicativos web
> Selenium
> Fitnesse
> Cactus
> Conclusões
2
Globalcode – Open4Education
O que são testes?
> “Projeto e implementação de um sistema de software que
exercita outro sistema com o intuito de encontrar bugs”
[Binder]
3
Globalcode – Open4Education
Tipos de testes
> Muitas classificações, baseadas no objetivo
> Teste unitário: classes e métodos
> Teste de integração: interação entre classes
> Teste funcional: funcionalidades, regras de negócio,
casos de uso
> Teste de carga: múltiplos usuários
> Teste de interface: interface com usuário
> Teste de aceitação: atende objetivos do usuário
> O que testar então?
4
Globalcode – Open4Education
Pirâmide Alimentar
5
Globalcode – Open4Education
Pirâmide de testes (Huggins*)
(*) Jason
Huggins,
autor do
Selenium
6
Globalcode – Open4Education
Quando testar?
> Escrever o teste depois:
> O sistema compila, a entrega é amanhã:
agora vamos testar
> Grande torcida para o sistema funcionar
> testes bondosos
> testes exploratórios
7
Globalcode – Open4Education
Modelo V
8
Globalcode – Open4Education
Quando testar?
> Modelo V:
> Na hora do desenvolvimento, já estou “vendido” no
escopo: testes são vistos apenas como um controle
de qualidade
> Feedback muito tardio
> Especificação imatura dos testes
9
Globalcode – Open4Education
Quando testar?
> Testar pouco:
> Em processos de software: “a qualidade que eu
consigo seguindo o processo é tão boa que não
preciso tanto de testes”
> Pense positivo!
10
Globalcode – Open4Education
Quando testar?
> Teste como suporte ao desenvolvimento:
> Test-driven, example-driven, behavior-driven.
> Definição da forma de uso externo (API) de uma
biblioteca
> Feedback imediato
> Exagero na importância da automação
11
Globalcode – Open4Education
O que estamos testando?
> Regras de negócio → teste FIT
> Funcionalidade de componentes web → Cactus
(teste in-container)
> Interface usuário → Selenium (teste in-browser)
> Estresse/desempenho → JMeter
12
Globalcode – Open4Education
Teste de aplicativos web
> Complicadores:
> Disponibilizar (ou aproximar) o ambiente de servidor
web
> Dependência de configurações
> Dependência de browsers
> Dependência de JavaScript
> AJAX / tempos de espera
13
Globalcode – Open4Education
Teste de UI para web
> Opções:
> Simular o browser → HTMLUnit
> Executar in-browser, em JavaScript → Selenium Core
> Acionar browser a partir de um programa em Java
(ou C#, Ruby, etc) → Selenium RC
> Acionar browser a partir de um plugin do browser →
Selenium IDE
> Acionar browser a partir de um wiki → StoryTest IQ
(Selenium + FitNesse)
> Acionar browser a partir de um editor de workflow →
CubicTest (Selenium + plugin Eclipse)
14
Globalcode – Open4Education
Selenium - arquitetura
Testes
JUnit
CubicTest
plugin
CubicTest
StoryTest
IQ
Selenium On
Rails
Eclipse IDE
Selenium RC Client
API (Java)‫‏‏‬
Selenium RC
Client API (Ruby)‫‏‏‬
*
Selenium RC Server
Java
Selenium Core
JavaScript
15
DOM
Selenium IDE
(só Firefox)‫‏‏‬
(X)HTML
Browser: IE, Firefox, Safari, ...
Globalcode – Open4Education
Selenium para
programadores
> Ferramentas
>
>
>
>
Selenium RC Client API para Java, Ruby, Perl, C#, Python
Programação de testes via a RC API
Programação de testes em JavaScript no Selenium Core
Componentes do lado servidor para testes in-container (para
AJAX)
> Usos:
> AJAX (componentes testáveis no servidor)
> Testes em JavaScript
> Lógica de testes com controle de fluxo, concorrência, massa de
dados de teste.
16
Globalcode – Open4Education
Selenium: não
programadores
> Ferramentas
>
>
>
>
Selenium IDE
Story Test IQ
CubicTest
Selenium Grid
> Usos:
> Record & replay
> Testes com vários browsers
> Testes como especificação do fluxo da aplicação
17
Globalcode – Open4Education
Selenium IDE
18
Globalcode – Open4Education
Selenium IDE TestRunner
19
Globalcode – Open4Education
Story Test IQ
20
Globalcode – Open4Education
Cubic Test
21
Globalcode – Open4Education
Teste de regras de
negócio
> Testes de aceitação X testes unitários
>
>
construindo o código certo (aceitação/validação)
construindo certo o código (unitário/verificação)
> Métrica RTF (Running, Tested Features) [Ron
Jeffries]
> número de funcionalidades entregues testadas e executando
> Ferramenta FitNesse
> 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
22
Globalcode – Open4Education
Fitnesse - arquitetura
diagrama extraído do site http://fitnesse.org
23
Globalcode – Open4Education
Fit – planilha original
24
Globalcode – Open4Education
FitNesse – tabela Wiki
25
Globalcode – Open4Education
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);
}
}
26
Globalcode – Open4Education
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;
}
}
27
Globalcode – Open4Education
FitNesse – resultado
28
Globalcode – Open4Education
DSLs em planilhas FIT
> DSL = “domain-specific language”
> Linguagens específicas para um
determinado domínio
> Criadas caso-a-caso, aproveitam o motor do
FIT
> Podem ser implementadas utilizando fixtures
customizadas (DoFixture)
29
Globalcode – Open4Education
Teste de componentes
JavaEE
> Fora do contêiner 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 contêiner
> são necessárias ferramentas específicas
> configuração mais complexa
> os ambientes são testados num ambiente mais próximo do
real
30
Globalcode – Open4Education
Cactus
> Ferramenta Cactus
> framework para testes de componentes Java EE
(Servlets, EJB, Filtros, tags customizados)
> baseado na ferramenta JUnit
> o teste executa parte no cliente e parte no servidor
31
Globalcode – Open4Education
Cactus
diagrama extraído do site http://jakarta.apache.org/cactus
32
Globalcode – Open4Education
Cactus - arquitetura
1b
<<new>>
1:beginX
MeuTestCase
MeuTestCase
5: endX
2: setUp()‫‏‬
3: testX()‫‏‬
4: tearDown()‫‏‬
<<Servlet>>
<<Servlet>>
Proxy
Proxy
beginXYZ
MeuTestCase
MeuTestCase
setUp*
testXYZ*
setUp
tearDown*
setUp
testXYZ
endXYZ
testXYZ
Container
JEE
tearDown
Container
JEE
tearDown
(Ex:
Jetty
Web
Container)‫‏‬
(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
33
Globalcode – Open4Education
Conclusões
> características diferentes requerem diferentes
tipos de testes
> cada tipo de teste possui a sua ferramenta
específica
> conjunto de testes balanceado → testes
diferentes nas quantidades adequadas
(pirâmide de testes)
> Testes não são só para garantia de qualidade
34
Globalcode – Open4Education
Conclusões
> Mitos:
>
>
>
>
Testador não precisa programar
Programador não precisa testar
Usuário não precisa definir testes
Vale a pena automatizar tudo
> Ligar sempre os desconfiômetros
35
Globalcode – Open4Education
Perguntas e Respostas
36
Globalcode – Open4Education
Download

A pirâmide de testes - The Developers Conference