我有這個函式,它接受一個陣列,計算每個專案出現的頻率,并回傳一個唯一專案的陣列,首先按計數排序,然后按字母順序排序,然后按字母順序不區分大小寫,以便順序在運行之間不會改變。
use strict;
use warnings;
sub sorted {
my @elements = @_;
my %counts;
foreach my $e (@elements) {
$counts{$e} ;
}
my @sorted = sort {
$counts{$b} <=> $counts{$a} or $a cmp $b or lc $a cmp lc $b
} keys %counts;
return @sorted;
}
1;
我有這個測驗用例,一切正常:
use strict;
use warnings;
use Test::More;
use module;
is_deeply(['A', 'a', 'c', 'b'], [sorted('a', 'b', 'c', 'a', 'c', 'A', 'A')]);
done_testing();
我運行它并用于Devel::Cover收集測驗覆寫率數字。我期望 100% 的覆寫率,但分支和條件覆寫率很短:
HARNESS_PERL_SWITCHES=-MDevel::Cover prove -I. test.t && cover
test.t .. ok
All tests successful.
Files=1, Tests=1, 1 wallclock secs ( 0.03 usr 0.00 sys 0.22 cusr 0.02 csys = 0.27 CPU)
Result: PASS
Reading database from ./cover_db
--------- ------ ------ ------ ------ ------ ------ ------
File stmt bran cond sub pod time total
--------- ------ ------ ------ ------ ------ ------ ------
module.pm 100.0 50.0 66.6 100.0 n/a 0.2 90.4
test.t 100.0 n/a n/a 100.0 n/a 99.8 100.0
Total 100.0 50.0 66.6 100.0 n/a 100.0 94.8
--------- ------ ------ ------ ------ ------ ------ ------
檢查HTML報告,顯示部分分支和條件沒有覆寫:


我不明白為什么Devel::Cover認為某些分支和條件沒有被涵蓋。
它抱怨 TF 的分支沒有被覆寫,哪<=>一部分永遠不會是真的?我有 'a' 和 'c' 兩次,所以<=>當它比較 'a' 計數(2)和 'b' 計數(1)時,應該回傳零(F)和非零(T)。
對于條件覆寫,報告稱不包括檢查的兩個部分都是錯誤的情況。同樣,我認為我應該涵蓋這一點,因為我的人數和名稱都相同。
我需要添加什么測驗用例才能獲得 100% 的分支和條件覆寫率?
或者,如果sort像這樣的函式對于 來說很棘手Devel::Cover,我怎么能告訴它忽略這些?我把代碼改成
my @sorted = sort {
# uncoverable branch left
# uncoverable condition true
$counts{$b} <=> $counts{$a} or $a cmp $b or lc $a cmp lc $b
} keys %counts;
但這確實得到了相同的結果。
uj5u.com熱心網友回復:
覆寫率的問題在于它永遠不會擁有它比較的兩個專案的相同計數(<=>條件為0),并且它們是相同的(第一個cmp條件為0)。
為此,我們需要將一個元素與其自身進行比較,但排序例程使用頻率計數中的鍵,而不是陣列元素——因此任何一個元素都沒有兩個!因此,永遠不會將元素與自身進行比較,并且前兩個條件永遠不會同時失敗。
一種解決方案:按實際元素排序,然后選擇唯一的元素。
至于分支故障,我現在還不能完全確定,但一個實用的(作業)解決方案是取消這些測驗。總計?
package TestMod;
use strict;
use warnings;
use List::Util qw(uniq);
sub sorted {
my @elements = @_;
my %counts;
foreach my $e (@elements) {
$counts{$e} ;
}
my @sorted = sort {
my $cmp;
if ( my $nc = $counts{$b} <=> $counts{$a} ) {
$cmp = $nc
}
elsif ( my $ac = $a cmp $b ) {
$cmp = $ac
}
else { $cmp = lc $a cmp lc $b }
$cmp;
} @elements;
return uniq @sorted;
}
1;
現在我得到
main_TestMod.pl .. ok
All tests successful.
Files=1, Tests=1, 0 wallclock secs ( 0.02 usr 0.01 sys 0.29 cusr 0.02 csys = 0.34 CPU)
Result: PASS
Reading database from .../test_coverage/cover_db
--------------- ------ ------ ------ ------ ------ ------ ------
File stmt bran cond sub pod time total
--------------- ------ ------ ------ ------ ------ ------ ------
TestMod.pm 100.0 100.0 n/a 100.0 0.0 2.5 97.3
main_TestMod.pl 100.0 n/a n/a 100.0 n/a 97.4 100.0
Total 100.0 100.0 n/a 100.0 0.0 100.0 98.3
--------------- ------ ------ ------ ------ ------ ------ ------
HTML output written to .../test_coverage/cover_db/coverage.html
done.
(我系統上的實際路徑被抑制)
注意——現在根本沒有條件。FWIW:當我離開那個大的、典型的sort-ish 多 - edor條件時(對元素進行排序,而不是頻率哈希鍵),則該條件確實具有 100% 的覆寫率。但是分支失敗了。
? In this case of straight consecutive tests and no other processing we can also return in each branch (the block in sort is an anonymous sub and one can return)
package TestMod;
use strict;
use warnings;
use List::Util qw(uniq);
sub sorted {
my @elements = @_;
my %counts;
foreach my $e (@elements) {
$counts{$e} ;
}
my @sorted = sort {
if ( my $nc = $counts{$b} <=> $counts{$a} ) {
return $nc
}
elsif ( my $ac = $a cmp $b ) {
return $ac
}
else {
return lc $a cmp lc $b
}
} @elements;
return uniq @sorted;
}
1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/350404.html
上一篇:傳遞輸入值后不更新屬性
