我有这个函数,它接受一个数组,计算每个项目出现的频率,并返回一个唯一项目数组,首先按计数排序,然后按字母顺序排序,然后按字母顺序不区分大小写,这样运行之间的顺序就不会改变。
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;
但这确实得到了相同的结果。