2010-03-18 9 views
5

Jestem trochę nowy w Devel :: Cover module, ale okazało się, że jest bardzo przydatny w upewnianiu się, że nie brakuje mi testów.Jak mogę uzyskać 100% pokrycia testowego w module Perla, który korzysta z DBI?

Problemem, który napotykam, jest zrozumienie raportu z Devel :: Cover. Przyjrzałem się dokumentacji, ale nie mogę wymyślić, co muszę przetestować, aby uzyskać 100% pokrycia.

Edit - muszę jasno powiedzieć, że nie mówię, muszę 100% pokrycia, bo jak wiele osób podkreślić, 100% pokrycia jest luźny termin, nie nie znaczy, że mój kod jest bezbłędny, a nie zawsze musi być całkowicie konieczne. Ponieważ jestem nowy na rzecz Rozwoju :: Okładka, jestem zainteresowany, aby wiedzieć dlaczego mój kod nie jest w 100% pokrycie w razie brakuje mi kilka ważnych testów.

Oto wynik z raportu Okładka:

line err stmt bran cond sub pod time code 
... 
36             sub connect_database { 
37    3     3  1 1126  my $self = shift; 
38    3 100       24  if (!$self->{dsn}) { 
39    1         7   croak 'dsn not supplied - cannot connect'; 
40              } 
41 ***  2   33     21  $self->{dbh} = DBI->connect($self->{dsn}, q{}, q{}) 
42               || croak "$DBI::errstr"; 
43    1         11  return $self; 
44             } 
... 
line err  %  l !l&&r !l&&!r expr 
----- --- ------ ------ ------ ------ ---- 
41 ***  33  1  0  0 'DBI'->connect($$self{'dsn'}, '', '') || croak("$DBI::errstr") 

A oto i przykład z mojego kodu, który testuje ten konkretny wiersz:

my $database = MyModule::Database->new({ dsn => 'Invalid DSN' }); 
throws_ok(sub { $database->connect_database() }, 
    qr/Can't connect to data source/, 
    'Test connection exception (invalid dsn)'); 

Ten test przechodzi - connect robi zgłoszę błąd i wykonam test "throws_ok".

Mam kilka testów, które sprawdzają poprawność połączenia, dlatego myślę, że mam 33% pokrycia, ale jeśli czytam to poprawnie, cover uważa, że ​​nie testuję części "|| croak" twierdzenie. Myślałem, że jestem z testem "throws_ok", ale oczywiście brakuje mi czegoś.

Czy ktoś ma porady, w jaki sposób mogę przetestować moją linię DBI-> connect?

Dzięki!

Edit:

Brian przechylił mnie do raportu HTML i tabeli prawdy, która wyjaśnia, dlaczego linia nr 41 nie przechodzi. Jedyny problem polega na tym, że nie mogę zrozumieć, co mi mówi. Sądzę, że prawdziwym sednem mojego pytania jest to, dlaczego ta konkretna linia nie przechodzi przez zasięg.

Oto tabela prawdy:

LINE # % # coverage # condition 
41 # 33 # A | B | deC# 'DBI'->connect($$self{'dsn'}, '', '') || croak("$DBI::errstr") 
    # # 0 | 0 | 0 # 
    # # 0 | 1 | 1 # 
    # # 1 | X | 1 # (THIS LINE IS Green - the rest are red) 

Jeśli ktoś mógłby pomóc wyjaśnić tę tablicę prawdy, będę wdzięczny. Wspomniano również, że aby przekazać zasięg, muszę mieć sfałszowany obiekt bazy danych, ale nie bardzo rozumiem, jak cokolwiek w wynikach zasięgu mogłoby mi w tym pomóc.

Jeszcze raz dziękuję!

+1

Próba uzyskania pełnego pokrycia ubezpieczenia to prawdopodobnie zmarnowany wysiłek. Pokrycie gałęzi powinno być więcej niż wystarczające. Jeśli Twój kod jest tak ważny, że potrzebujesz pokrycia warunkowego, nie powinieneś go pisać w Perlu. Jako korzyść uboczna, Devel :: Cover działa znacznie szybciej, gdy nie zbierasz danych dotyczących pokrycia warunków. –

+0

"Zasięg 100%" nie ma znaczenia, jeśli nie kwalifikujesz się do pokrycia. Pokrycie linii? Pokrycie oddziałów? Pokrycie trasy? Każda z nich ma różne poziomy ufności i trudność wdrożenia. Nawet wtedy spoglądasz na zwrot zainwestowanego czasu. Czy jest to system krytyczny dla bezpieczeństwa, który może kogoś zabić? W takim przypadku zasięg 100% ścieżki nie będzie wystarczający: będziesz potrzebował dokładnych testów systemowych także przez przeszkolonych inżynierów testowych. Czy wiąże się to z systemami finansowymi? W takim przypadku zdecydowanie powinieneś przeprowadzić audyt bezpieczeństwa. każdy% pokrycia nie jest równy "ukończony". –

+0

@Robert P - Nie dążę do 100% zasięgu - Próbuję dowiedzieć się, czy brakuje mi testu na moim DBI-> connect. Ponieważ jestem nowy w Devel :: Cover, myślę, że dobrze jest wiedzieć, dlaczego mój kod nie jest w 100% objęty. Czytałem oba blogi, które bdfoy link poniżej i wiem, że nie potrzebuję 100% zasięgu. Podobnie jak Perl :: Critic - przekazywanie krytyków bez ostrzeżeń to za mało. – BrianH

Odpowiedz

9

Ponadto, nie należy zbytnio wieszać na 100% pokrycia testowego. Celem jest pełne przetestowanie aplikacji, a nie uzyskanie doskonałych wyników w Devel :: Cover. Zobacz posty Owidiusza na temat:

W twoim przypadku, wygląda na to, że nie obejmują one wszystkich oddziałów, więc nie uzyskać doskonałe wyniki. Musisz wykonać testy, które wykonują obie strony tego ||. Otrzymujesz 33% procent pokrycia, ponieważ zajmujesz się tylko jedną trzecią przypadków dla tej linii. Raport HTML z Devel :: Cover pokazuje tabelę prawdy i brakujące przypadki.

Tabela prawdy pokazuje możliwe stany, które należy objąć w przypadku rozgałęzienia. A 1 pokazuje stan, który jest prawdziwy, 0 pokazuje stan, który jest fałszywy, a X pokazuje stan, do którego nie dotrzesz. Musisz przetestować wszystkie kombinacje, które można wykonać. Ponieważ || jest operatorem zwarcie, nie trzeba testować warunki raz jeden z nich przechodzi:

0 || 1  connect to database fails and croak succeeds 
0 || 0  connect to database fails and croak fails (unlikely) 
1 || X  connect to database succeeds, so short circuit 

To trochę niezwiązane z danym problemem, ale uważam, że często pojawia się w nich problemy. Chociaż Effective Perl Programming jest miesiącem od uderzenia w półki, Josh McAdams spędził sporo czasu rozmawiając o zastrzyku uzależnienia w Perlu. Jeśli masz problemy z testowaniem kodu, zwykle masz problem z projektowaniem. Jeśli wewnętrznie generujesz obiekty bazy danych w podprogramach, na przykład malujesz się w rogu. Dlatego może być trudno przetestować. To może nie być problem w twoim przypadku, ale jest o czym myśleć.

+0

Myślę, że głównym punktem Owidiu było to, że 100% pokrycia testowego nie jest równoznaczne z "brakiem błędów", w przeciwieństwie do odrzucenia idei 100% pokrycia. "Jeśli nie jest to objęte, jest zepsute. – DVK

+0

Rzeczywiście był to punkt Owidiusza. Dlatego powiedziałem w zasadzie to samo w moim drugim zdaniu. –

+0

Yep - Te 2 wpisy na blogu są tym, co sprawiło, że patrzyłem na Devel :: Cover. Naprawdę nie próbuję uzyskać 100% pokrycia testowego - byłem bardziej ciekawy, czy brakuje mi testu w tym konkretnym przypadku, który powinienem przetestować. I dobra rada dotycząca trudnego testowania kodu. W tym przypadku był to test, który został już napisany. Chciałem zobaczyć, jak dobrze minąłem Devel :: Cover i wpadłem na DBI-> connect. Dzięki za poradę! – BrianH

5

Musisz sfałszować bibliotekę DBI (lub dowolną zewnętrzną zależność), aby całkowicie pokryć testy jednostek.

Możesz użyć Test :: MockObject lub dowolnego innego podejścia do szyderstwa (np. Nasza firma opracowała własną, niestandardową, bardzo wydajną bibliotekę perlącą).

Zobacz także this article specjalnie na temat szyderstwa DBI.

Należy również upewnić się, że używasz najnowszej wersji programu Devel :: Cover. Spędziłem 3 dni na testach jednostkowych, dopóki nie przyszło mi na myśl, że błąd nie jest w moim kodzie, a nie w moim teście jednostkowym, ale w starszej wersji Devel :: Cover, którą moja firma zainstalowała. Dosłownie zignorował niektóre ścieżki kodowe w przypadkach "A || B".

+0

DBD :: Mock jest bardzo przydatny do tego. http://search.cpan.org/perldoc?DBD::Mock – daotoad

+0

LOL dobre timonowanie daotoad - Właśnie zaktualizowałem link, wspominając o DBD :: Mock 1 sekundę temu :) – DVK

+0

Tak więc okładka specjalnie szuka mnie, aby wyśmiać moją bazę danych i ustanowić fałszywe połączenie, mimo że udało mi się nawiązać połączenie i pomyślnie je anulować? Jestem trochę obeznany z testem :: MockObject, ale nie wiedziałem o DBD :: Mock. Będę musiał zajrzeć do nich dalej. – BrianH

Powiązane problemy