O JUnitPerf destina-se a ser utilizado especificamente nas situações de desempenho quantitativo ou requisitos de escalabilidade.
O teste do JUnit é usado junto ao JUnitPerf para verificar o desempenho. Aqui estou usando a classe de teste FoneFisicaTest, que já tinha falado num outro artigo:
public class FoneFisicaTest extends TestCase{
private FoneFisicaBusinessRules testFoneFisica;
public FoneFisicaTest(String testName){
super(testName);
}
public void setUp() {
ApplicationContext factory = new ClassPathXmlApplicationContext("contextApplication.xml");
this.testFoneFisica = (FoneFisicaBusinessRules) factory.getBean ("foneFisicaBusinessRules");
}
@Test
public void testBuscaFone() {
FoneFisica f = testFoneFisica.buscarFone(3);
assertNotNull(f);
}
@Test
public void testCriarFone() {
boolean b = testFoneFisica.criar(3, "6666665");
assertTrue(b);
}
}
Para usar o JUnitPerf basta baixar o JUnitPerf.jar e o JUnit.jar (versão 3.5 para cima) e colocá-los no classpath, no meu caso estou usando Eclipse IDE e coloquei no buildpath. Em outras IDE’s deve ser algo parecido.
Link’s para os jar’s:
http://clarkware.com/software/JUnitPerf.html#download
http://www.junit.org/
JUnitPerf
LoadTest é um decorador que executa um teste com um número de usuários simultâneos e iterações.
TimedTest é um decorator que pega tempo do execução do teste JUnit. Caso o tempo seja maior que o permitido, dispara uma exceção AssertionFailedError.
JUnit
RepeatedTest é um decorador que executa um teste repetidamente.
Exemplo:
Para criar um teste de carga de 10 usuários simultâneos, sendo que cada um executará 20 vezes o serviço testCriarFone com um atraso de 1 segundo entre adição de usuários, temos o seguinte código:
public static Test suite() {
int usuarios = 10;
int iteracoes= 20;
Timer tempo = new ConstantTimer(1000);
Test testCase = new br.com.madeira.pessoa.testeunit.FoneFisicaTest(
"testCriarFone");
Test repeatedTest = new RepeatedTest(testCase, iteracoes);
Test loadTest = new LoadTest(repeatedTest, usuarios, tempo);
return loadTest;
}
Resultado:
Tempo de teste não chegou 1 segundo e não disparou a exceção. Grifei em vermelho o tempo do teste que é de 0,671 s.
Agora outro teste:
10 usuários simultâneos e 1000 milisegundos de tempo:
public static Test suite() {
int usuarios = 10;
long tempo = 1000;
Test testCase = new br.com.madeira.pessoa.testeunit.FoneFisicaTest(
"testCriarFone");
Test timedTest = new TimedTest(testCase, tempo);
Test loadTest = new LoadTest(timedTest, usuarios);
return loadTest;
}
Resultado :
Não passou no teste de desempenho.
Agora vamos tentar aumentar o tempo para 1400 milissegundos e 10 usuários simultâneos:
public static Test suite() {
int usuarios = 10;
long tempo = 1400;
Test testCase = new br.com.madeira.pessoa.testeunit.FoneFisicaTest(
"testCriarFone");
Test timedTest = new TimedTest(testCase, tempo);
Test loadTest = new LoadTest(timedTest, usuarios);
return loadTest;
}
Resultado:
Passou no teste, provavelmente o gargalo estava na concorrência. E pode ser também um problema de banco de dados e/ou da aplicação. No caso estou usando banco de dados Mysql.
O JUnitPerf tem licença BSD é mantido pelo Clarkware Consulting.
Mais informações:
O blog do professor Edgard Davidson com farto conteúdo e vídeo:
http://edgarddavidson.com/?p=542
e
Clarkware Consulting
http://clarkware.com/software/JUnitPerf.html
Nunca esqueça que primeiro de fazer quebrar o teste e depois funcionar.
Obs.: A visualização do teste de desempenho é mais detalhada no Netbeans, apesar de gostar mais do Eclipse tenho que reconhecer os méritos do Netbeans.
Fonte:
http://edgarddavidson.com/?p=542
e
http://clarkware.com/software/JUnitPerf.html
Bye see you next post