コードを確認する以外に、この問題に対する適切な解決策は見つかりませんでした。
コードカバレッジは、私が今まで見た中で最悪の単体テストを検出できません
テストの数を見ると、そこでも失敗します。テスト名を見ると、失敗するに違いありません。
そのようなテストを作成する「Kevin」のような開発者がいる場合は、コードレビューによってのみそれらのテストをキャッチします。
「ケビン」がどのように小切手を打ち負かすかの要約:
と呼ばれるテストを作成しsmokes
ます。このテストでは、パラメーターのさまざまな組み合わせを使用して、テスト対象のクラスのすべてのメソッドを呼び出します。各呼び出しはでラップされtry { ... } catch (Throwable t) {/* ignore */}
ます。これにより、優れたカバレッジが得られ、テストが失敗することはありません
派手なテストシナリオを考えたように聞こえる名前で、空のテストをたくさん書いてwidgetsTurnRedWhenFlangeIsOff
くださいwidgetsCounterrotateIfFangeGreaterThan50
。これらは空のテストであるため、失敗することはありません。CIシステムを検査するマネージャーは、多くの詳細なテストケースを確認します。
コードレビューは「ケビン」を捕まえる唯一の方法です。
開発者がそれほど悪くないことを願っています
アップデート
今朝はにわか雨が降った。「ケビン」を捕まえることができる自動分析のタイプがありますが、残念ながらそれはまだだまされている可能性があるため、悪いテストを書く人にとっては解決策ではありませんが、悪いテストを書くのは難しくなります。
ミューテーションテスト
これは古いプロジェクトであり、最近のコードでは機能しません。これを使用することはお勧めしません。しかし、私はそれが「ケビン」を止める一種の自動分析を示唆していることを示唆しています
これを実装する場合、ASMなどを使用してバイトコードを一度に1つの小さな「jest」で書き換える「JestingClassLoader」を作成します。次に、このクラスローダーをロードしたときに、クラスに対してテストスイートを実行します。テストが失敗しない場合、あなたは「ケビン」の土地にいます。問題は、コード内のすべての分岐点に対してすべてのテストを実行する必要があることです。ただし、自動カバレッジ分析とテスト時間プロファイリングを使用して、処理を高速化することもできます。つまり、各テストが実行するコードパスを知っているので、1つの特定のパスに対して「冗談」を言うと、そのパスにヒットしたテストのみを実行し、最速のテストから開始します。これらのテストのいずれも失敗しない場合は、テストカバレッジに弱点があります。
したがって、誰かがJesterを「近代化」した場合、「Kevin」を見つける方法があります。
しかし、それは人々が悪いテストを書くのを止めることはありません。コードが現在の動作、バグなどすべての動作を検証するテストを作成することで、このチェックに合格できるためです。「あなたのためにテストを書く」ソフトウェアを販売している会社さえあります。ここからリンクしてGoogleページランクを与えることはしませんが、彼らがそのようなソフトウェアを手に入れれば、コードベースを拘束するテストがたくさんあり、バグは見つかりません(何かを変更するとすぐに「生成された」テストは失敗するため、変更を行うには、変更自体と、変更が壊れたすべての単体テストへの変更について議論する必要があり、変更を行うためのビジネスコストが増加します。その変更は実際のバグを修正しています)