8 ポイント 投稿者 ohjongin 2022-06-22 | 9件のコメント | WhatsAppで共有

このような単純な Kotlin のコードでさえ、すべての分岐をテストするのは不可能に近いほど難しい。Kotlin がこのコードをバイトコードにコンパイルする際、コード作成者が意図していない分岐を生み出してしまうためだ。

when(answer) {
"yes" -> true
else -> false
}

Kotlin はコードを書く開発者に多くの便利な機能を提供する一方で、バイトコードにコンパイルすると、このようにユーザーには見えない分岐文も数多く生成する。JVM プラットフォームで最も広く使われているテストカバレッジツールである JaCoCo は、ブランチカバレッジを計算する際にバイトコード基準で計算するため、Kotlin 言語を使う開発者が気づいていない分岐までカバーすることを要求することがある。そのため、Kotlin 開発者がテストカバレッジ 100% を達成しようとすると、上のようなケースではデコンパイルしてみなければならない場合があり、さらに運が悪いとデコンパイルに失敗して、バイトコードを直接見てどのような分岐があるのか確認しなければならない場合もある。

9件のコメント

 
mse9000 2022-06-23

カバー不可能なコード

https://toss.im/slash-21/sessions/1-6

 
youknowone 2022-06-23

カバレッジ追跡を100%にしようとしてコードをねじ曲げるのは、本末転倒な感じですね。

 
innoceive 2022-06-23

コードは歪んでいません。人間の視点から見て、より楽な別の方法があるだけです。

 
regentag 2022-06-23

防衛(兵器システム)分野では、防衛事業庁の指針でコードカバレッジ 100% が求められます。
現実的に 100% の達成は難しいですが、その代わりカバーできない箇所については、なぜカバーできないのかを一つひとつ説明として付けなければならないと認識しています。

 
doldari 2022-06-22

狂気のテスト100%勢…

 
roxie 2022-06-23

www

 
ganadist 2022-06-22

enum / sealed / boolean の分岐ケースでは、適切に処理されていない場合、Kotlin 1.6 では警告が、1.7 からはエラーが出るようにコンパイラが変更されました。

https://youtrack.jetbrains.com/issue/KT-47709

 
525hm 2022-06-22

slash 21で内容をよく拝見しました(笑)

 
ohjongin 2022-06-22

あ〜 slash 21で出た内容だったんですね……私は知人のTwitterで初めて見たので……今さらですみません……