※本記事は、Geminiによる意訳+翻訳を活用し、レイアウト調整したものです。
※感想は、オリジナルです。
原文
FIRST Principles and Test Smells 🚀 - DEV Community
意訳+要約
FIRSTの原則とテストの匂い
この記事は、高品質なユニットテストを書くための基本原則と、テストコードの改善点を見つけるためのヒントである「テストの悪臭」について説明しています。
FIRST原則
FIRST は、高品質なユニットテストの5つの特性を表す頭字語です。
- Fast(高速):テストは常に高速で実行されるべきです。
- Independent(独立):各テストは単独で実行できる必要があります。
- Repeatable(再現性):同じテストを複数回実行しても、結果は常に同じでなければなりません。
- Self-checking(自己チェック機能付き):テストの実行が完了したら、結果は自己説明的であるべきです。
- Timely(タイムリー):テストは、開発プロセスのできるだけ早い段階で書くことをお勧めします。
テストの悪臭
テストコードの中には、改善の余地があることを示す兆候があります。このような兆候は「テストの悪臭」と呼ばれます。
テストの悪臭の例
- テストに「if」文や「else」文が多すぎる
- テストコードに繰り返しコードがある
- テストが特定のライブラリやフレームワークに依存している
- テストが特定のデータベースや外部サービスに依存している
- テストが特定の条件下でのみ失敗する
重要な点
- テストはシンプルでわかりやすく、誰もがテスト内容と理由を理解できるようにする必要があります。
- テストに「if」文や「else」文が多すぎると、何がテストされているのか、どのような条件下でテストされているのかを理解しにくくなります。
- テストコードに繰り返しコードがある場合、より効率的な構成方法があるかもしれません。
テストの悪臭は、テストを簡素化したり、より適切に構成したりするための信号のようなものです。テストの中に「if」文があってはいけない、あるいは少し長めのテストがあってはいけないというわけではありませんが、立ち止まって「もっと簡単な方法はないだろうか」と考えるように促すものです。
GeminiへのQA
Q:カバレッジは、気にしなくてもよいのでしょうか?
テストカバレッジは、テストがコードのどの部分をどれだけ実行しているかを表す指標です。一般的に、カバレッジが高いほど、テストが網羅的で、コードの品質が高いと考えられます。
しかし、カバレッジは万能ではありません。以下の点に注意する必要があります。
1. カバレッジはテストの質を保証しない
高いカバレッジであっても、テストケースが不十分であれば、コードの欠陥を見逃してしまう可能性があります。
2. 100%カバレッジを目指す必要はない
100%カバレッジを達成することは困難であり、必ずしも必要ではありません。テスト対象の重要な部分を網羅するテストケースを作成することが重要です。
3. カバレッジはあくまで参考情報
カバレッジは、テストの進捗状況を把握するための参考情報として活用するべきです。カバレッジのみに固執せず、テストケースの内容やテスト結果を総合的に判断することが重要です。
Q:FIRSTの原則を守るために、計測するべきものは何かありますか?
FIRST原則に基づいたテストの質を評価するために、以下のメトリクスを計測することができます。
1. テスト実行時間
すべてのテストケースを実行するのにかかる時間を計測することで、Fast(高速)の原則を満たしているかどうかを評価することができます。
2. テスト独立性
各テストケースが単独で実行できるかどうかを確認することで、Independent(独立)の原則を満たしているかどうかを評価することができます。
3. テスト再現性
同じテストケースを複数回実行しても、結果が常に同じかどうかを確認することで、Repeatable(再現性)の原則を満たしているかどうかを評価することができます。
4. テスト自己チェック機能
テストの実行結果が自己説明的かどうかを確認することで、Self-checking(自己チェック機能付き)の原則を満たしているかどうかを評価することができます。
5. テストタイムリーネス
テストが開発プロセスのどの段階で書かれているかを計測することで、Timely(タイムリー)の原則を満たしているかどうかを評価することができます。
その他のメトリクス
上記以外にも、以下のメトリクスを計測することで、FIRST原則に基づいたテストの質を評価することができます。
- テストカバレッジ:テストがコードのどの部分をどれだけ実行しているかを表す指標
- テスト失敗率:テスト実行時に失敗するテストケースの割合
- テスト修正率:テストコードが修正される頻度
- テストメンテナンス時間:テストコードをメンテナンスするのにかかる時間
まとめ
FIRST原則に基づいたテストの質を評価するために、様々なメトリクスを計測することができます。これらのメトリクスを活用することで、テストコードの改善点を見つけ、より良いテストコードを書くことができます。
感想+雑記
カバレッジは、注目するけど、他のものには注目することはあんまりないな。
テスト時間なんて、かなり適当だし。。。
さすがに、全部のテストがパスしてるかは見てる。
再現性は、ローカル以外の環境で実行しても同じ結果が得られることは確認しているので、担保されているはず。
タイムリーかどうかは、作った段階でテスト書くようにしてるから、かなりタイムリーだと思う。
自己チェックはかなり難しい気がする。
攻殻機動隊のタチコマみたいに、自動でテスト修復してくれたり、提案してくれるものがあると楽なんだが。。。
FIRSTの原則が指標として図れれば、かなりテスト品質は上がりそうな気がする。
指標として測れるようになったら、一度でいいから「こいつはくせえッ!ゲロ以下のにおいがプンプンするぜッ!」って言ってみたい。