単体テストのROIの明確な証拠はありますか?


127

ユニットテストは私には素晴らしいように聞こえますが、重要な価値がある他の人を納得させることができない限り、実際にそれを学ぶことに時間を費やす必要があるかどうかはわかりません。私は、他のプログラマー、そしてより重要なことに、管理のBean-counterに、テストフレームワークの学習、テストの作成、それらの更新の維持などに費やされるすべての余分な時間は、それ自体、そしてそれからいくらかお金を払うことになると説得する必要があります。

どんな証拠がありますか?誰かが実際に同じソフトウェアを2つの別々のチームで開発しました。1つは単体テストを使用し、もう1つは使用せず、結果を比較しましたか?疑わしい。私はそれを「インターネットで調べて、誰もがそれについて話しているので、それが正しいことであるに違いない」と正当化することになっているのでしょうか?

単体テストは努力に値することを素人に納得させる確かな証拠はどこにありますか?

回答:


98

はい。これは、NCSTのボビージョージとローリーウィリアムズによる研究へのリンクであり、ナガパン他による別の研究へのリンクです。まだまだあると思います。テストに関するウィリアムズ博士の出版物は、それらを見つけるための良い出発点になるかもしれません。

[編集]上記の2つの論文はTDDを具体的に参照しており、TDDを採用した後の初期開発時間の15〜35%の増加を示していますが、リリース前の欠陥は40〜90%減少しています。フルテキストバージョンを入手できない場合は、Google Scholarを使用して、公開されているバージョンを見つけることができるかどうかを確認することをお勧めします


14
最初の調査では、アジャイル+ TDDをウォーターフォールプロジェクトと比較しています。2つのアジャイルチームを比較した場合、結果はより適切になります。2番目の研究では、TDDプロジェクトに品質上のボーナスがほとんどまたはまったくない他の研究について言及しています。また、TDDに必要な追加時間に関する経営陣の見積もりを比較すると、ドメインの専門知識が高い2つのチームの方が大幅に高く見積もられていますが、テストカバレッジも20%低くなっています。これは私自身の経験を裏付けるものであり、私がまだ使用していないシステムでは保証がはるかに重要であることがわかりますが、テストは他のすべての妨げになります。
LearnCocos2D 2013年

どちらの研究も、比較可能なプロセスモデルをテスト方法論の変更のみと比較していません。つまり、UTで使用された時間を実際に費やすことになります。システムテスト。現状では、「よりスマートにテストすれば、その助けになる」という研究もあるかもしれません。
Rune FS

1
では、リリース後のバグを修正するコストが開発全体の0.01%の場合はどうでしょうか。その場合、TDDは恐ろしい投資になるでしょう。バグが少ない場合はどうでしょうか?これらの%sはコンテキストがないと何も意味しません。公平を期すために、私はまだ研究全体を読んでいません。しかし、現状ではあなたの投稿は役に立ちます(良いリンク)が、ROIに関する質問には答えません。IMO。
Instine 2014年

1
@Instine幸運にも(?)これが事実ではないという良い証拠があります。リリース後のバグの修正は、開発の初期段階で発見されたバグ(TDDが行うこと)よりも指数関数的に費用がかかります。そのような状況では、リリース後のすべてのバグの開発全体の0.01%のコストは考えられません。(詳細については、Code Complete、特にBoehm &al。、「Understanding and Controlling Software Costs」、IEEE Trans Softw Eng(1988)を参照)。
Konrad Rudolph

最初の調査のサンプルサイズは24人のプログラマ(ペアで作業しているため、12チーム)であることに注意してください。統計的に有効なサンプルサイズがどうなるかはわかりませんが、サンプルサイズは低いようです。おそらく他の誰かが知っていますか?
Zachary Yates

29

「他のプログラマー、さらに重要なことには、管理のBean-Counterに、テストフレームワークの学習、テストの作成、更新の維持などに費やされるすべての追加の時間は、それ自体で採算が取れるということを改めて伝えなければなりません。 」

どうして?

なぜそれを静かにそして個別に行わないのですか?一度にすべてを行う必要はありません。あなたは小さな小さな部分でこれを行うことができます。

フレームワークの学習にはほとんど時間がかかりません。

1つのテストを1つだけ書くのに必要な時間はほとんどありません。

単体テストがなければ、ソフトウェアに対するある程度の自信があります。単体テストが1つあれば、自信はありますが、少なくとも1つのテストに合格したことを証明できます。

それだけです。あなたがそれをしていることを誰も知る必要はありません。早くやれよ。


9
Beanカウンターは、その寿命がユニットテストに依存している場合、残りのコードからユニットテストを判別できませんでした。ただやるという提案を支持します。ただし、注意点が1つあります。1人ではない場合は、他の開発者がこの方法を採用する必要があります。そうでない場合は、意図せずにテストが中断されます。
Thomas Eyde 08年

ちょうどそれをし、それらに言わないで、そしてコーヒーブレイクであなたの大学にその考えを売りなさい;-)
ヨハン

3
常に期限を守らないと解雇されるから?
Andrew

3
@猫:ユニットテストは「オーバーヘッドのビット」を追加しません。それらは、ばかげた過ちの全体的な洪水を防ぐことにより、全体的な作業負荷を減らします。仕事は成長しません。それは単に悪いコードから良いユニットテストと良いコードへと本質的にシフトするだけです。
S.Lott、2012年

1
Beanカウンターは、エンジニアがドメインの問題に対して適切なソリューションを提供することを望んでいます。ソリューションの一部としてテストを書くだけです。彼らも気づかないでしょう。彼らがあなたに尋ねた場合、それが堅牢であり、やり直しを必要としないことを確認するために、より多くの時間を費やしていることを彼らに伝えることができます。あなたが彼らにユニットテストを書くことを勧めるなら、あなたは彼らが何も知らない何かについて彼らの承認を求めています。
ヨークシャーマン

16

私はこれに別のアプローチをとります:

コードが正しいことをどのように保証していますか?それとも、チームの誰かがfunc1()を変更しても、仮定Xを破らないことですか?ユニットテストがあなたを「正直」に保つことがなければ、あなたが多くの保証を持っているとは思えません。

テストを更新し続けるという概念は興味深いものです。多くの場合、テスト自体を変更する必要はありません。私は、生産のコードに比べて3倍のテストコードを持っている、とテストコードが変更された非常に小さな。しかし、それは私が夜によく眠れるようにするものであり、システムを壊すことなくY機能を実装できると確信していることを顧客に伝えることができるものです。

おそらく学界には証拠があるかもしれませんが、私は商業的な世界で誰かがそのようなテストにお金を払う場所で働いたことはありません。しかし、それは私にとってはうまく機能し、テストフレームワークに慣れるのに少しの時間を要し、テストを作成することで、要件や設計について本当に考えるようになりました。テストを書いていない。

ここで、それ自体が利益をもたらします。1)コードに自信があり、2)他の方法よりも早く問題を見つけます。あなたは、QAは男ねえ、あなたは、XYZ()関数を境界がチェックあなたは?でした気にしませんでした」と言っていない 彼がいるのでそのバグを見つけるために取得していないあなたは、それはヶ月前に発見しました。それはのために良いです彼は、あなたにとっても、会社にとっても、顧客にとっても良い。

明らかにこれは逸話ですが、私には不思議に働いています。スプレッドシートを提供できるかどうかわかりませんが、私の顧客は満足しており、それが最終目標です。


私のQA担当者はかなり鋭敏でしたが、コードを見ていませんでしたが、境界がチェックされていないことが簡単にわかりました。
itsmatt 2008年

ユニットテストについて完全に合意し、
無作為に

7
顧客はテストを書くために私たちにお金を払わない。繰り返しになりますが、彼らもコードを書くために私たちにお金を払っていません。彼らは私たちに彼らの問題を解決するためにお金を支払います、そして、直面したとき、私は彼らが問題が解決され続けることも望んでいるに違いありません。証拠があれば、信じられないほどの顧客は投資を確保したくないと考えています。
トーマス・アイド2008年

10

私たちは、単体テストなしで安っぽいソフトウェアを書くことが可能であることを確固たる証拠で示しました。単体テストを使った安っぽいソフトウェアの証拠さえあると思います。しかし、これは重要ではありません。

単体テストまたはテスト駆動開発(TDD)は、設計手法であり、テスト手法ではありません。テスト駆動で記述されたコードは、そうでないコードとは完全に異なって見えます。

これはあなたの質問ではありませんが、間違って尋ねられる可能性がある質問を答えて(そして他のレポートで挑戦されるかもしれない証拠をもたらす)、それが本当に簡単な方法かどうか疑問に思います。あなたがあなたのケースのための確固たる証拠を見つけたとしても-他の誰かが反対の根拠を見つけるかもしれません。

技術担当者がどのように作業すべきかを決定するのは、豆カウンターの仕事ですか?彼らはあなたがより高価なものを必要としないと信じているので、彼らはすべての場合で最も安いツールを提供していますか?

この議論は、信頼(アジャイルチームの基本的な価値の1つ)に基づいて勝ち取るか、または勝者の役割の力に基づいて負けます。TDD支持者がロールパワーに基づいて勝利したとしても、私はそれを失われたと見なします。


13
聞いて、聞いて:) TDDの多くの確固たる証拠は、すでにそれなしで良い結果を得ている非常に経験豊富なチームからも得られます。TDDは、薄い空気からそれらを作成するのではなく、単に結果を改善しました。本当のROIは、まともなコーダーを雇い、彼らに物事のやり方を決定させることです。
workmad3 2008年

「技術者がどのように働くべきかを決定するのは、豆売りの仕事ですか?」->すべてのビジネス上の決定はお金に帰着し​​ます。それでも良い答えは、+ 1
jcollum 2009

@jcollumしかし、あなたの仕事のやり方はお金とは何の関係もありません。ドームに責任を持たせたい場合は、彼らがどのように彼らが求めていることを行うかを決定させます
Rune FS

TDDは設計手法ではなく、単なるコーディング手法です。blog.ploeh.dk/2010/12/22/TheTDDApostate多くのコメンターは、TDDにリファクタリング(設計手法)が含まれていることに反対していますが、リファクタリングはTDDを意味するものではありません。テストなしでリファクタリングすることができます。大規模で複雑なリファクタリングはとにかくユニットテストに影響します。つまり、テストもリファクタリングする必要があるため、無効/偽のグリーンになることもあります。単純なリファクタリングはテストに影響を与えませんが、エラーのリスクは低くなります-リファクタリングは単純だからです。
KolA

@KolAよく、この回答から10.5年後のことを反映して、今日はもう少し防御的な言葉を使うかもしれませんが、それでも、TDDが唯一必要となる設計手法であるとは主張せず、Markはそれを公開しますそれがまったく1つではないと結論する前に、優れた設計手法。私は彼の意見を弱め、それが唯一の設計手法であってはならないと言います。私が TDD 作成したすべてのコードは、これまでに作成したコードとは異なって見えます。それはデザインの結果だと思います。私は、TDDに加えて、ホワイトボード、ディスカッション、その他のツールを使用して作業するのが最善です。しかしリンクへの感謝
オラフコック


6

厳密な単体テストよりもTDDについての詳細は、テスト駆動開発による品質改善実現へのリンクです。ナガパン、E。マイケルマクシミリアン、ティルマレッシュバト、ローリーウィリアムスによる4つの産業チームのペーパーの結果と経験です。Microsoft Empirical Software Engineering and Measurement(ESM)グループによって発行され、すでにここで言及されている論文。

チームが発見したのは、TDDチームが非TDDチームよりも(欠陥密度の観点から)60%から90%パーセント優れたコードを生成したことです。ただし、 TDDチームはプロジェクトを完了するのに15%から35%長くかかりました。


5

これは、彼の会社を内部から変えている男の素晴らしい読み物です。TDDに限定されません。http://jamesshore.com/Change-Diary/彼は「豆のカウンター」をかなり長い間説得せず、代わりに「ゲリラ戦術」を行ったことに注意してください。


リンクは興味深く見えます...再確認する価値があります:組織の作業プロセスの変更...
厄介なペースト

5

これらの回答にさらに情報を追加するために、学術的および業界の背景に対する生産性と品質の影響を把握するのに役立つ2つのメタ分析リソースがあります。

ゲストエディターの紹介:TDD—Art of Fearless Programming [ link ]

すべての研究者は、TDDがより良いタスクフォーカスとテストカバレッジを促進することに同意しているようです。テストの数が増えるだけでソフトウェアの品質が向上するわけではありませんが、テスト設計に対するプログラマーの注目が高まっていることは励みになります。テストを潜在的な行動の非常に大きな集団のサンプリングと見なす場合、より多くのテストはより完全なサンプルを意味します。各テストが他の誰も見つけることができない重要な問題を見つけることができる範囲で、テストは特に安価に実行できる場合に役立ちます。

表1.テスト駆動開発の選択された実証的研究の要約:業界の参加者*

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

表2. TDDの選択された実証的研究の要約:学術的参加者*

ここに画像の説明を入力してください

テスト駆動開発が外部の品質と生産性に及ぼす影響:メタ分析[ リンク ]

概要:

このペーパーでは、外部コードの品質と生産性に対するテスト駆動開発(TDD)の影響を調査する27件の研究の体系的なメタ分析を提供します。

結果は、一般に、TDDが品質に与える影響はわずかですが、生産性にはほとんどまたはまったく影響がないことを示しています。ただし、サブグループ分析では、質の向上と生産性の低下の両方が、学術研究と比較して産業研究ではるかに大きいことがわかりました。TDDとコントロールグループのプロセスの間のテスト作業の違いが大きい研究では、生産性の大幅な低下が見られました。テストの努力の差が大きい場合、質の大幅な改善が学術研究でも見つかりました。しかし、データが不足しているため、産業研究に関して結論を​​出すことはできませんでした。

最後に、モデレーター変数としての開発者の経験とタスクサイズの影響が調査され、統計的に有意な正の相関がタスクサイズと品質改善の大きさの間に見られました。


4

さて、ユニットテストを使用するように要求する大企業がいくつかありますが、小規模な企業である場合、なぜ大企業を模倣するのでしょうか。

私にとって、何年も前に単体テストを開始したとき(今日は主に動作モデルを使用しています)、1つのアプリケーションですべてのパスを制御できなかったためです。

私は最初のプログラミングとREPLに慣れていたので、ユニットテスト(すべての関数に対して1つのテスト)を取得したときは、REPLをコンパイルする言語にREPLを取り戻すようなものでした。私が書いたすべてのコード行に楽しさをもたらしました。私は神を感じました。私はそれが好き。より優れたコードをより速く書き始めたことを伝えるレポートは必要ありませんでした。私の上司は気が付くような報告をする必要はありませんでした。なぜならば、クレイジーなことをしているとき、私たちは突然締め切りを逃したことがなかったからです。私の上司は、非生産的なコードを書くという非常に奇妙なことのために、「明白な」バグの数が(多くの)からほぼゼロに減少したことに気づくためにレポートを必要としませんでした。

別のポスターがすでに書いているように、TDDを使用してテスト(検証)することはありません。仕様(ユニット、オブジェクト、モジュール、関数、クラス、サーバー、クラスター)の動作の動作をキャプチャするために記述します。

多くの企業では、ソフトウェア開発の別のモデルへの切り替えに関する多くの失敗と成功事例があります。

私は何か新しいものを書くときはいつでもそれを使い始めました。私が英語に翻訳するのが少し難しい古いことわざがありますが、

気づかないほどシンプルなものから始めます。マラソンのトレーニングをするときは、まず9メートル歩いてから1メートル走って、繰り返します。


だから、私はそれをやるべきですか?それは動作することが保証されており、誰も私と一緒にそれをしなくても問題ありませんか?
レイヴン

実際、これはJoelテストです:joelonsoftware.com/articles/fog0000000043.html。ユニットテストに関するノーベル賞受賞研究の欠如よりも問題が多いのではないかと私には聞こえます
ジョンケ

4

ユニット/統合テストで見つかったバグを修正すると、実際のシステムでバグを修正した場合よりもコストが何倍も少ないことを証明する統計があります(実際のプロジェクトの監視に基づいています)。

編集:たとえば、指摘したように、本「コードコンプリート」はそのような研究について報告しています(パラグラフ20.3、「品質技術の相対的有効性」)。しかし、それを証明するコンサルティングの分野でも私的研究があります。


1
これは、Steve McConnellのCode Completeでカバーされています。これは、他の理由で本棚に置いておきたい本です。
ロバートロスニー2008年

これはテスト方法とは関係ありませんが、プロセスのどの時点でバグが報告されているか、さらには開発時にバグを見つけるときに修正するコストが1000倍も高価であると報告されているため、仕様でバグを見つけるのに費やす時間を増やすとよいでしょう(a開発フェーズあたり10の係数)
Rune FS

OTOH、実際の状況で人々が実際に遭遇する問題だけを修正する場合、おそらくはるかに少ないバグを修正する必要があります。仕様でバグを検出することは、実装で同じバグを検出するよりもはるかに多くの労力を必要とする可能性があり、バグを検出することはバグ修正のコストの一部であるため、バグを早期に修正する方が本当に安くなることもわかりません。これは自明のように聞こえるので誰もが信じているこれらの事柄の1つですが、効果を示す健全な研究を見たことがありません。
LKM

0

私にはこれのためのデータセットが1セットあります-単体テストで私を売った経験から。

何ヶ月も前に、私は大規模なVB6プロジェクトに取り組んでいる新卒で、大量のストアドプロシージャコードを記述する機会がありました。私が書いていたサブシステムのうち、コードベース全体の約1/4を占めていました(50Kあたり約13,000 LOC)。

ストアドプロシージャの単体テストのセットを作成しましたが、Rational Robotのようなツールがないと、VB6 UIコードの単体テストは実際には実行できません。少なくとも当時はそうではありませんでした。

ピースに関するQAの統計では、サブシステム全体で約40または50の欠陥が発生し、そのうち2つはストアドプロシージャに起因するものでした。これは、6,500行のコードごとに1つであるのに対し、全体では1,000〜1,200 行ごとに1つ程度の欠陥です。また、VB6コードの約2/3がエラー処理とログ記録の定型コードであり、すべての手順で同じであることも覚えておいてください。

手振りが多すぎなければ、不良率の大幅な改善は単体テストに帰することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.