Testes de Software em Perl

Joenio Costa
Publicado em 06/08/2006

r1 - 06 Aug 2006 - JoenioCosta

Testes de Software em Perl

Este artigo é um resumo sobre programacao de testes.

Algumas lições da engenharia de software:

* Software exige mais tempo de manutenção do que desenvolvimento
* Coisas que pareciam óbvias, tornam-se obscuras depois do desenvolvimento
* Corrigir uma falha é mais fácil do que encontrá-la e do que garantir que novos bugs não sejam introduzidos

Por estas razões, as boas práticas de desenvolvimento envolvem a documentação adequada do código, suas premissas, lógica, e testes.

Como testes funcionam

Se alguma vez você instalou um módulo do CPAN manualmente, deve ter passado pelos seguintes passos:

   $ make
   $ make test
   $ make install

O que o make test faz é executar uma serie de testes, os arquivos *.t dentro do diretorio t/. Cada arquivo .t é um script em perl, que realiza um ou mais testes.

O que é um teste

De uma maneira bem simples, um teste é um script em perl, que imprime uma das seguintes respostas: "ok" ou "not ok".

Por exemplo:

        print "1..1\n";

        if (1 == 1) {
                print "ok\n";
        } else {
                print "not ok\n";
        }

Este é apenas um exemplo simples, que pode ser executado pelo método runtests do modulo Test::Harness:

        perl -MTest::Harness -e "runtests 'mytest.t'";

Se voce executar este comando, devera' obter uma resposta dizendo que os testes foram executados e bem sucedidos.

Você acaba de concluir o seu primeiro teste de software em Perl!

Indo um pouco além

A maioria dos testes não serão assim tão simples. Quando temos uma série de testes, nós devemos numerar as respostas ("ok 1", "not ok 2", etc), de forma a facilitar a identificacao dos testes:

        print "1..2\n";

        if (1 == 1) {
                print "ok 1\n";
        } else {
                print "not ok 1\n";
        }

        if ('abc' eq 'abc') {
                print "ok 2\n";
        } else {
                print "not ok 2\n";
        }

Imagine se você tiver que fazer centenas de testes, o trabalho que será gerenciar os próprios testes!

Neste ponto entram módulos de auxílio, como o Test::More.

Test::More

Com o Test::More, muito do trabalho de preparação pode ser deixado de lado. Por exemplo, não precisamos nos preocupar em contar o numero de testes:

        ok( 1, 'the number 1 should evaluate to true' );
        is( 2 + "2", 4, 'numeric strings should numerify in addition' );
        like( 'abc', qr/z*/, '* quantifier should match zero elements' );

        ok 1 - the number 1 should evaluate to true
        ok 2 - numeric strings should numerify in addition
        ok 3 - * quantifier should match zero elements

Os comentarios nao sao obrigatorios, mas sao uteis para que o usuário final possa saber o que acontece.

Testando módulos

Test::More também facilita o teste de módulos. Vamos começar escrevendo um teste simples:

        use strict;
        use Test::More tests => 1;
        BEGIN {
            use_ok('My::Module');
        }

Como o módulo ainda não existe, ao executar este teste você vai obter a seguinte mensagem de erro:

        % perl -w MyModule.t
        1..1
        not ok 1 - use My::Module;
        #     Failed test (MyModule.t at line 4)
        #     Tried to use 'My::Module'.
        #     Error:  Can't locate Module.pm in @INC [trimmed]
        # Looks like you failed 1 tests of 1.

É mais ou menos assim que funciona a programação orientada a testes: você escreve um teste, obtém um erro, corrige, e prossegue neste ciclo até que seu programa esteja completo.

Prosseguindo o teste de um módulo com Test::More, podemos verificar a criação de um objeto e testar algumas de suas propriedades:

        use_ok( 'My::Module' );

        my $foo = My::Module->new();
        can_ok( $foo->boo() );
        isa_ok( $foo, 'My::Module' );

Esta será a resposta quando todos os módulos forem criados corretamente:

        ok 1 - use My::Module;
        ok 2 - My::Module->can(boo)
        ok 3 - object->isa('My::Module')

Este é o tipo de teste básico que você pode começar a usar imediatamente em seus projetos.

Conclusão

Testes são uma ferramenta útil de programação, e podem tornar seus softwares ainda mais robustos.

Perl oferece boas ferramentas para desenvolvimento de testes, que merecem ser aproveitadas.

AUTHOR

Joenio Costa

blog comments powered by Disqus