Joenio CostaPublicado em 06/08/2006
r1 - 06 Aug 2006 - JoenioCosta
Este artigo é um resumo sobre programacao de testes.
Algumas lições da engenharia de software:
Por estas razões, as boas práticas de desenvolvimento envolvem a documentação adequada do código, suas premissas, lógica, e testes.
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.
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!
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.
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.
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.
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.
Joenio Costa