3

配列を取り、各アイテムの発生頻度をカウントし、一意のアイテムの配列を返します。最初にカウント順に並べ替え、次にアルファベット順に並べ替え、次にアルファベット順に大文字と小文字を区別しないようにして、実行間で順序が変わらないようにします。

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;

しかし、それは同じ結果を得ました。

4

1 に答える 1