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
Como testes funcionam
Se alguma vez você instalou um módulo do CPAN manualmente, deve ter passado pelos seguintes passos:$ make $ make test $ make installO 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 metodo 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 usuario final possa saber o que acontece.
Testando módulos
Test::More tambem 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.Links
- http://www.extremeperl.org/bk/test-driven-design
- http://www.extremeperl.org/bk/unit-testing
- http://www.perl.com/pub/a/2001/12/04/testing.html
- http://www.perldesignpatterns.com/?UnitTests
