sábado, 4 de setembro de 2010

Testes de Desempenho com JUnitPerf + JUnit

tech_loadres

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:

desempenho

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 :

desempenho2

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:

desempenho3

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

2 comentários:

  1. Olá Nina.
    Ótimo trabalho e obrigado por citar meu blog.
    Vou recomendar seu post para meus alunos.
    Até! Edgard Davidson

    ResponderExcluir
  2. Olá Professor Edgar,
    Obrigado, Seu blog junto ao material da Clarkware Consulting me motivaram a escrever sobre JUnitPerf.
    Seu artigo esta ótimo e didático.
    With best regards

    ResponderExcluir