SlideShare une entreprise Scribd logo
1  sur  13
Télécharger pour lire hors ligne
J820

Testes de
performance

com

JUnitPerf

Helder da Rocha (helder@acm.org)

argonavis.com.br
Testes automáticos de performance
Ferramentas como JProbe, OptimizeIt e outros profilers
oferecem diferentes tipos de estatísticas sobre gargalos
no código
Desvantagem: são aplicações interativas e requerem
avaliação dos resultados

argonavis.com.br

Para testes automáticos de performance pode-se usar
o JUnitPerf, que é um decorador sobre testes de JUnit
JUnitPerf oferece classes que permitem construir objetos
que recebem testes existentes do JUnit e acrescentam
neles avaliação de performance
JUnitPerf não altera testes existentes. Pode-se ainda
rodar os testes sem o JUnitPerf
2
Testes de performance
JUnitPerf (www.clarkware.com)
Coleção de decoradores para medir performance e
escalabilidade em testes JUnit existentes

TimedTest
Executa um teste e mede o tempo transcorrido
Define um tempo máximo para a execução. Teste falha se
execução durar mais que o tempo estabelecido

argonavis.com.br

LoadTest
Executa um teste com uma carga simulada
Utiliza timers para distribuir as cargas usando distribuições
randômicas
Combinado com TimerTest para medir tempo com carga

ThreadedTest
Executa o teste em um thread separado

3
Como usar JUnitPerf

argonavis.com.br

Primeiro é preciso estimar os valores ideais para
execução dos testes
1. Escreva testes JUnit para o seu código
2. Execute um profiler para descobrir os gargalos.
Utilize os dados obtidos como parâmetros para
estabelecer os valores máximos aceitáveis para cada
método
3. Escreva testes do JUnit (se não existirem) para os
trechos críticos quanto à performance
4. Escreva um TimedTest do JUnitPerf para cada teste
novo e execute-o. O teste deve falhar. Se passar, não há
problema de performance com o código
5. Trabalhe no código até que os testes passem.

4
Como funciona?
Exemplo de execução de um TimedTest

argonavis.com.br

1. Recuperar instante de tempo (antes da execução do
JUnit test case)
2. Chamar super.run(TestResult) para executar o teste
JUnit original
3. Recuperar o tempo transcorrido após a execução do
teste JUnit. Se o tempo for maior que o permitido então
uma exceção AssertionFailedError é provocada (o que
faz o teste falhar)

TimedTest estende junit.framework.Test
Um TimedTest, ao ser criado recebe como argumento
um teste JUnit e o tempo máximo que deve durar.
5
Como usar um TimedTest
Importe com.clarkware.junitperf.TimedTest e escreva
um método public static Test suite()
Em suite(), crie uma instância de um teste existente. A
instância deve conter apenas um teste. Não use
Test testCase = OperacoesTest.suite();

Use
Test testCase = new OperacoesTest("testSoma");

Depois passe a instância do teste para um TimedTest
argonavis.com.br

Test timedTest = new TimedTest(testCase, 2000);

Coloque tudo em um TestSuite
TestSuite suite = new TestSuite();
suite.addTest(timedTest);

e retorne no método suite() da classe
TestRunner

Operacoes
TestCase
TimedTest
Suite

6
LoadTest
Permite simular carga, por exemplo, vários usuários acessando a
aplicação ao mesmo tempo
Essencial para descobrir problemas que podem surgir em ambientes
multiusuário (por exemplo: problemas de concorrência e integridade
de dados usados por vários usuários)

Para simular os cenários de teste há dois timers
ConstantTimer: espera tempo fixo entre requisições (default: zero)
RandomTimer: espera um tempo aleatório entre requisições

argonavis.com.br

Exemplo: LoadTest simples (executa uma vez por usuário) com
100 usuários simultâneos
public static Test suite() {
TestSuite suite = new TestSuite();
Test test = new ExampleTestCase("testMethod");
Test loadTest = new LoadTest(test, 100);
suite.addTest(loadTest);
return suite;
}
TestRunner

Example
TestCase
LoadTest
Suite

7
Outros exemplos de LoadTest
LoadTest com 100 usuários, cada um executando o teste 10 vezes
public static Test suite() {
TestSuite suite = new TestSuite();
Test test = new ExampleTestCase("testMethod");
Test loadTest = new LoadTest(test, 100, 10);
suite.addTest(loadTest);
return suite;
}

argonavis.com.br

Usando intervalos aleatórios (com variação entre 500 e 1000 ms)
entre requisições
public static Test suite() {
TestSuite suite = new TestSuite();
Timer timer = new RandomTimer(1000, 500);
Test test = new ExampleTestCase("testMethod");
Test loadTest = new LoadTest(test, 100, 10, timer);
suite.addTest(loadTest);
return suite;
}

8
Tempo total de uma operação multiusuário
Pode-se especificar o tempo máximo de uma
operação quando executada por muitos usuários

Example
TestCase
LoadTest
TimedTest

argonavis.com.br

import com.clarkware.junitperf.*;
import junit.framework.*;

TestRunner

Suite

public class ExampleLoadTest extends TestCase {
public ExampleLoadTest(String name) { super(name); }
public static Test suite() {
TestSuite suite = new TestSuite();
Timer timer = new ConstantTimer(1000);
TestCase existente
int maxUsr = 10;
Decorador de carga
int iters = 10;
long maxElapsedTime = 20000;
Test test = new ExampleTestCase("testOneSecondResp");
Test loadTest = new LoadTest(test, maxUsr, iters, timer);
Test timedTest = new TimedTest(loadTest, maxElapsedTime);
suite.addTest(timedTest);
Decorador de tempo
return suite;
}
}

9
Tempo de resposta para cada cliente
Exemplo: garantir que cada usuário tenha um tempo de resposta
de 3 segundos quando houver 100 usuários simultâneos

argonavis.com.br

Não é a mesma coisa que testar se a operação inteira executou em
tempo aceitavel para todos os usuários (exemplo anterior)
O tempo de resposta de um usuário pode ser aceitável, ou do grupo
como um todo mas o de alguns usuários pode não ser (alguns
podem ter resposta muito rápida e compensar lentidão de outros)
public static Test suite() {
TestSuite suite = new TestSuite();
Test test = new ExampleTestCase("testStress");
Test timedTest = new TimedTest(test, 3000);
Test loadTest = new LoadTest(timedTest, 100);
suite.addTest(timedTest);
Example
return suite;
TestCase
}
TimedTest
LoadTest

TestRunner

Suite

10
Exercícios

argonavis.com.br

1. Utilize os arquivos fornecidos
Rode os testes JUnit da aplicação fornecida. Garanta que
todos executam com sucesso
a) Escreva testes JUnitPerf para que testConcatena() não
demore mais que 0.001 segundo para ser executado:
troque as concatenações de String por StringBuffers para
fazê-lo passar.
b) Acrescente uma carga de 50 usuários e execute
testConcatena(). Use synchronized no código para evitar
a corrupção dos dados.
c) Crie um novo teste que garanta que os 50 usuários
levem no máximo 0.050 segundos para completar a
operação.

11
Fontes
Documentação JUnitPerf. junitperf.sourceforge.net
[2] Hightower/Lesiecki. Java Tools for eXtreme
Programming. Wiley, 2002
[3] Eric Burke & Brian Coyner. Java eXtreme
Programming Cookbook. O'Reilly, 2003

argonavis.com.br

[1]

12
Curso J820
Produtividade e Qualidade em Java:
Ferramentas e Metodologias
Revisão 1.1

© 2002, 2003, Helder da Rocha
(helder@acm.org)

argonavis.com.br

Contenu connexe

Similaire à Testes de performance com JUnitPerf

JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitárioselliando dias
 
ybr789try
ybr789tryybr789try
ybr789tryteste
 
Testes de software
Testes de softwareTestes de software
Testes de softwareteste
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e CatchUilian Ries
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
agendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeagendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeelliando dias
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netRenato Groff
 

Similaire à Testes de performance com JUnitPerf (20)

JUnit
JUnitJUnit
JUnit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Junit
JunitJunit
Junit
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Java 12
Java 12Java 12
Java 12
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
ybr789try
ybr789tryybr789try
ybr789try
 
Testes de software
Testes de softwareTestes de software
Testes de software
 
Aula5
Aula5Aula5
Aula5
 
Testes de Software.ppt
Testes de Software.pptTestes de Software.ppt
Testes de Software.ppt
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
agendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeagendamento de tarefas com java se e ee
agendamento de tarefas com java se e ee
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.net
 
Testes de carga com j meter
Testes de carga com j meterTestes de carga com j meter
Testes de carga com j meter
 
Android Aula 4
Android Aula 4Android Aula 4
Android Aula 4
 

Plus de Denis L Presciliano

Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsDenis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsDenis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis L Presciliano
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e ComposiçãoDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoDenis L Presciliano
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntDenis L Presciliano
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em JavaDenis L Presciliano
 

Plus de Denis L Presciliano (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Classes internas
Classes internasClasses internas
Classes internas
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
J530 15 workshop
J530 15 workshopJ530 15 workshop
J530 15 workshop
 

Testes de performance com JUnitPerf

  • 1. J820 Testes de performance com JUnitPerf Helder da Rocha (helder@acm.org) argonavis.com.br
  • 2. Testes automáticos de performance Ferramentas como JProbe, OptimizeIt e outros profilers oferecem diferentes tipos de estatísticas sobre gargalos no código Desvantagem: são aplicações interativas e requerem avaliação dos resultados argonavis.com.br Para testes automáticos de performance pode-se usar o JUnitPerf, que é um decorador sobre testes de JUnit JUnitPerf oferece classes que permitem construir objetos que recebem testes existentes do JUnit e acrescentam neles avaliação de performance JUnitPerf não altera testes existentes. Pode-se ainda rodar os testes sem o JUnitPerf 2
  • 3. Testes de performance JUnitPerf (www.clarkware.com) Coleção de decoradores para medir performance e escalabilidade em testes JUnit existentes TimedTest Executa um teste e mede o tempo transcorrido Define um tempo máximo para a execução. Teste falha se execução durar mais que o tempo estabelecido argonavis.com.br LoadTest Executa um teste com uma carga simulada Utiliza timers para distribuir as cargas usando distribuições randômicas Combinado com TimerTest para medir tempo com carga ThreadedTest Executa o teste em um thread separado 3
  • 4. Como usar JUnitPerf argonavis.com.br Primeiro é preciso estimar os valores ideais para execução dos testes 1. Escreva testes JUnit para o seu código 2. Execute um profiler para descobrir os gargalos. Utilize os dados obtidos como parâmetros para estabelecer os valores máximos aceitáveis para cada método 3. Escreva testes do JUnit (se não existirem) para os trechos críticos quanto à performance 4. Escreva um TimedTest do JUnitPerf para cada teste novo e execute-o. O teste deve falhar. Se passar, não há problema de performance com o código 5. Trabalhe no código até que os testes passem. 4
  • 5. Como funciona? Exemplo de execução de um TimedTest argonavis.com.br 1. Recuperar instante de tempo (antes da execução do JUnit test case) 2. Chamar super.run(TestResult) para executar o teste JUnit original 3. Recuperar o tempo transcorrido após a execução do teste JUnit. Se o tempo for maior que o permitido então uma exceção AssertionFailedError é provocada (o que faz o teste falhar) TimedTest estende junit.framework.Test Um TimedTest, ao ser criado recebe como argumento um teste JUnit e o tempo máximo que deve durar. 5
  • 6. Como usar um TimedTest Importe com.clarkware.junitperf.TimedTest e escreva um método public static Test suite() Em suite(), crie uma instância de um teste existente. A instância deve conter apenas um teste. Não use Test testCase = OperacoesTest.suite(); Use Test testCase = new OperacoesTest("testSoma"); Depois passe a instância do teste para um TimedTest argonavis.com.br Test timedTest = new TimedTest(testCase, 2000); Coloque tudo em um TestSuite TestSuite suite = new TestSuite(); suite.addTest(timedTest); e retorne no método suite() da classe TestRunner Operacoes TestCase TimedTest Suite 6
  • 7. LoadTest Permite simular carga, por exemplo, vários usuários acessando a aplicação ao mesmo tempo Essencial para descobrir problemas que podem surgir em ambientes multiusuário (por exemplo: problemas de concorrência e integridade de dados usados por vários usuários) Para simular os cenários de teste há dois timers ConstantTimer: espera tempo fixo entre requisições (default: zero) RandomTimer: espera um tempo aleatório entre requisições argonavis.com.br Exemplo: LoadTest simples (executa uma vez por usuário) com 100 usuários simultâneos public static Test suite() { TestSuite suite = new TestSuite(); Test test = new ExampleTestCase("testMethod"); Test loadTest = new LoadTest(test, 100); suite.addTest(loadTest); return suite; } TestRunner Example TestCase LoadTest Suite 7
  • 8. Outros exemplos de LoadTest LoadTest com 100 usuários, cada um executando o teste 10 vezes public static Test suite() { TestSuite suite = new TestSuite(); Test test = new ExampleTestCase("testMethod"); Test loadTest = new LoadTest(test, 100, 10); suite.addTest(loadTest); return suite; } argonavis.com.br Usando intervalos aleatórios (com variação entre 500 e 1000 ms) entre requisições public static Test suite() { TestSuite suite = new TestSuite(); Timer timer = new RandomTimer(1000, 500); Test test = new ExampleTestCase("testMethod"); Test loadTest = new LoadTest(test, 100, 10, timer); suite.addTest(loadTest); return suite; } 8
  • 9. Tempo total de uma operação multiusuário Pode-se especificar o tempo máximo de uma operação quando executada por muitos usuários Example TestCase LoadTest TimedTest argonavis.com.br import com.clarkware.junitperf.*; import junit.framework.*; TestRunner Suite public class ExampleLoadTest extends TestCase { public ExampleLoadTest(String name) { super(name); } public static Test suite() { TestSuite suite = new TestSuite(); Timer timer = new ConstantTimer(1000); TestCase existente int maxUsr = 10; Decorador de carga int iters = 10; long maxElapsedTime = 20000; Test test = new ExampleTestCase("testOneSecondResp"); Test loadTest = new LoadTest(test, maxUsr, iters, timer); Test timedTest = new TimedTest(loadTest, maxElapsedTime); suite.addTest(timedTest); Decorador de tempo return suite; } } 9
  • 10. Tempo de resposta para cada cliente Exemplo: garantir que cada usuário tenha um tempo de resposta de 3 segundos quando houver 100 usuários simultâneos argonavis.com.br Não é a mesma coisa que testar se a operação inteira executou em tempo aceitavel para todos os usuários (exemplo anterior) O tempo de resposta de um usuário pode ser aceitável, ou do grupo como um todo mas o de alguns usuários pode não ser (alguns podem ter resposta muito rápida e compensar lentidão de outros) public static Test suite() { TestSuite suite = new TestSuite(); Test test = new ExampleTestCase("testStress"); Test timedTest = new TimedTest(test, 3000); Test loadTest = new LoadTest(timedTest, 100); suite.addTest(timedTest); Example return suite; TestCase } TimedTest LoadTest TestRunner Suite 10
  • 11. Exercícios argonavis.com.br 1. Utilize os arquivos fornecidos Rode os testes JUnit da aplicação fornecida. Garanta que todos executam com sucesso a) Escreva testes JUnitPerf para que testConcatena() não demore mais que 0.001 segundo para ser executado: troque as concatenações de String por StringBuffers para fazê-lo passar. b) Acrescente uma carga de 50 usuários e execute testConcatena(). Use synchronized no código para evitar a corrupção dos dados. c) Crie um novo teste que garanta que os 50 usuários levem no máximo 0.050 segundos para completar a operação. 11
  • 12. Fontes Documentação JUnitPerf. junitperf.sourceforge.net [2] Hightower/Lesiecki. Java Tools for eXtreme Programming. Wiley, 2002 [3] Eric Burke & Brian Coyner. Java eXtreme Programming Cookbook. O'Reilly, 2003 argonavis.com.br [1] 12
  • 13. Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 © 2002, 2003, Helder da Rocha (helder@acm.org) argonavis.com.br