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ę!
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. –
"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". –
@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