2012-08-23 9 views
5

Ćwiczę, aby utworzyć nowy moduł przy użyciu Module :: Starter. Napisałem kilka przypadków testowych dla pakietu i czasami działają OK.Jak mogę debugować moduł wykonany przez Module :: Starter?

Jednak zauważyłem, istnieją dwa problemy:

  • Kiedy przypadki testowe nie chcę umieścić kilka wypowiedzi funkcja drukowania w fazie testów. Uruchomiłem make test i to tylko mówi mi, że moje przypadki testowe nie powiodły się, nie pokazuje mojego wydrukowanego wyjścia, pomimo tego jestem naprawdę pewien, że osiągnięto wyciągi.

  • Powiedz, że mam trzy przypadki testowe do przetestowania jednej funkcji, umieszczam instrukcję drukowania wewnątrz funkcji, gdy uruchamiane są przypadki testowe, raportuje, że tylko jeden z trzech przypadków testowych został uruchomiony. Jeśli usuniemy instrukcję drukowania, wszystkie trzy przypadki testowe zostaną uruchomione. Dlaczego?

Oto mój kod:

# package declaration and stuff... 
sub get_in { 
    my ($hash, @path) = @_; 
    my $ref = $hash; 
    print 'lol'; # This is the troublesome print statement. Remove this statement and all three test cases will run and pass 
    foreach (@path) { 
    if (ref($ref) eq 'HASH' && exists $ref->{$_}) { 
     $ref = $ref->{$_}; 
    } else { 
     return undef; 
    } 
    } 
    return $ref; 
} 

to przypadki testowe:

use Test::More tests => 3; 
use strict; 
use warnings; 
use diagnostics; 
require_ok('Foo::Doc'); 
ok(Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c') == 101); 
ok(@{ Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => [ 1, 2, 3 ] } } }, 'a', 'b', 'c') } == @{ [ 1, 2, 3 ] }); 
+3

To pytanie nie jest naprawdę specyficzne dla Module :: Starter. Standardowy układ projektu Perl zawiera katalog 't' z testami' * .t' przy użyciu Testu :: Prostego lub Testu :: Więcej lub niektóre z nich, aby uzyskać sukces lub niepowodzenie testu. Każdy zestaw narzędzi do tworzenia Perla udostępnia narzędzia do uruchamiania testów i wyprowadzania wyników w standardowym raporcie za pomocą narzędzi dostarczonych w rdzeniu Perla. – zostay

Odpowiedz

7

Istnieje kilka problemów z was testy, które należy rozwiązać, a także swojej samego pytania . Najpierw twoje pytanie:

Jeśli chcesz, aby dane wyjściowe pojawiały się w testach, musisz jawnie wydrukować na standardowy błąd. Najlepszą praktyką jest również posiadanie danych wyjściowych z prefiksem #. Moduł Test::More udostępnia narzędzia, dzięki którym można to łatwo zrobić.

my $got = Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c'); 
ok($got == 101); # you probably want is() instead, see below 
diag("GOT $got"); # outputs "# GOT 101" or whatever to STDERR 

Jeśli nie chcesz drukować, że wyjście za każdym razem, ale tylko wtedy, pełne rejestrowanie jest wymagane, można użyć note:

note("GOT $got"); 

Jest to przydatne podczas korzystania prove -v aby uruchomić testy:

prove -l -v t/test.t 

Jest też explain funkcja, która zrzuci złożoną wyjście do oglądania:

diag explain $got; 
# OR 
note explain $got; 

Co do innych problemów. Jest to generalnie korzystne jest stosowanie is() do ok():

is($got, 101); # gives slightly more readable output on error 

Również podczas testowania złożonych struktur danych należy użyć is_deeply() dokonać kompletnej porównania:

is_deeply($got, [1, 2, 3]); 

Zdecydowanie warto zapoznać się z dokumentacją z Test::More, ponieważ tam jest wiele użytecznych informacji.

2

Aby rozwiązać drugie pytanie, należy zachować ostrożność przy pisaniu na standardowe wyjście w skryptach testowych. Test::More skanuje standardowe wyjście, szukając wynikowych testów testowych, takich jak ok 5 i not ok 6 - disgronificator enabled.Gdy wypiszesz "lol" na standardowe wyjście, ale nie dodasz nowej linii, moduł testowy ustawi "lolok 9 - it works" i nie rozpozna go jako wyniku testu. (Aby uzyskać dodatkową zabawę, połóż oświadczenia print "not "; przed wszystkimi testami).

Lepsza praktyka jest taka, jak zostay mówi, aby pisać do standardowego błędu, używając diag i innych funkcji wyjściowych, które zapewnia Test::More.