配列を取り、各アイテムの発生頻度をカウントし、一意のアイテムの配列を返します。最初にカウント順に並べ替え、次にアルファベット順に並べ替え、次にアルファベット順に大文字と小文字を区別しないようにして、実行間で順序が変わらないようにします。
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' の両方を 2 回持っているので<=>
、'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;
しかし、それは同じ結果を得ました。