ユニットテストコンテスト


12

私の雇用主は、毎月の単体テストの日の競争を実施しています。1日は単体テストの作成に専念します。明らかに、1か月を通してより多くのテストを行いますが、これは1日であり、コンテストの「勝者」には賞が与えられます。しかし、勝者が誰であるかを判断するのは難しいと感じています。

各テストケースにポイントを割り当てていました。したがって、このような単体テストを作成した場合...

for (int i = 0; i < 100; i++) {
  assertTrue(i*i, square(i));
}

100ポイントが与えられます。明らかにこれは単純な例ですが、各テストケースに「ポイント」を割り当てる際の問題を示しています。

私たちは主にJavaとJavascriptのショップです。そのため、テストしたコードブランチの数をメトリックとしてカウントすることをお勧めします。コードカバレッジツール(EclEmmaなど)を使用して、テストしたブランチを簡単にカウントできます。ただし、Seleniumテストでこれをどのように行い、Javascriptソースのコードカバレッジを取得するのかわかりません(アイデアはありますか?)

このコンペティションの勝者をどのように決定できるかについての提案はありますか?

編集

私は単体テストの書き方を知っています。効果的な単体テストの書き方を知っています。何をテストするか決めるのに助けは必要ありません。私はこの競争をコントロールすることはできません。競争は続きます。それで、私はそれを改善するためにいくつかの入力を追加するか、テストをゲームで続けます(はい、私はそれらをゲームします。もちろんそれらをゲームします。賞品があります)

編集

この質問ここでは、明らかに重複していない、それは良いテストケースを見つける方法に関する有用な情報が含まれているものの、それが競争を評価するための任意の有用な指標を提供していません。


そうでもない。私は最初からそれを実現しました
ショーン

2
まだ完全に理解していないようです。が最高のテストケースを書いたかの尺度は、完全に主観的であるか、ある程度これらの問題を抱えています。どの指標が最適に機能するかは、この競技の目標と、競技者の成熟度(つまり、最高のテストを作成するのではなくスコアリングを活用する可能性は低い)によって異なります。

繰り返しますが、いいえ。ゲームができることに気づきました。私はこの競争をコントロールすることはできませんが、「どうすればこれをもっとうまくできるか」と尋ねられました。
ショーン

13
競合にしないことは改善と見なされますか?なぜすべてが競争でなければならないのですか?なぜコラボレーションできないのですか?より意味のない単体テストをいくつか削除して、便利なスモークテストと回帰テストのスイートを作成すると役立つかもしれません。
トーマスオーエンズ

1
私はトーマスと一緒にいます...コードの品質が向上したので、勝者はコードベース/顧客でなければなりません。単体テストのコードカバレッジに基づいて、全体/グループの目標を設定します...現在またはそれ以上+ 5%。...そして賞品のためにシステムをゲームしないでください...よくやった仕事に何が起こったとしても、それ自体の報酬ですか?
JeffC

回答:


15

このコンペティションの勝者をどのように決定できるかについての提案はありますか?

私にとって理にかなっている唯一のことは、投票によることです-すべての開発者は、他のすべての開発者のテストに自分のテストを除くいくつかのポイントを割り当てることができます。多分、彼はそれが「最も効果的な」テストだと考えているテストで3ポイント、2番目と2番目のポイントが2ポイントです。最もポイントの多いテストが勝ちです。特定のテストを誰が書いたのかを事前に知らずにポイントの割り当てを行った場合、より良い結果が得られる場合があります。

ボーナスとして、すべてのテストのピアレビューを取得できます。


2
これも私の考えでした。テストの価値を測定する他の方法はありません。
エリックキング

2
はい、「優れたテスト」は、ピアまたは尊敬される当局のいずれかによって判断を検討する必要のある主観的なものです。メトリックの追跡は、多くの無駄な努力につながり、実際の価値はほとんどありません。複数の賞があると面白いかもしれません:最も想像力豊かなテスト、「以前はテスト不可能だと考えられていたものをテストする」賞、最高のパフォーマンステスト、最も効果的なテスト、最も不明瞭なテスト、賢いテスト、最も価値のあるテスト、エンドユーザーに高く評価されるテスト...
ティムデイ

6

したがって、このような単体テストを作成した場合...

for (int i = 0; i < 100; i++) {
 assertTrue(i*i, square(i));
}

100ポイントが与えられます。

ループ内のアサーションはほとんど意味がなく、複数のアサーション(特にループまたはマップの形式)でのテストは作業が難しいため、この人に0ポイントを与えます(テストが実際に関連する何かをテストしている場合でも)。

問題は本質的に、[簡単に] cheされないメトリックを持っていることです。アサートの数のみに基づくメトリックは、書かれたLOCごとに開発者に支払うこととまったく同じです。Pay-by-LOCの場合と同様に、コードを維持するのが巨大で不可能になりますが、実際の会社のポリシーは、役に立たない、場合によっては不適切に書かれたテストにつながります。

アサートの数が関係ない場合、テストの数も関係ありません。これは、この種の状況で想像できる多くのメトリック(結合されたものを含む)にも当てはまります。

理想的には、体系的なアプローチを適用します。実際には、これはほとんどのソフトウェア開発会社ではほとんど機能しません。だから私はいくつかの他のことを提案することができます:

  1. テストにペアレビューを使用し、1分あたりのWTFメトリックの数に似たものを使用します。

  2. バグの数に対するこれらのテストの経時的な影響を測定ます。これにはいくつかの利点があります。

    • 公平に思える、
    • バグレポートとその運命に関する十分なデータを収集すれば、実際に測定できますが、
    • 実際に価値があります!
  3. ブランチカバレッジを使用しますが、他のメトリック(およびレビュー)と組み合わせます。ブランチカバレッジには利点がありますが、CRUDコードをテストしてより良いグレードを取得することは、開発者の時間を費やす最良の方法ではありません。

  4. 現時点で適用する指標を一緒に決定します(そのような決定は歓迎されないか、一部の企業やチームでは不可能な場合もあります)。メトリックを頻繁に確認および変更し、より関連性の高いものを選択し、誰もが何をどのように測定するかを明確に理解するようにします。


1
ゼロポイントの場合は+1。その他の異議は、AAA-アレンジ、アクト、アサートです。パラメータ化されたテスト。実装のコードのコピーはありません
...-thepacker

5

バグを発見し、より多くのコードカバレッジを達成し、より多くのテストを行うことで人々にインセンティブを与えるために、あなたの雇用主はこのユニットテストの日を組織すると思います。

したがって、勝者は、最も多くのバグを見つける開発者、またはコードカバレッジの最大の増加を達成したテストの開発者であることが理にかなっていると思います。

問題/バグ/欠陥追跡システムで新しいエントリが開かれた場合、テストはポイントを獲得します。その問題のエントリが既に開いている場合、カウントされません。また、コメントで示唆されているように、独自のコードのバグはカウントされません。他の人のコードのバグだけがカウントされるべきです。残念ながら、この方法では、すべての失敗したテストがふるいにかけられ、対応する問題が解決されるまで数日かかるため、すぐに満足することはできません。また、これは常に機能するとは限りません。システムが成熟するにつれて、テストを追加してバグを発見することが非常にまれになり始める可能性があります。

コードカバレッジの増加は、新しいテストによって表される改善のより客観的な測定を提供する可能性があります。まず、競技会の前日に全コードカバレッジを記録する必要があります。次に、各開発者は、他の開発者によって作成されたテストによるコードカバレッジの増加を考慮せずに、テストのみから生じるコードカバレッジの増加を何らかの形で示す必要があります。これは、おそらく、各開発者のマシンに行き、誰かのテストがコミットされる前に新しいコードカバレッジを記録する審判が必要になることを意味します。

ちなみに、コードカバレッジを考慮に入れると、質問で提供した例のようなばかげたことをする代わりに、実際のテストを書く人に公平な報酬が与えられます。


2
有望なように聞こえますが、「システムをゲーミングする」動作は、既知の唯一のバグの素晴らしいコレクションを並べて、次のテスト競争を「発見する」ことになります... dilbert.com/strip/1995-11 -13
ティムデイ

3
1つのオプションは、他の誰かが書いたコードのバグに対してのみポイントを与えることです。
セルスケッグス


あなたが正しい@ col6y、それも非常に重要です。残念ながら、システムをリグする方法はまだあります。たとえば、あなたのコードが私のコードを呼び出してその仕事を終わらせた場合、私のコードはあなたのコードが「事故」に​​苦しんでいることを知ることができます。
マイクナキス

3
同意しません。ユニットテストは、それらが新しく書かれたとき、そもそもバグを見つけるためのものではありません、それは誤りです。書かれてから数週間または数か月後に回帰を見つけることができますが、競争に役立つ指標を提供するには遅すぎます。通常、特定のバグが発生した後に単体テストを作成して、将来同じタイプのバグが発生しないことを確認します。
Doc Brown
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.