Testes de performance JUnitPerf

Documentos relacionados
J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

Programação Orientada a Objetos

extreme Programming Brasil Testes de Unidade Java com em Java argonavis.com.br Helder da Rocha

Java 2 Standard Edition Classes internas

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Estrutura de Dados Funções e Procedimentos

J820. Helder da Rocha argonavis.com.br

Testes com JUnit. Treinamento ALESP SPL. Danilo Toshiaki Sato.

JUnit: framework de testes unitários. Fred Lopes

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

POO fundamentos Parte II. Professor Vicente Paulo de Camargo

J820. Testes em J2EE com. Jakarta C A C T U S. argonavis.com.br. Helder da Rocha

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

Palavras Reservadas da Linguagem Java

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

Universidade de São Paulo (USP) Instituto de Ciências Matemáticas e de Computação (ICMC) Programação Orientada a Objetos (SCC0204)

Programação C/C++ Slide 5 Nielsen Castelo Damasceno

Instituto de Informática Estrutura de Dados II

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Engenharia de Software

Introdução a Teste de Software

Java Standard Edition (JSE)

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Threads. Linguagem Java. Adenilso da Silva Simão 17/05/05

Threads. O que é uma Thread? Paralelismo

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Só podem ser executados por uma Thread que detenha o lock do objecto

Aula 2 POO 1 Prática. Profa. Elaine Faria UFU

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Sistemas Operacionais. Universidade Federal de Minas Gerais. Aula 2. Gerência de Processos

Threads. Leonardo Gresta Paulino Murta

De acordo com [Clark2000] estas são algumas vantagens de se utilizar JUnit:


Detalhamento de um Framework Horizontal: JUNIT

Programação Concorrente

Teste Automatizado POO. Prof. Marcio Delamaro

Declaração de Construtores em Java

Teste Unitários com NUnit. Anderson Martiniano da Rocha

JAVA APLICAÇÕES GRÁFICAS Propriedades Utilizadas: Animation: Paint and thread FACULDADE DE TECNOLOGIA SENAC PELOTAS

A sintaxe básica para definir uma função é: function nome_da_função([arg1, arg2, arg3]) { Comandos;... ; [return <valor de retorno>]; }

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Classes e Objetos. Prof. Leonardo Barreto Campos 1

Concorrência em Java. Threads em Java

Ciência da Computação ENGENHARIA DE SOFTWARE. Teste de Software

Testes Automatizados. Cursos de Verão 2007 IME/USP Dairton Bassi & Paulo Cheque

Conceitos Básicos da Programação OO

Linguagem de Programação II Implementação

Introdução a classes e objetos. Copyright 2006 by Pearson Education

INSTRUÇÕES DE REPETIÇÃO

Introdução. Por que desenvolver ALGORITMO?

Segundo trabalho prático de implementação Sistema de reserva de assentos

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Análise de Programação

Tratamento de Exceções

Metodologias de Teste de Software

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 28 de setembro de 12

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Simulação de Caixa Automático

Programação orientada a objetos

Programação Orientada a Objetos

MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura


Estruturas de controle Parte 1

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Notas de Aula 09: Tratamento de exceções

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

02. [Sebesta, 2000] Quais são as vantagens e as desvantagens dos tipos de dados decimais?

Computação II Orientação a Objetos

Organização de programas em Python. Vanessa Braganholo

Implementando uma demonstração

Idiomas de Programação

Interfaces e Classes Internas

Estruturas de dados funcionais

JABUTI & MUJAVA JACKSON ANTONIO DO PRADO LIMA SILVIA REGINA VERGILIO

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

J550. Sessões. Helder da Rocha

Testes Unitários com JUnit

PRDS C#.Net Alexandre L. Silva

Lista de exercícios 2

Classes, Métodos e Propriedades

Programação Gráfica Parte 2 Versão em Java 2006 PUCPR Tutoria de Jogos 1º Ano

Métodos e Procedimentos. Prof. Jesus José de Oliveira Neto

Lição 11 Herança, polimorfismo e interfaces

Introdução à Ciência da Computação com Jogos Bruno Feijó - Esteban Clua - Fávio S. Corrêa da Silva

Familiarização com a ferramenta JavaCC

Visibilidade e Encapsulamento

Universidade da Beira Interior. Sistemas Distribuídos. Folha 4-1. Threads Daemon Threads

Classes e Objetos. Sintaxe de classe em Java

Construtores e Especificadores de Acesso

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

Programação de Computadores II TCC /Turma A 1

Seleção Múltipla Laços (while, do-while, for) AULA 05

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Transcrição:

J820 Testes de performance JUnitPerf com Helder da Rocha (helder@acm.org)

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 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 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 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 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 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 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; } 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 import com.clarkware.junitperf.*; import junit.framework.*; TestRunner Example TestCase LoadTest TimedTest 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); int maxusr = 10; 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); return suite; Decorador de tempo TestCase existente Decorador de carga 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 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 } TestRunner TimedTest LoadTest Suite 10

Exercícios 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 [1] 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 12

Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 2002, 2003, Helder da Rocha (helder@acm.org)