単体テストのために、おそらくリポジトリにコミットするための要件として、最小パーセントのコードカバレッジを強制するとしたら、それは何でしょうか。
どのようにあなたがあなたの答えにたどり着いたかを説明してください(あなたがしたのが数字を選ぶだけだったのなら、私は自分でそれをすべてしたのかもしれません。)
Alberto Savoiaによるこの散文は、その質問に正確に答えています。
http://www.artima.com/forums/flat.jsp?forum=106&thread=204677
テストカバレッジに関するお祭り
ある朝早く、プログラマーは偉大な達人に尋ねた。
"私はいくつかの単体テストを書く準備ができています。どのようなコードカバレッジを目標とすべきですか?」
偉大な達人はこう答えた。
「報道について心配しないで、良いテストをいくつか書いてください。」
プログラマーは微笑み、お辞儀をし、そして去った。
...
その日の後半に、2人目のプログラマーが同じ質問をしました。
偉大な主人は沸騰したお湯の鍋を指差して言った:
「その鍋に何粒の米を入れるべきですか?」
困惑しているように見えるプログラマーは答えた。
どうすれば私はあなたに言うことができますか?それはあなたが何人の人々を養う必要があるか、彼らがどれほど空腹であるか、あなたが何を食べているか、あなたが利用できる米の量などに依存します。
「まさに」と偉大な主人は言った。
2人目のプログラマーは微笑み、お辞儀をし、そして去った。
...
一日の終わりに向かって、3人目のプログラマがやってきて、コードカバレッジについて同じ質問をしました。
「80パーセントとそれ以上ではありません!」テーブルの上に彼の拳を叩いて、船尾の声でマスターに答えた。
3人目のプログラマーは微笑み、お辞儀をし、そして去った。
...
この最後の返信の後、若い見習いが偉大な主人に近づいた。
「素晴らしいご主人様、今日私はあなたが3つの異なる答えでコードカバレッジについて同じ質問に答えるのを耳にしました。なぜ?"
偉大な主人は彼の椅子から立ち上がった。
「私と一緒に新鮮なお茶を飲みに来て、それについて話しましょう。」
彼らが熱いお茶を吸って自分のカップを満たした後、偉大な主人は答え始めました:
「最初のプログラマーは新しく、テストを始めたばかりです。今彼はたくさんのコードを持っていてテストはしていません。彼には長い道のりがあります。現時点でコードカバレッジに焦点を当てることは、意気消沈してまったく役に立たないでしょう。いくつかのテストを書いて実行することに慣れるだけでいいのです。彼は後で報道について心配することができます。」
「一方、2人目のプログラマーは、プログラミングとテストの両方でかなりの経験があります。何粒の米をポットに入れるべきかと尋ねると、私は必要なテストの量がいくつかの要因に左右されることに気づかせました。 。単一の、単純な、答えはありません、そして彼女は真実を処理し、それを扱うのに十分賢いです。」
「なるほど」と若い弟子は言いました。「ただ一つの答えがなければ、なぜ3番目のプログラマーに答えたのですか。
偉大な達人はとても激しく笑って笑ったので、彼の腹は、彼が単なる緑茶以上のものを飲んだという証拠が上下にひっくり返った。
「3人目のプログラマーは、単純な答えだけを望みます。たとえ単純な答えがない場合でも…そしてそれに続いてそれに従ってはいけません。」
若い弟子とグリズリーの偉大な達人は瞑想的な沈黙の中でお茶を飲み終えました。
100%カバレッジを目標としている場合、コードカバレッジは誤解を招くような測定基準です(すべての機能を100%テストするのではなく)。
それであなた自身またはあなたの開発者を徹底的にし、彼らのコードを通るすべての道をカバーすることを信頼しなさい。実用的であり、魔法の100%報道を追いかけないでください。コードをTDDした場合、ボーナスとして90%以上の補償が得られます。あなたが見逃したコードの塊を強調するためにコードカバレッジを使用してください(あなたがTDDをしているならば起こるべきではありません。
コードカバレッジは優れていますが、機能カバレッジはさらに優れています。私が書いたすべての一行を網羅することは信じていません。しかし、私が提供したいすべての機能の完全なテストカバレッジを書くことを信じると思います(私が自分自身に付属していて、会議の間に議論されなかった余分なクールな機能でさえ)。
テストでカバーされていないコードがあっても構いませんが、自分のコードをリファクタリングして別の動作にするかどうかは気にしません。したがって、100%機能範囲が私の唯一のターゲットです。
受け入れられた答えは良い点を作ります - すべてのプロジェクトのための標準として理にかなっている単一の数がありません。そのような標準を必要としないプロジェクトがあります。私の考えでは、受け入れられた答えが不十分なのは、与えられたプロジェクトのためにその決定をどのようにして行うのかを説明することにある。
私はそうすることでショットを取ります。私はテストエンジニアリングの専門家ではないので、もっと情報に基づいた答えが得られたら幸いです。
まず、なぜそんな基準をそもそも課したいのでしょうか。一般に、自分のプロセスに経験的な自信を取り入れたいとき。 「経験的自信」とはどういう意味ですか?さて、本当の目標の正しさ。ほとんどのソフトウェアでは、すべての入力にわたってこれを知ることができない可能性があるため、コードは十分にテストされていると言っています。これはもっとよく知っていますが、それでも主観的な基準です:あなたがそれを満たしているかどうかについては常に議論の余地があります。これらの議論は有用であり、起こるべきですが、それらはまた不確実性を露呈します。
コードカバレッジは客観的な尺度です。カバレッジレポートが表示されれば、規格が満たされているかどうかについてあいまいさはありません。それは正当性を証明しますか?まったくそうではありませんが、コードのテスト結果との間に明確な関係があります。これが、コードの正確性に対する信頼を高めるための最善の方法です。コードカバレッジは、私たちが気にかけている計り知れない品質の測定可能な近似値です。
経験的な標準を持つことが価値を付加することができるいくつかの特定のケース:
コードカバレッジは単一の指標ではありません。カバレッジを測定する方法はいくつかあります。どの基準を設定するかは、その基準を満たすために使用しているものによって異なります。
標準を設定するためにそれらを使用する場合の例として、2つの一般的な測定基準を使用します。
if
など)がある場合、両方の分岐が評価されましたか?これはあなたのコードの論理的範囲をよりよく理解するのに役立ちます。他にも多くのメトリクスがあります(行カバレッジはステートメントカバレッジと似ていますが、複数行ステートメントでは異なる数値結果が得られます;条件付きカバレッジとパスカバレッジはブランチカバレッジと似ています。あなたが遭遇するかもしれないプログラム実行)
最後に、元の質問に戻ります。コードカバレッジ標準を設定した場合、その数はどうなるべきですか。
この時点で、最初に近似値について話していることが明らかになっていることを願います。したがって、選択した数値は本質的に近似値になるでしょう。
選ぶかもしれないいくつかの数:
私は実際には80%を下回る数字を見たことがなく、設定するケースを想像するのに苦労しています。これらの基準の役割は正確さへの信頼を増すことであり、80%未満の数字は特に信頼に影響を与えるものではありません。 (はい、これは主観的なものですが、やはり、基準を設定した後に主観的な選択を一度行い、その後客観的な測定を使用することを考えています。)
上記は正確さが目標であると仮定しています。コードカバレッジは単なる情報です。それは他の目的に関連しているかもしれません。たとえば、保守容易性を心配している場合は、疎結合を気にする必要があります。これはテスト容易性によって実証できます。これはコードカバレッジによって(特定の方法で)測定できます。そのため、コードカバレッジ標準は、「保守容易性」の品質を概算するための経験的基礎を提供します。
私のお気に入りのコードカバレッジはアスタリスク付きの100%です。アスタリスクは、特定の行を「カウントしない」行としてマークできるツールを使用することを好むためです。 「数える」行を100%カバーしていれば、完了です。
基本的なプロセスは次のとおりです。
このようにして、私と私の共同研究者が新しいコードを追加したりテストを変更したりした場合、重要なことを見逃したかどうかを知らせる明るい線があります。ただし、さまざまなテストの優先順位に柔軟に対応できます。
私は私が共有したいテスト報道に関するもう一つの逸話があると思います。
私たちは巨大なプロジェクトを持っています。Twitterの上で、 700個のユニットテストで、私達は20%のコードカバレッジしか持っていない 。
それは正しい20%ですか?ユーザーが最もヒットしたコードを表すのは20%ですか?さらに50のテストを追加し、2%を追加するだけかもしれません。
繰り返しますが、コードカバレッジに関する私の 祭り の回答に戻ります。あなたはどのくらいの米を鍋に入れるべきですか?場合によります。
ユニットテストが最初から開発を推進した適切に設計されたシステムの場合、85%は非常に低い数値であると言えます。テスト可能なように設計された少人数のクラスは、それよりも適切にカバーするのは難しくありません。
この質問は次のような方法で簡単に却下できます。
確かに、コードカバレッジについては重要な点がいくつかあります。私の経験では、このメトリックは実際に使用すると非常に便利です。そうは言っても、すべてのシステムを見たことはありません。実際の価値を追加するコードカバレッジ分析を見ることの難しいシステムがたくさんあると確信しています。コードは非常に異なって見える場合があり、利用可能なテストフレームワークの範囲は異なる場合があります。
また、私の推論は、主に非常に短いテストフィードバックループに関するものです。私が開発している製品の最短フィードバックループは非常に柔軟で、クラステストからプロセス間シグナリングまですべてをカバーします。成果物のサブ製品のテストには通常5分かかります。このような短いフィードバックループでは、テスト結果(具体的にはここで見ているコードカバレッジメトリック)を使用して、リポジトリのコミットを拒否または受け入れることができます。
コードカバレッジメトリックを使用する場合は、満たす必要がある固定(任意)パーセンテージだけを使用する必要はありません。これを行うと、実際のメリットが得られません。私の意見ではコードカバレッジ分析。代わりに、次のメトリックを定義します。
新しいコードを追加できるのは、LWMを上回らず、HWMを下回らない場合のみです。言い換えると、コードカバレッジは減少することを許可されていないため、新しいコードをカバーする必要があります。私が言うべきであるとすべきではないことに注意してください(以下で説明).
しかし、これは、あなたがもう役に立たない古い十分にテストされたごみを一掃することが不可能であることを意味しませんか?はい、だからこそ、これらのことについて実用的でなければなりません。ルールを破る必要がある場合もありますが、通常の日常的な統合では、これらのメトリックが非常に有用であると経験しています。それらは、次の2つの意味を与えます。
テスト可能なコードが昇格されます。新しいコードを追加するときは、コードをテスト可能にする努力をする必要があります。テストケースですべてをカバーする必要があるためです。通常、テスト可能なコードは良いものです。
レガシーコードのテストカバレッジは、時間とともに増加しています。新しいコードを追加し、テストケースでカバーできない場合、LWMルールを回避するために、代わりにいくつかのレガシーコードをカバーしようとすることができます。少なくともこのような不正行為が必要な場合、少なくともレガシーコードのカバレッジが時間とともに増加するというプラスの副作用があり、実際にはこれらのルールの厳格な施行が一見厳格になります。
繰り返しになりますが、フィードバックループが長すぎる場合、統合プロセスでこのような設定を行うことは完全に非実用的です。
また、コードカバレッジメトリックの2つの一般的な利点についても言及したいと思います。
コードカバレッジ分析は、動的なコード分析の一部です(静的な分析、つまりLintとは対照的です)。動的コード分析中に見つかった問題(purifyファミリーなどのツールによる http://www-03.ibm.com/software/products/en/rational-purify-family )は次のようなものです。未初期化メモリ読み取り(UMR)、メモリリークなどこれらの問題は、コードが実行されたテストケースでカバーされている場合にのみ発見できます。テストケースでカバーするのが最も難しいコードは、通常、システムの異常なケースですが、システムを正常に失敗させたい場合(つまり、クラッシュではなくエラートレース)、異常なケースをカバーするためにある程度の努力をする必要があります動的コード分析でも同様です。ほんの少しの不運で、UMRはセグメンテーション違反またはさらに悪い事態につながる可能性があります。
人々は新しいコードを100%維持することに誇りを持ち、他の実装の問題と同様の情熱を持ってテストの問題について議論します。この関数をよりテスト可能な方法で記述するにはどうすればよいですか?この異常なケースなどをどのようにカバーしようとしますか?.
そして、完全性のために否定。
これが完璧な世界であれば、100%のコードが単体テストでカバーされます。しかし、これは完璧な世界ではないので、それはあなたが何のために時間があるかの問題です。結果として、私は特定の割合にはあまり集中せず、重要な部分にはもっと集中することをお勧めします。あなたのコードがよく書かれている(あるいは少なくともその合理的なファクシミリ)なら、APIが他のコードにさらされるいくつかの要点があるはずです。
これらのAPIにテストの取り組みを集中してください。 APIが1)よく文書化されていること、および2)文書と一致するテストケースが書かれていることを確認してください。期待した結果がドキュメントと一致しない場合は、コード、ドキュメント、またはテストケースのいずれかにバグがあります。これらはすべて吟味するのに適しています。
がんばろう!
チェックイン基準としては、85%がよいでしょう。
テスト対象のサブシステム/コンポーネントの重要性に応じて、出荷基準にはおそらくもっと高い水準のバーを選択したと思います。
多くの店はテストを重視していません、それであなたが少なくともゼロより上であれば価値のいくらかの感謝があります - だから間違いなく多くがまだゼロであるので非ゼロではありません。
.Netの世界では、80%が妥当とされています。しかし、彼らはこれをソリューションレベルで言います。私はプロジェクトレベルで測定することを好みます:Seleniumなどの手動テストを持っていれば30%がUIプロジェクトには大丈夫、データレイヤープロジェクトには20%が大丈夫ですが、ビジネスには95%以上が達成可能です必要でなければ、ルール層。したがって、全体のカバー率は60%になるかもしれませんが、重要なビジネスロジックはもっと高くなるかもしれません。
私もこれを聞いたことがあります:100%を目指し、あなたは80%をヒットするでしょう。しかし80%を目指し、40%ヒットするでしょう。
結論:80:20のルールを適用して、あなたのアプリのバグカウントを案内しましょう。
私はcoberturaを使っています、そしてどんな割合でも、cobertura-checkタスクの値を最新に保つことをお勧めします。最低でも、totallinerateとtotalbranchrateを現在のカバレッジのすぐ下まで上げ続けますが、これらの値を下げないでください。 Antビルド失敗プロパティもこのタスクに結び付けます。カバレッジがないためにビルドが失敗した場合は、他の人が追加したコードを知っていますが、それをテストしていません。例:
<cobertura-check linerate="0"
branchrate="0"
totallinerate="70"
totalbranchrate="90"
failureproperty="build.failed" />
私のコードが十分に単体テストされておらず、次に何をテストするべきかわからない場合は、次に何をテストするべきかを判断するためにカバレッジを使います。
私が単体テストでカバレッジを増やすならば - 私はこの単体テストが何か価値があることを知っています。
これは、カバーされていないコード、50%カバーされているコード、97%カバーされているコードに適用されます。
コードカバレッジはもう1つの指標です。それ自体で、それは非常に誤解を招く可能性があります( www.thoughtworks.com/insights/blog/are-test-coverage-metrics-overrated を参照してください)。したがって、目標は100%のコードカバレッジを達成することではなく、むしろアプリケーションのすべての関連シナリオを確実にテストすることです。
一般的に言って、私が読んだいくつかのエンジニアリングエクセレンスベストプラクティス論文から、ユニットテストの新しいコードの80%が最良の結果を生み出すポイントです。このCC%を超えると、実行される労力に対して、より少ない量の欠陥が発生します。これは、多くの大企業で使用されているベストプラクティスです。
残念ながら、これらの結果の大部分は企業の内部的なものなので、私があなたに指摘できる公共の文献はありません。
コードカバレッジは優れていますが、それによって得られるメリットがそれを達成するためのコストや労力を上回っている場合に限ります。
私達はしばらくの間80%の標準に取り組んできました、しかし私達はちょうどこれを放棄することを決定し、そして代わりに私達のテストにもっと焦点を合わせました。複雑なビジネスロジックなどに集中する
この決定は、コードカバレッジの追跡と既存のユニットテストの維持に費やした時間が増えたために行われました。私たちがコードカバレッジから得た利益は、それを達成するために費やさなければならなかった努力よりも少ないと見なされるようになったと感じました。
かなりの時間にわたって単体テストを行ってきたのであれば、95%以上にならない理由はありません。しかし、少なくとも、テストに不慣れなときでも、私は常に80%の作業をしてきました。
この数には、プロジェクトで書かれたコード(フレームワーク、プラグインなどを除く)のみを含める必要があります。さらに、外部コードへの呼び出しで書かれたコードだけで構成される特定のクラスを除外することもあります。この種の呼び出しはモック/スタブする必要があります。
自動受け入れテスト、おそらく他の統合テスト、および単体テストの組み合わせを使用するBDDを実行することを好みます。私にとっての質問は、自動テストスイート全体の目標カバレッジはどうあるべきかということです。
それはさておき、答えはあなたの方法論、言語とテストとカバレッジツールによって異なります。 RubyやPythonでTDDをするとき、100%のカバレッジを維持するのは難しくありません。 90%のカバレッジよりも100%のカバレッジを管理する方がはるかに簡単です。つまり、カバレッジギャップが発生したときに埋めるほうがはるかに簡単です(TDDを実行する場合、カバレッジギャップはまれで、通常カバレッジギャップのリストを管理することで、カバーされていないコードが頻繁に発生しているためにカバレッジ回帰を見逃してしまうのを防ぐことができます。
答えはあなたのプロジェクトの歴史にもよります。最初からそうした方法で管理されているプロジェクトでは、上記のものが実用的であることがわかりました。大規模なレガシープロジェクトのカバレッジを大幅に改善したので、その価値はありますが、古いテストされていないコードを正しく理解するのに十分に理解されていないため早く。
この難問に対する私の答えは、あなたがテストできるコードの100%のラインカバレッジとあなたがテストできないコードの0%のラインカバレッジを持つことです。
私の現在のPythonのやり方は、私の.pyモジュールを二つのフォルダーに分割することです:app1 /とapp2 /そして単体テストを実行するとき、それら二つのフォルダーの適用範囲を計算し、視覚的にチェックします。(I must 自動化) app1のカバレッジは100%、app2のカバレッジは0%です。
これらの数値が規格と異なることが判明した場合、または適用範囲が規格に準拠するようにコードの設計を変更します。
これは、ライブラリコードの100%の行カバレッジを達成することをお勧めできることを意味しています。
私はたまにapp2 /をレビューして、そこでコードをテストすることができるかどうかを確認し、可能であればそれをapp1 /に移動することができます。
これは、プロジェクトの規模によって大きく異なる可能性があるため、集計範囲についてはそれほど心配する必要はありませんが、一般的には70%から90%を超えています。
Pythonでは、カバレッジを測定しながらアプリを自動的に実行することができ、ユニットテストの数値と煙テストを組み合わせると100%のアグレゲートを得ることができるスモークテストを考案できるはずです。
Crap4j をチェックしてください。直接的なコードカバレッジよりもわずかに洗練されたアプローチです。コードカバレッジの測定値と複雑さの測定値を組み合わせて、複雑なコードが現在テストされていないことを示します。
私の意見では、答えは「どれだけの時間があるかによる」です。私は100%を達成しようとします、しかし、私が私が持っている時間にそれを得ないならば、私は大騒ぎをしません。
私がユニットテストを書くとき、私は生産コードを開発するときに私が着ている帽子とは違う帽子を着ています。私はテストしたコードが何をすると主張しているのか、そしてそれを破る可能性がある状況は何かについて考えています。
私は通常、以下の基準や規則に従います。
単体テストは私のコードの期待される振る舞いが何であるかについてのドキュメンテーションの形式であるべきです。特定の入力を前提とした期待される出力と、クライアントがキャッチしたいと思う可能性がある例外(私のコードのユーザーは何を知っておくべきですか?)
単体テストは私がまだ考えていないかもしれないという条件ならば私が何を発見するのを助けるべきであるか。 (コードを安定させて堅牢にする方法は?)
これら2つの規則が100%の適用範囲を生成しないのであれば、それもそうです。しかし、一度、私は時間があるとき、私は発見されたブロックとラインを分析して、単体テストのないテストケースがまだあるかどうか、あるいは不要なコードを排除するためにコードをリファクタリングする必要があるかどうか判断します。
それはあなたのアプリケーションに大きく依存します。たとえば、一部のアプリケーションは、単体テストできないGUIコードで大部分が構成されています。
私はそのような白黒の規則があるとは思わない。
重要な詳細事項に特に注意して、コードを見直す必要があります。
しかし、テストされていなければバグがあります。
短い答え:60-80%
長い答え:私はそれがあなたのプロジェクトの性質に完全に依存していると思います。私は通常、あらゆる実用的な部分を単体テストすることによってプロジェクトを開始します。プロジェクトの最初の "リリース"までに、あなたがしているプログラミングのタイプに基づいてかなり良い基本パーセンテージを持つべきです。その時点で、最小限のコードカバレッジを "強制"することができます。
コードの重要度にもよりますが、75%から85%の範囲で経験則を確認してください。配送コードは、家の公益事業などより徹底的にテストする必要があります。
これは、アプリケーション開発ライフサイクルのどの段階にいるのかに依存する必要があります。
しばらく開発中で、すでに多くの実装済みコードがあり、コードカバレッジについて考える必要があることに気付いたばかりの場合は、現在のカバレッジ(存在する場合)を確認し、そのベースラインを使用して各スプリント(またはスプリント期間の平均上昇)にマイルストーンを設定します。これは、エンドユーザーの価値を提供し続けながらコード負債を引き受けることを意味します(少なくとも私の経験では、エンドユーザーはテストを増やせば1ビット気にしない)彼らが新機能を見ていない場合は報道)。
あなたのドメインによっては、95%を撃つのは無理ではありませんが、私は平均して85%から90%の平均的なケースを見ていると言っています。
私は正しいコードカバレッジの最も良い症状はユニットテストが修正するのを助ける具体的な問題の量があなたが作成したユニットテストコードのサイズに合理的に対応することであると思います。
最も重要なのは、カバレッジの傾向が時間の経過とともに変化している理由を理解し、傾向の変化の理由を理解することです。傾向の変化を良いと見なすか悪いと見なすかは、理由の分析によって異なります。
Testivusの投稿から、答えの文脈は2人目のプログラマーになるべきだと思います。実用的な観点からこれを言ったので、私達は努力するためのパラメータ/目標が必要です。私たちはアーキテクチャ、機能性(ユーザーストーリー)を持っているコードを分析することによってアジャイルプロセスの中でこれを「テストする」ことができ、それから数字を思いつくことができると私は考えます。テレコム分野での私の経験に基づいて、私は60%がチェックするのに良い値であると言うでしょう。
数日前までは80%超を目標としていましたが、Generatedコードを大量に使用した後は、%ageを気にする必要はありませんが、必要なカバレッジについてレビュー担当者に問い合わせてください。