一部の作業を外部の開発者にアウトソーシングしているため、成果物の構成要素に関する契約書を作成するのに忙しいです。
これまでのところ、コードは自動テストとともに出荷される必要があります。
しかし、契約の中で事前にテストの詳細を測定可能な方法で指定するための合理的な方法は何ですか?
「100%コードカバレッジ」とは言いたくないのですが、100%はかなり無意味であることがかなり頻繁に確立されており、約70〜80%を超える収穫逓減は、おそらくコストを不必要に押し上げ、場合によっては押し上げさえするでしょう。そうでなければ非常に単純かもしれない特定のものの複雑さ。
内部的には、開発者の直感と経験に基づいて、必要なテストのレベルを決定するのは開発者に任されています。ただし、請負業者の場合、事前に合意する必要のある固定価格があり、一定レベルの品質を実施するための何らかの方法が必要です。
任意の提案や推奨読書事項をいただければ幸いです!
下請けの場合、コードが少なくとも動作必要な方法で記述されていることを確認するのはあなた次第です。そのため、チームはいくつかの自動受け入れテストを作成する必要があります。それらのテストを下請け業者に提供して、彼らがコードがそれで機能することを確認できるようにします。
単体テストでパーセンテージカバレッジが必要な場合はいつでも、コードカバレッジを測定するツールを提供するのはあなた次第です。実行している環境(.Net、Java、Rubyなど)はわかりませんが、通常、カバレッジを測定するために使用できるツールは複数あり、すべてが同じというわけではありません。また、使用するパラメータ(つまり、カバレッジの除外、カバレッジのタイプなど)を指定するか、少なくとも同意する必要があります。
以下のテストを要求することは不公平で非生産的です。
あなた自身のチームよりも多くの下請け業者を必要としないでください。受け入れ基準として一定の割合の単体テストが必要な場合は、70〜80%のような範囲を指定します。彼らがそれを打ち負かすなら、素晴らしい。私は50%のカバレッジを絶対最小と見なし、70%はまともな要件です。 70%を超えるとコストが高くなる可能性がありますが、それについてはより良い心構えがあります。
テストカバレッジなどのメトリックについてのメモ。それらは単なる数字であり、誰でも数字で遊ぶことができます。あなたの意図は良いものだと思いますが、システムをゲームしたい人なら誰でもできます。カバレッジ番号は、テストの徹底性の大まかな指標ですが、テストの品質ではありません。私の経験では、単体テストの作成に慣れていない多くのプログラマーは、統合テストを作成する傾向があり、アサーションなしでテストフレームワークを介してアプリケーションを実行するだけです。基本的に、彼らはデバッガーをステップスルーするための出発点を提供しているだけです。有用な単体テストを取得するには、時間とトレーニングが必要です。
ユニットテストの有効性を評価し、期待と期待の両方を微調整するために、早期の初期配信が必要になります。それはあなたの両方が同じページに入るのを助け、そして将来の配達をより良くするでしょう。
テストカバレッジに関するTestivus-Googleテストブログから:
ある朝早く、若いプログラマーが偉大なマスターに尋ねました。
「私はいくつかのユニットテストを書く準備ができています。どのコードカバレッジを目指すべきですか?」
偉大なマスターは答えました:
「カバレッジについて心配する必要はありません。良いテストを書いてください。」
若いプログラマーは微笑み、お辞儀をし、そして去りました。
その日遅く、2人目のプログラマーが同じ質問をしました。
偉大なマスターは沸騰したお湯の鍋を指差して言った:
「その鍋に何粒の米を入れるべきですか?」
困惑しているように見えるプログラマーは、次のように答えました。
「どうすればあなたに言うことができますか?それはあなたが何人の人々に食事を与える必要があるか、彼らがどれだけ空腹であるか、あなたが提供している他の食べ物、あなたが利用できる米の量などに依存します。」
「その通りです」と偉大なマスターは言いました。
2人目のプログラマーは微笑み、お辞儀をし、そして去りました。
一日の終わりに、3人目のプログラマーが来て、コードカバレッジについて同じ質問をしました。
「80パーセント以下ではありません!」マスターは厳しい声で答え、テーブルの上で拳を叩きました。
3人目のプログラマーは微笑み、お辞儀をし、そして去りました。
この最後の返事の後、若い見習いが偉大なマスターに近づきました。
「素晴らしいマスター、今日私はあなたがコードカバレッジについての同じ質問に3つの異なる答えで答えるのを耳にしました。なぜ?"
偉大なマスターは彼の椅子から立ち上がった:
「私と一緒に新鮮なお茶を飲みに来て、それについて話しましょう。」
彼らが熱い緑茶を吸ってカップを満たした後、偉大なマスターは始めました:
「最初のプログラマーは新しく、テストを始めたばかりです。現在、彼にはたくさんのコードがあり、テストはありません。彼にはまだ長い道のりがあります。現時点でコードカバレッジに焦点を当てることは、気のめいるようで、まったく役に立たないでしょう。彼はいくつかのテストを書いて実行することに慣れたほうがいいです。彼は後で報道について心配することができます。
一方、2番目のプログラマーは、プログラミングとテストの両方でかなりの経験があります。ポットに何粒の米を入れるべきかを尋ねると、必要なテストの量は多くの要因に依存することを彼女に理解させました。彼女はそれらの要因を私よりよく知っています。結局のところ、それは彼女のコードです。 。単一の単純な答えはありません。彼女は真実を処理し、それを処理するのに十分賢いです。」
「なるほど」と若い見習いは言いました。「しかし、簡単な答えが1つもないのなら、なぜ3番目のプログラマーに「80パーセント以下」と言ったのですか?」
偉大な主人はとても激しく大声で笑ったので、彼の腹は、彼が緑茶以上のものを飲んだことの証拠であり、上下にフロップしました。
「3番目のプログラマーは、単純な答えがない場合でも、単純な答えだけを望んでいます…そして、とにかくそれらに従わないのです。」
若い見習いとグリズリした偉大なマスターは、瞑想的な沈黙の中でお茶を飲み終えました。
より具体的な対策を考え出すことができます。例:循環的複雑度が5以上のメソッドを100%カバーします。
数値が必要な場合は、80%がよく使用されます。実際、私が現在働いている場所では、継続的インテグレーションサーバー(ハドソン)は、テストカバレッジが80%未満のプロジェクトに対して黄色のライトを表示します。
ここでの課題は、行の特定の割合がテストでカバーされていることを確認することは、コードがより良い保守性につながる方法でテストされていることを確認することとは大きく異なることです。
一つには、コードカバレッジツールは、コードを実行し、Assert.assertTrue(true)
で終わるテストにだまされる可能性があります。
それほど悪意のない懸念は、適切なテストの作成方法を知らないプログラマーが適切なレベルの粒度でテストを作成しないことです。これにより、将来の変更でテストの大幅な変更が必要になり、テストが助けではなく、リファクタリングの負担。
ですから、数字を出したいのなら、80%を使います。しかし、この数値は、優れたテストの書き方を知っている正直な開発者を扱う場合にのみ役立ちます。