単体テストが非常に優れている場合、なぜそれを行う企業が増えないのですか?[閉まっている]


103

私が最初に働いた実際のソフトウェア会社はすべてユニットテスト(NUnit)に関するものでした。当時、私たちが本当の意味でのステッカーだったのかはわかりません。コードカバレッジがどのようなものであるかわからないので、ほとんどの単体テストを作成していました。それ以来、私は多くのテストを行ういくつかの企業に出くわしましたが、それは椅子のテストです。そこにいる人に依存しているため、再現性が低く、バグをキャッチする可能性が低くなっています。もう1つの態度は、「将来的に」彼らがやりたかったことでした。基本的にお金が空から落ちるとき。

ユニットテストに失敗しました。これにより、作業が楽になります。しかし、私は新しい仕事を探すときに、ユニットテストは企業が将来的に「やり遂げたい」ものか、まったく行わないものであることに気づきました(ええと、それはしばらくの間存在しています今!)過去2年間に私が見た求人の60〜75%には、単体テストがまったく記載されていないと思います。私は、単体テストの経験が1つまたは2つあることだけを要件として考えることができます(中間レベルの開発者のポジションの場合)。

だから問題は、何が欠けているのですか?それは人々の生産性を向上させると思いますが、それは実際にそれを行うために確かな時間を費やした後にのみです。単体テストのコスト削減についての良い研究はありませんか?私が見ている種類の会社ですか?

編集:タイトルは少し悪魔の支持者ですが、私は自分自身を単体テストの支持者と考えています。


どんなドメインで働いていますか?私は常に、どこで作業しても、さまざまな完全性の単体テストに遭遇しました。しかし、私の経験は医療および産業用画像処理にあるので、それが理由かもしれません...
ケナ

ええ、私はあなたが正しいと思う。私のドメインは通常、基幹業務アプリです。バランスのとれた人生はありません。しかし、時には残高の一部が請求され、それが高額になる可能性があります。
jcollum 2009

11
椅子のテスト:人が椅子に座ってアプリケーションを運転し、バグを報告します。
jcollum

3
@Darknightは、彼の正直さに50kの賛成票を持つ必要があります。古い頭を召し上がれ、今日の時間にヒップになります。それが属している90年代に、ユニットテストのがらくたを元に戻します。時間の最大の無駄。それはあなたが重要に見えるように育てるためのものにすぎませんが、ほとんどの場合、まったく何もしません。最近はIDEと呼ばれるものがあり、コンソールやメモ帳でプログラミングすることはもうありません。テキストにカーソルを合わせて値を確認できるため、コードが正しいことがわかります。他のすべての古いタイマーを使用して、過去の単体テストを続けます。
ポートフォリオ

1
@portfoliobuilderええ、IDE内の値の上にマウスを置くと、コードの品質が向上します。なぜなら、状態は常に同じであり、コードは決して変化しないからです。右に!そして成功を祈る。
Franz D.

回答:


112

私の経験では、これにはいくつかの要因が関係しています。

  1. 経営陣は、ユニットテストが実際に何であるか、なぜユニットテストに真の本質的な価値があるのか​​を理解していません。
  2. 経営陣は製品の迅速な納品に関心を寄せる傾向があり、ユニットテストはその目標に対して逆効果であると(誤って)考えています。
  3. テストはQAのみに属しているという誤解があります。開発者はコーダーであり、テストを書くことはできません。
  4. ツールが無料で利用できるという事実にもかかわらず、管理者がユニットテストを正しく行うためにお金を費やす必要があるという一般的な誤解があります。(もちろん、開発者は検討する時間を増やしますが、それは実際には法外なものではありません。)
  5. ウィルの答えはこの答えを丸めるでしょう:テストコードの価値を決定することは非常に難しいです(jcollumを編集してください)

当然、他の要因もありますが、それらは私がこれまでに遭遇したものにすぎません。


ええ、私の管理についてはほとんど説明しましたが、テストはありません。
Ty。

そして、いくつかの一般的な言語(C / C ++)でのサポートは不十分です。
Martin Beckett、

@mgb-CxxUnitは私にとってはうまく機能します...
Dominic Rodger

2
CxxTestも非常に優れています。C ++のリフレクションメカニズムが不十分なため、さまざまな「ソリューション」が提示されているようです。CxxTestはビルドシステムで前処理ステップを必要としますが、TUTのようなツールは完全にコンパイル時および言語サポートされていますが、使用するのは面倒です。
トム

2
私は、stackoverflow.comのユーザーが、このような多くの問題の管理を非難する傾向があることを発見しました。現実の友人に彼らの「管理の問題」について尋ねたところ、通常、管理に対する懸念を表明したことがなく、人々の視点を変えるためのキャンペーンにあまり参加していないことがわかりました。「経営はそうではない...」と言う代わりに、経営者が私の見解を理解するのに役立つ方法を考え、自分の立場が正しいことを彼らに納得させます。開発者は単体テストの販売が得意ではないので、これは問題だと思います。
Brian Stinar

87

1)難しい
2)時間がかかる
3)テストコードの値を決定するのが非常に難しい

ポイント3は付箋です。優れた単体テストはバグを減らします。しかし、良い製品コードもそうです。単体テストのために存在しないバグの数をどのように判断しますか?存在しないものは測定できません。調査を指摘することはできますが、それらはビジネスマネージャーのスプレッドシートにうまく適合しません。


11
「優れた単体テストはバグを減らしますが、優れた製品コードもそうします。」-優れた単体テストにより、量産コードの改善が可能になります。コードが最初は悪いが、テスト範囲が十分であっても、コードが良好になるまでシステムを自信を持ってリファクタリングできます。
Esko Luontola、2009

1
Eskoは、カバレッジが優れているだけでなく、実際に何かをテストする優れたテストも必要です。100%のコードカバレッジがあり、実際にはほとんどテストを行わない可能性があります
Jacob Adams

正解です。あなたは私の答えと同じことをはるかに少ない言葉で言ってきました。
ウェッジ

2
はい、単体テストには時間がかかります。しかし、「ランダムなバグ修正」もそうです。適切なテスト駆動開発には、テストに「文書化」された「すべての」機能があります。テストが緑色の場合、製品は意図したとおりに機能します(使用性の問題などを除く)。私の経験では、総開発時間はほとんど影響を受けません。バグ修正に時間を費やした後ではなく、物事により多くの時間を費やして、最初から適切なものにする。
Arve Systad 2010年

そして、かなりの数の研究は、ユニットテストが負の値を持っていることを示しています。したがって、調査を表示することは非常に決定的ではなく、そのため、問題のショップの値が正である可能性が高くなるまで、ある程度の管理抵抗が生じるはずです
Rune FS

70

「管理」についてすべての責任を負うのは簡単です。しかし、経営陣は本当にユニットテストを特に行わないようにあなたに言っているのですか?

管理は、それがモジュール化であるか、抽象データ型であるか、デザインパターンであるか、ユニットテストであるかに関係なく、一般に、どのように仕事をするかを教えてくれません(おそらくすべきではありません)。これらは優れた有能なソフトウェアエンジニアが適用する貿易ツールですが、下手なエンジニアは適用しません。

私はあなたの質問に対する本当の答えは次のとおりだと思います:ユニットテストは本当に難しく、コンピューターサイエンスの学生はそのためのトレーニングを受けていません。

独自の文字列クラスを作成するのは簡単です。実際の製品をテストしているときに、パワーポイントのスライドで誰も言わなかった課題に遭遇します。

  • ユーザーとの対話。アプリケーションの半分はユーザーインターフェイスロジックです。ボタンを動かしても故障しない、自動化された方法でそれをどのようにテストしますか?
  • 外部APIおよびフレームワークとの相互作用。Windowsカーネルドライバーを作成している場合、それをどのように単体テストしますか?使用するすべてのIRPおよびカーネル関数のスタブを記述して、OSカーネルのシミュレーションを効果的に作成していますか?
  • ネットワーク通信は21世紀のものです。複数の分散コンポーネントで構成される単体テストをどのように調整しますか?
  • どのようにして良いテストケースを選びますか?私は一般に、「1000回のループでランダムなことを行い、それが壊れるかどうかを確認する」アプローチを試みている人をよく見ます。これを行うと、労力がリターンより高くなり、重要なバグが見落とされ、単体テストが中止されます。
  • パフォーマンス要件が満たされていることをどのようにテストしますか?
  • テストのパターンに関する知識は乏しいです。スタブ、定型応答、回帰テストは、ほとんどの人が知らない概念です。職場で実際にユニットテストに関する本を読んでいる人は何人いますか。

管理のせいにできる1つのことは、要件仕様に成果物の品質レベルに関する要件がほとんど含まれていないことです。

次に上司から時間の見積もりを求められたら、ユニットテストを作成する時間を含めて、何が起こるかを確認します。


2
良いアイデア。ただし、ユニットテストを作成する時間を「製品」コードを作成する時間とは別に呼び出さないでください。
ジェフコチュラ

3
この答えを読んで、ユニットテストの概念と基本に精通している一方で、それを効果的に実行する方法がまったくわかりません。この件について良い本を勧められますか?
ブルトン語

1
私が取り組んだ1つのカーネルドライバーで、ユーザーモードのテストハーネスにリンクしたライブラリに一連のコードをリファクタリングしました。この特定のコードは環境に依存しないため、十分に簡単でした。私は試していませんが、ファイルシステムやデータベースのようなIRPはモック可能でなければなりません。
ジョージV.ライリー、

1
BochsまたはQEMUを使用すると、カーネルドライバーが対話するためのデバイスのシミュレーションを作成できます。
Zan Lynx

2
@floding、魅力的な答え。ユニットテストの本を読みに行かなければならないと思います。
Dan Rosenstark、2010年

28

ほとんどのテストは何もテストしません。
fileopen()関数と、ファイルが存在しない場合は失敗し、ファイルが存在する場合は成功する単体テストを記述します。すごい!次に、BIG5中国語のファイル名で機能するかどうかを確認しましたか?NFS共有で?USBキー上のファイルとUACがオンになっているビスタで?

問題は、ユニットテストが、関数を作成した同じプログラマーによって、同じ一連の仮定と同じレベルのスキルで書かれていることです。実際に機能させるには、テストを他の誰かが作成し、公開された仕様に対してのみ、コードを表示しないようにする必要があります。-ほとんどの企業では、仕様書を入手するだけで画期的なことになります。

単体テストは、個々の関数のコードのエラーをチェックします。入力/出力がよく知られていて、内部構造が複雑であるデータアクセスレイヤー、数学ライブラリなどで機能しますが、多くの場合、それらは時間の無駄です。
エラーの原因がコードのさまざまな部分間の相互作用や、OSとユーザーとの相互作用である場合、エラーになります。高/低DPI設定がダイアログボックスをめちゃくちゃにする、または「。」を入れ替える外国語設定などの問題 と「、」は通常見つかりません。


15
この答えは少し見当違いです。単体テストと機能テストは同じものではなく、同じであってはなりません。
ウェッジ

4
欠けている要素は、単体テストが1回で済むことではないということです。後でNFS共有のfileopen()のバグを修正する必要があることがわかった場合は、テストスイートにテストを追加できます。そして、今後さらに開発を行うときに、回帰テストを実施しています。
ポールオズボーン、

2
多くのエラーは、プログラマーが考えていなかったコードの外部の相互作用から生じ、単純にコードをチェックするだけでは見つけることができません。よくあるGUIの問題は、DPI設定が非常に高い/低いマシンです-ダイアログ機能を好きなだけ単体テストできますが、これを見つけることはできません。
マーティン・ベケット

5
それは単体テストの機能ではありませんが、コードのさまざまな部分間の相互作用は非常に単体テスト可能であり、実際、それらの部分が別々のチームによって記述されている場合、共有インターフェースに対してコードを単体テストし、他のチームのコンポーネントをモックします良い習慣。
Steven Evers

1
TDDは、コードを記述する前にテストを記述させることにより、「コードを記述したプログラマーがテストを記述する」という不正なテスト問題を処理します。
Ophidian、


15

単体テストに興味のない開発者をたくさん見つけました。始めたとき、それは常に多くの仕事のようで、ほとんど見返りがありません。誰も余分な仕事にサインアップしたくないので、彼らは抵抗します。いったん人々が始めると、彼らはたいてい熱心にそれに固執しますが、彼らを始めるのは難しい場合があります。


12

単体テストの採用の問題は別として、単体テストは常に適切であるとは限りませんが、一般に価値があるとは限りません。ユニットテストについては、貧弱な構造に対して脆弱になるのを防ぐ特別なことは何もありません。

単体テストにはコスト(作成、保守、実行)があり、それらのコストよりも大きなメリットが得られる場合にのみ価値があります。テストの作成は他のスキルと同じで、成功するには特定の経験と知識が必要です。十分な経験がなければ、経験の浅い開発者でも、価値のない低品質、低価値、または高コストの単体テストを作成するのは非常に簡単です。特に、単体テストの価値を判断するのがいかに難しいかを考えると、そうです。

さらに、ユニットテストはコードの品質を向上させる1つの方法にすぎませんが、それだけが方法ではありません。状況やチームによっては、ソフトウェアの品質を向上させるための最も効果的な方法ではない場合があります。

単体テストに多大な労力を費やすことは、高品質のソフトウェアを保証するものではないことに注意してください。また、ユニットテストをまったく行わなくても、最高品質のソフトウェアを作成できます。


あなたが言っていることは、静的に型付けされた言語に当てはまります。動的に型付けされた言語では、それらは絶対に重要です。あなたのコードはテストなしでがらくたになることがほぼ保証されていることを意味します。これは、一部の人々が単体テストを非常に高く評価しているように見える理由の大部分であると私は思います。
ビルK

11

まあ、私の会社はTDDや単体テストを行っていません。正直なところ、その方法はわかりません。CapitalizeString()のような愚かな関数に対しては明らかにそれを行うことができますが、複雑なオブジェクトを含む非常に複雑なシステムに対してそれを行う方法はわかりません。さらに、インタビューを受けた人々のほとんどは、経験がないか、経験が限られています。ユニットテストはSOの群衆から見て大きなもののようですが、利用可能なワークプールでは特に大きなものではありません。

TDDは別のトピックです。私たちはTDDに道徳的に反対しています。私たちはカウボーイコーダーではありませんが、プロジェクトの創造性と柔軟性を妨げると信じています。さらに、単体テスト機能を作成したコーダーがいても意味がありません。何かをするときは、考えられるすべてのエッジケースにコードを記述します。私が必要としているのは、見逃したかもしれないものを探すための別の頭脳です。それはありません。チームは小さく、自己完結型です。

要するに、私たちはTDDを信じていませんが、単体テストをしたいと考えています。経験がなく、簡単に見つけることができません。


私が働いている場所に十分な数のコーダーがいた頃、私たちはペアプログラミングをしていました。他の人がコーディングしたようにテストを書くことは非常に効果的であることがわかりました。それは、コードに関する非常にインテリジェントな質問にもつながりました。
Zan Lynx

4
欠けているように見えるTDDのポイントは、すべてのエッジケースをユニットテストに書き込むことです。いずれの場合も、ユニットテストでアサーションを記述します。次に、実際のコードがアサーションに失敗した場合、コードにバグがあり、ロジックが正しく実装されていないことがわかります。ユニットは小さく、アサーションはユニット内の特定のコードをテストするため、論理エラーの場所を簡単に特定できます。重要なことは、最初にアサーションを記述することです。次に、コードを渡します。このプロセスがバグの成長以外の何を妨げるかを指摘できますか?
クリストファーパーカー

2
最初にテストを記述せずに単体テストを試すことは非常に困難です。これは、コードをさかのぼってテストハーネスに入れるのが難しいためです。これは、最初のテストの主な利点の1つです。テストは設計を推進するため、設計は最初からテスト可能です。
アラン・クリステンセン

3
単体テストの方法が「わからない」のにTDDが創造性と柔軟性を妨げると信じているとしたらどうでしょう。
jcorcoran 2014年

1
@Steve 6年後、ユニットテスト(またはTDD)を導入したことがあるかどうか、そしてそれを継続して行ったかどうかを知るのは素晴らしいことです。
ルーク・プレット、2015

11

ベストプラクティスに沿って実際に何もしない企業はたくさんあります。コードのレビューも、単体テストも、テスト計画も、何もない、ズボンの座席だけで。

これを機会に、継続的インテグレーションプラットフォームを使用してユニットテストを開発してもらいます。コードの品質と安定性を同時に向上させる力を印象付ける簡単な方法

編集:理由としては、CIとユニットテストを非常に簡単にする現在のツールを知らないだけだと思います。


私は通常、このような政策決定に影響を与えない立場にあります。私は委員長によって却下された上院議員です。
jcollum 2009

Hudsonの起動と単体テストの作成には数分かかります。ユニットテストが既に "TODO"リストに含まれている場合は、仕事をしているだけです。委員会はファンシーなチャートや画像に感銘を受けることが多いので、ハドソンからのかなりのトレンドグラフを見せてください;)
アレン・ライス

うん!真実を聞いてみましょう。私たちの開発者がベストプラクティスに打ち込むのに費やしているすべての時間にもかかわらず、それは常に現実の世界で使用されるとは限りません。本当に残念。
NeedHack

6

私は怠惰が悪いユニットテストの根本的な原因だとは思いません。私の会社では、時間の制約と「ただやり遂げる」態度が単体テストを行うための最大の抑止力です。また、システムが故障する場所は、「ユニットレベル」ではなく、統合レベル(サービス、データベースアクセス、テストに特定のデータを必要とする複雑なクエリ)である傾向があります。これらのことはテストするのが難しいだけであり、機能を完成させるのに十分な時間がなければ、有用なテストを同時に実行する時間はおそらくないでしょう。


これは一般的です。将来的に変更する可能性がある場合は、変更後に機能することを確認するためのテストが必要であると私は主張しています。
jcollum 2009

6

ユニットテストは、コンパイラと同様に、コード開発ワークフローの自然な部分にすぎません。

ただし、これには、ユニットテストの利点について管理者を教育する必要があります。ただし、ジュニア開発者はそのような影響を与える可能性は比較的低いです。したがって、企業がユニットテストの支持者であるかどうかは、ユニットテストの提唱者である上級開発者またはアーキテクトがいるかどうかに依存します。

これは、「何が欠けているのか、なぜユニットテストを行う企業が増えないのか」という質問への答えだと思います。:-)


1
「コード開発ワークフローの自然な部分であるべき」の+1。すべてのプロの開発者は、公式のプロセスに関係なく、独自のユニットテストを行う必要があります。この問題に関する唯一の正当な議論は、ユニットの定義です。
ダンク

1
@ダンク「ユニット」を定義しない場合は、「プロの開発者は独自のテストを行う必要がある」とだけ言うことになります。
ChrisW、2009

1
@ChrisW-はい、プロの開発者は独自のテストを行う必要があります。開発者がコードを提出しても、正しく機能することを確信できるほど十分にテストされていないという理由はありません。残念ながら、これは多くの開発者に尋ねるには多すぎるようです。
ダンク

1
ユニットの定義が正当な議論であると私が言うとき、私はユニットの粒度について話している。クラスですか?クラスの集まりですか?コンポーネントですか?私は(一部例外あり)クラスレベルのユニットテストは、それは...多くの無意味なテストに利益とリード以上の費用がかかると思います
ダンク

他の人がこのスレッドで指摘したこと。一方、1つの単位として機能するクラスのコレクションを定義した場合でも、自動テストを実行できます。テストは、より高いレベルの必要な機能に集中できるため、一般に、より意味のあるテストです。
ダンク

5

それはおそらくあなたがすでに言及したいくつかのことの組み合わせです。TDDのコスト削減を測定することは困難です。ITをアウトソーシングしたい場合は、スタッフのスタッフに年間支払う金額と、契約するコストを示すことができます。その非常に具体的です。「このテストでは、デバッグと修正に4時間かかったバグをキャッチしました...」


バグがデバッグして修正するのにどのくらい時間がかかると思いますか?一般に、デバッグは私の経験よりもランダムです-私は問題がどこにあるのか、私がそうでないのかを知っています。
ドミニクロジャー

1
ええ、だからこそ、テストのメリットを数値化するのは難しいと言いました。
Ovi Tisler、

5

いくつかの場所がそれを使用しない理由は、単に開始するためにも継続するためにも多くの作業を必要とするからです。単体テストの作成に実際の機能を作成するのと同じくらいの時間がかかるという事実は、開発者の生産性を半分に削減しているような一部のマネージャーにとっては思えます。

その上で、インフラストラクチャを配置して維持する必要があるチーム(または誰か)を構築します。

そして、アランが言うように、多くの場所は単にベストプラクティスを使用していない-彼らは単に具体的な何かを見たいと思っている。


5

私が見たところから、多くの企業が、実際には単体テストができない巨大で高度に結合されたコードベースを持っています。また、テスト可能な要件が適切ではないため、単体テストでは、「構築されたまま」の事実上の要件に対してテストを実行します。


5

プログラマーはただそれを始めなければならないと思います。最初にいくつかの簡単なテストを行うと、開発の一環として簡単に正当化できます。

高速なデバッグを実現するには、ユニットテストのようなものがほとんど常に必要です。正しい入力の配置、デバッガーのブレークポイントの設定、アプリケーションの起動などよりも、テストの起動がどれだけ速いかを説明してください。

コードにテストを文書化します。テストの場所と実行方法を説明するコメントを入力してください。将来のプログラマーはそれを見て、うまくいけばテストが広がるでしょう!


4

ユニットテストは、ほとんどの人が聞いたブラックボックス用語の1つですが、ユニットテストを正確に構成するもの、開始する場所、それらの記述方法、実際にテストを実行する方法、正確にテストする必要があるものなどがわかりません。等々

多くの場合、不確かな開発者にとっては、「エンタープライズレベルの開発者」だけが必要とするアイシングを不必要またはアイシングとして単に却下する方が簡単です。


4

私はユニットテストの大ファンであり、さまざまなクライアントタイプの契約開発プロジェクトを行う会社のパートナーでもあります。1か月以内に、サイズの異なる3〜4種類のプロジェクトに触れます。

プロジェクトが1回限りのように思える場合、単体テストはビジネスに利益をもたらさないため、単体テストに多額の投資をするつもりはありません。これらのタイプのプロジェクトでは、私が不確か/なじみのないもの、または頻繁に変更される可能性があるもの(制御できないデータソースのパーサーなど)を単体テストします。

一方、私が構築するのは、寿命が長くなることがわかっている、より大きな作品である、複数回の反復作業を行う、またはエラーが発生した場合にクライアントに大きな影響を与える、私はより多くのユニットテストに投資するつもりです。繰り返しになりますが、テストの優先順位は、不確実/なじみのない/変更するコードを中心に展開します。

ユニットテストは、タスクの複雑さ、および成果が出るかどうかを中心に展開すべきだと思います。慣れない追加のコードを書く意味はありません。


3

私の経験では、それはあなたが書いているソフトウェアに本当に依存しています。UIの単体テストを書くのは非常に難しいことに気づきました。私は、システムの特定の入出力がある部分に対してのみユニットテストを使用します。


同意する。モデル/ビュー/コントローラーを使用する場合、モデルとコントローラーを単体テストすることは非常に理にかなっています。ほとんどの場合、UIは人間がテストするのが最善です。
Zan Lynxは、

3

ユニットテストに失敗しました。これにより、作業が楽になります。

これは、企業が単体テストを採用する十分な理由ではありません

十分な理由は、「安価」(および/または「より良い」)かもしれません。これは、単体テストについて証明するのが簡単ではありません。

唯一の正当な理由は、「ユニットテストを書くことが開発者の時間を最大限に活用すること」である可能性があり、IMOを証明するのは非常に困難です。また、一部のソフトウェアや一部の開発者にとってはそうであり、他の場所ではそうではない場合もあります。

ユニットテストの世界を考えていない開発者がたくさんあります(たとえば、自動化された統合/機能テスト)をテストの他の形態は、より安く、より多くの価値があると思う人も含めて、例えばアム私は「doesnの唯一devが単体テストは好きですか?


3

もちろん、理想的な世界では、単体テストがあると主張することはできません。

ただし、単体テストを作成するかどうかは、さまざまな要因によって異なります。

  • ソフトウェアの使用方法。自分だけのソフトウェアを作成している場合、単体テストを作成しますか?おそらく違います。市販されているパッケージ化されたソフトウェアを作成している場合は、おそらくそうです。

  • コードを管理している人の数....それがあなただけの場合、変更を加えた後、コードをすばやく実行するだけで問題が発生しないことを確認するのに十分であると確信できます。もともとコードを記述していなかった他の人がコードを保守する必要がある場合、ユニットテストは、大きなコード(明らかにユニットテストでキャプチャされなかった!)を修正するためにコードを更新するときに、何も壊していないことを確信させるのに役立ちます。 。

  • コードの複雑さ:テストが必要なテストコードのみ。1行の変数割り当てメソッドはテストを必要としません。実行の複数のパスを持つ50行のメソッドはおそらくそうです。

  • 実用的な商業上の考慮事項:実際には、単体テストの記述には、そうしない場合よりも時間がかかります。プロトタイプソフトウェアを作成していて、商業的に将来が不確かな場合、十分に機能するコードをすぐに実行することと、2週間で単体テストされたコードを機能させることで、より効果的に機能することの間に、見返りがあります。ソフトウェアのような短い棚があり、次のプロジェクトに進むかどうかをすばやく(消費者の欲求を)確認することは、時には価値があります。

そして、他の人が指摘したように、テストはそれを書いた人と同じくらい良いです。


3

主な理由は、多くの開発者や開発マネージャーは、単体テストが存在するかどうか、またはそれらの使用方法を知る手がかりがないためです。

2番目の理由は、単体テストは、ある程度の品質基準をすでに満たしているコードでのみ(賢明な方法で)使用できることです。おそらく、いくつかの既存のコードベースはそのカテゴリーに分類されないでしょう。

3番目の理由は、怠惰および/または安さです。


3

単体テストは、テスト可能なコードを記述した場合にのみ役立つためです。そして、テスト可能なコードを書くのは難しいです。そして人々は怠惰でそして/または安いです。

編集:微妙な「怠惰」を「遅延および/または安価」として; まれなケースですが、実際にはスキルと能力を備えており、テストを作成することもありますが、収益をより直接的に左右する別の方法があります。


人々が「怠惰」だとは思わない限り、私はこれに賛成票を投じます。「プログラミング」、つまり「人気のプログラミング言語と関連ツール、ドキュメント、トレーニング、ワークフローなど」は、テスト可能なコードを簡単に記述できるように設計されていません。したがって、テスト可能なコードを作成するには、常にさらに1マイル進む必要があります。その時点までに「すでに機能しているので」報酬はありません(最初にテストを記述し、後でコードを記述し、TDDが実用的になるようにするため)。これは、現在のプログラマーをだますだけでなく、コーダーが現在構築している「プログラミング」ツールの作者をだましている認知バイアスのより多くであると考えてください。
n611x007 2014

1
はい、確かに、時々人々は安っぽい/壊れた/より良いことをする(または私たちがそれを丁寧に「トレードオフにする」と言います)。(私は冗談でそれを追加しようとしていました、その上、ほとんどのコードは役に立たないので、それをテストすることも役に立たないです;しかし、それは単なる睡眠不足の欠如です;))
phtrivier

2

問題の一部は、開発者がビジネスの人々に同じ値のセットを持ち、「単体テストをすべきかどうか」に対する答えを本当に気にすることを期待していることだと思います。アセンブリ言語ではなく高級言語を使用することをビジネスから事前に承認することはありません。これは通常、作業を完了するための賢明な方法です。

ポイントは、ある私たちは(私たちのすべてがトピックに関する同じ知識を持っていると言っているわけではない)呼び出しを行う資格だけです。さらに、ポリシーの問題として、チームがユニットテスト(またはその日の名前付け)を行わない場合でも、通常、それが不可能であるは限りません。

真実は、細かい細かさで行うほとんどのことのROIを実際に証明することはできないということです。なぜユニットテストがこの不合理で非典型的な証明基準に準拠しているのかは、私には理解できません...


ただし、共同開発者を参加させる必要があり、それを実現するための最善の方法は、トップダウンで要件とすることです。
ジョン


2

私の2セント:

  • ある程度の教育と訓練が必要ですが、新卒者にはすでに適切な知識が備わっています。
  • テストのオーバーヘッドは、より優れたツールで削減でき、これも発生しています(リファクタリングなど)。

ですから、それは時間の問題です。

ボブ・マーティンが次のように主張するマーティン・コプリエン論争があります:

「現在、開発者がユニットテストで実行していないコード行を出荷することは無責任です。」

[ http://www.infoq.com/interviews/coplien-martin-tdd]


2
私は、コードのすべての1行が単体テストでカバーされた、複雑で現実的なシステムの存在を信じていません。
quant_dev 2009

2

テストで全員を売りたい場合は、次のようにします。

  1. たくさんのテストを書いてください。
  2. コードを変更してテストに失敗した他の開発者に通知します。
  3. 彼らはコードを修正します。
  4. これで、これらの特定のバグなしでリリースできます。

マネージャーでさえこれを理解することができました。


単体テストによってリリースにバグがなくなることはありません。バグの数は減るかもしれませんが、テストのために製品にヒットしなかったバグの数を測定することは非常に困難です。
トム

管理者が誰かが新しい関数をコーディングできるときに一連のテストを書いて喜んでいることは知りません。それらがTDDに対応していない場合、作成していないコードをカバーするテストを作成する際に問題が発生する可能性があります。
jcollum 2009

@jcollumいつものように、それはコスト/利益率に依存します。
quant_dev 2009

2

企業はユニットテストを実行していません。これは、多くのWebサイトが不適切に記述されているのと同じ理由で、無知であり、人々は古い習慣に固執しています。私の会社では、ユニットテスト(NunitTypemockを使用)を開始したため、コードカバレッジが高くなり、製品化までの時間を短縮できます。


2

ほとんどの優れたアイデアと同様に、採用もアイデアの質よりも組織のパスへの依存に関係しています。

製品を出荷したほとんどの企業では、上級レベルのQAヘッドを擁する実質的なQA部門が作成されています。テストはQAチームの責任です。

同社は通常、QAチームにヘビーデューティコーダーを配置しないため、ユニットテストコードを記述する可能性は低いです。

プログラミングチームは、QAチームとの競合を引き起こすため、テストコードの記述に消極的です。

QAが別の職務に振り分けられていないグループでのユニットテストの採用と関心が高まっています。


1

単体テストの作成と更新には費用がかかります。ほとんどの企業では、以前のソフトウェアに単体テストがなく、作成するにはコストがかかりすぎます。したがって、彼らはそれを行わず、開発プロセスに時間を追加するため、新機能にも追加しません。


ROIに関するリンクをお読みください。
jcollum 2009

1

ほとんどの企業は役に立たない。明らかにあなた(または私)が働いている人ではありません。


これは質問に対する答えを提供しません。批評したり、著者に説明を要求するには、投稿の下にコメントを残してください。
AlexVogel

Q:「[単体テスト]を行う企業が増えないのはなぜですか?」A:「ほとんどの企業は役に立たないからです。」私への答えのように
聞こえ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.