TDDネガティブエクスペリエンス[終了]


94

TDD体験のマイナス面は何ですか?赤ちゃんのステップ(テストをグリーンにするための最も簡単な修正)が迷惑で役に立たないと感じますか?価値のないテストを見つけますか(テストは最初は意味がありますが、最終的な実装では他のテストと同じロジックをチェックします)メンテナンスが重要ですか?等

上記の質問は、TDDの経験中に私が不快に思うことに関するものです。だから私は他の開発者が同じような感情を持っているかどうか、彼らは彼らについてどう思うか興味があります。

TDDのネガティブな側面を説明する記事へのリンクに感謝します(Googleはポジティブで熱狂的な記事でいっぱいです)。


10
私の推測では、TDDはいまだに「早期導入者」の状態にあり、それを試すのに十分な関心とコミットを持っているほとんどの人は、相対的なメリットを評価します。業界が新しいプロセスと技術の長期的な効果を実際に確立するのに通常数年かかりますが、それでもコントロールがないために直接的な答えを得るのは困難です。それにもかかわらず、良い質問、そして役に立つ答えを得ることに幸運を!
アーロンノート

20
インターネットで否定性を見つけるのに問題がありますか?!
エリックウィルソン

4
@Job(およびおそらくその他):彼が単体テストではなくTDDについて尋ねたことを忘れないでください。TDD!=ユニットテスト。
-n1ckp

2
私はこの質問に答えたいと思っていますが、半日かかるので、始めたくありません。
宮坂

2
バグに十分な時間を費やしていて、書く前に書いたものごとにテストを書くのに費やす時間を減らすことができるようになったとき、test-first-all-things-TDDを採用しません。その代わりに、私は恥ずかしげに頭を下げ、新しいキャリアを探し始めます。あなたが言うバグについてではありませんか?設計?はい。それでおしまい。それだけです。そして、あなたは自分自身に安全ネットと愚かな仕事を続けるためのライセンスを与えることによって、堅牢な設計についてのひどいことを学んでいません。IDEを片付け、実際の問題を発見したい場合はコードを読み取ってください。
エリックReppen

回答:


94

「アジャイル」バナーの下にあるすべてのものと同様に、TDDは理論上は良いように聞こえますが、実際にはどれほど良いかは明確ではありません(また、ほとんどの「アジャイル」のように、そうしないと言われますそれのように、あなたはそれを間違っています)。

TDDの定義は明確にエッチングされていません。KentBeckのような人は、1行のコードの前に非コンパイルテストを作成し、失敗したテストに合格するためにすべてのコード行を作成することを要求します。最前線の設計は最小限で、すべてが推進されますテストによって。うまくいきません。その方法論を使用して開発された大規模なエンタープライズアプリを見てきましたが、これが私のキャリアで見られる最悪のコードであることを望みます(それほど遠くないでしょう。そして、才能のある開発者がそれに取り組んでいたにもかかわらずです)。私が見てきたことから、関数呼び出しが発生すること、変数がnullでモックフレームワークが徹底的なワークアウト(whoop-de-whoop)を取得したときに例外がスローされることを主に検証する非常に多くのよく考えられていないテストになります; 本番コードはこれらのテストに大きく結びついており、絶え間なく簡単なリファクタリングの夢は現れません。実際、すべてのテストが壊れるので、悪いコードを修正する可能性はさらに低くなります。

逆に、TDDは、計画段階の一部として、アーキテクチャ設計と並行して、テストを事前に高レベルで設計することを意味すると人々が主張するのを聞いたことがあります。これらのテストは、より多くの情報が利用可能になると開発中に変更される可能性がありますが、慎重に検討され、コードが実際に何をすべきかについての良いガイドを提供します。私にはそれは完全に理にかなっています。


7
+1 「計画段階の一部として、アーキテクチャ設計と並行して、事前にテストを高レベルで設計する」私にとってもはるかに合理的だと思います。
スティーブンジュリス

11
@Aaronaught Agileは計画を立てることを意味するのではなく、時間内に計画を立てることを意味します。
アダムヤスキエビッチ

25
@Adam Jaskiewicz:「事前計画なし」のことが大好きです。ちなみに、計画は定義によって事前に行われます。事前に計画していないが、イベント中に計画していない場合は、あなたは即興です。;-)
CesarGon

34
@Adam-「イテレーションの最初の日に、人々は本当にコーディングに真っすぐ飛び込みますか?」うん それが「アジャイル」な男です。私が最後に働いた(そして「アジャイル」ではなかったために解雇された)彼らは、1行のコードを計画したり、1ページのドキュメントを作成したりすることなく、3ヶ月のリリースサイクル全体を行いました。そして、はい、コードはひどく、はい、ソフトウェアは遅く、不格好でバグがありました。私が入社した日、私はマネージャーから誇らしげに彼らが「ロンドンで最もアジャイルな店」であると言われました。彼らは確かにそうでした。

7
別の問題を追加できます:テストに合格する限り、それは良いことです。テスト自体に欠陥がある可能性があり、したがって偽陰性および/または偽陽性を引き起こすことを気にしないでください。もちろん、「100%テストカバレッジ」が必要であり、そのようなものは定義上完璧です。実際には何もテストせず、その100%カバレッジを達成するためだけに作成された無駄なテストを引き起こします。発見されたコードなどとして
11

66

この(Clojureの著者)Rich Hickeyのインタビューには以下が含まれています。私は100%思いやりがあります:

寿命は短く、1日の時間数は限られています。ですから、私たちは自分の時間をどのように過ごすかについて選択をしなければなりません。テストの作成に費やすなら、それは私たちが何か他のことをするのに費やしていない時間です。量と質の両方で結果を最大化するために、私たち一人一人が最善の時間を費やすことを評価する必要があります。テストの作成に時間の50%を費やすことで結果が最大になると人々が思う場合は、大丈夫です。それは私には当てはまらないと思います。むしろ、自分の問題について考える時間を費やしたいと思います。私にとって、これは他の時間の使用よりも優れたソリューションを生み出し、欠陥が少ないと確信しています。完全なテストスイートを備えた不適切なデザインは、依然として不適切なデザインです。

Coders at Workの書籍インタビューのDonald Knuthからの別の同様の声明は、ここからコピーアンドペーストされています

Seibel:実際の仕事と言えば、The Art of Computer Programmingの作業中に、10年休みになったものを組版システムTeXを書くために取りました。TeXの最初のバージョンは、コンピューターから完全に離れて作成したことを理解しています。

Knuth:1977年と78年にTeXを最初に書いたとき、もちろん文芸的なプログラミングはありませんでしたが、構造化プログラミングはしました。筆記用の大きなノートに鉛筆で書きました。6か月後、プロジェクト全体を終えた後、コンピューターに入力し始めました。そして、'77年の10月にプログラムの作成を開始したときに、'78年の3月にデバッグを行いました。そのためのコードはスタンフォードのアーカイブにあります-それはすべて鉛筆です-そしてもちろん、私はそれがどうあるべきかを学んだときに戻ってサブルーチンを変更します。これは第一世代のシステムだったので、多くの異なるアーキテクチャが可能であり、しばらくの間それを使って何があったのかを知るまで捨てなければなりませんでした。そして、これは鶏と卵の問題でした。フォントができるまでタイプセットすることはできませんでしたが、タイプセットできるようになるまでフォントを手に入れることはできませんでした。しかし、構造化プログラミングにより、不変式の考え方と、理解できるブラックボックスの作成方法がわかりました。そのため、最終的にデバッグするときにコードが機能するという自信がありました。何かをテストする前に6か月待てば、多くの時間を節約できると感じました。コードがほぼ正しいという自信がありました。

Seibel:足場とスタブを構築して不完全なコードをテストするのに時間を費やさないので、時間を節約できますか?

クヌース:そう。


24
私はあなたがやっている仕事の種類を見なければならないと思います。KnuthとHickeyは、新しい(革新的な)アプリケーションの設計について話しています。TDDの人気のある場所(広範にわたる一般化)を見ると、TDD方式で記述されたアプリケーションのほとんどが既によく知られているアーキテクチャを持っていることに気付くでしょう。
セバスチャンガイガー

4
Rich Hickeyの意味はわかりますが、これを追加したいと思います。私の経験では、テストを作成するときは、設計について本当に考え、コードをテスト可能にする方法について考える必要があります。経験、より良いデザインになります。
ニクラスH

3
OPがTDDのネガティブな経験を求めているのを見ると、どちらの例もTDDの実際の例を示していないので、どちらの例もこの質問に関連しているようには見えません。
ウィンストンイーバート

5
@Michael Borgwardt:既存の優れたデザインにテストを追加して、実装のバグを取り除くのは比較的簡単です。しかし、悪いデザインを取り除くことは、しばしば完全な書き直しを意味します。したがって、主な目的は設計を正しくすることです。実行は後で修正するのが簡単です。
ジョナスプラッカ

4
ほとんどのビジネスアプリケーションには、Donald Knuthが作成および/または保守する利点がありません。アプリケーションの寿命は通常、その主要な開発よりもはるかに長くなります。私の現在のプロジェクトでもっと多くのテストを前もって書いてもらいたいと思います。現在、メンテナンスは無限回帰の地雷原のようなものです。
マットH

58

TDDでのネガティブな経験は初めてでした。TDDは私にとって素晴らしいサウンドでした。私は長年QAを行ってきましたが、それでも心の中で恐怖は新鮮でした。バグをビルドする前にすべてのバグをつぶしたかったのです。残念ながら、TDDを使用しても、適切なテストを作成できるとは限りません。実際、私の最初の傾向は、簡単なコードを生成する簡単なテストを書くことでした。抽象化がほとんど含まれていない本当にシンプルなコード。クラス内部と絡み合った本当に簡単なテスト。そして、数千のちょっとしたテストを実施したら、コードをリファクタリングして非常に重要なドメインコンセプトXを使用するためにテストを数百回変更しなければならないときに、速く動いているとは思わないでしょう。

私に光が当たりました-TDDはテストスキルではありません。それは設計スキルです。実践的で、設計の方向性を常に意識して、優れたシンプルで実行可能なコードに導くことができます。コードカバレッジのためにテストを記述する場合は、脆弱なテストを作成します。抽象化の設計に役立つテストを作成している場合、トップダウンコードを作成するより厳密な方法にすぎません。最初に呼び出し元の視点からコードを見ることができます。これにより、クラスの内部をその外側のエッジにミラーリングするのではなく、彼の生活を楽にすることができます。

TDDは便利だと思いますが、私はそれについて独断的ではありません。それらの「価値のないテスト」がメンテナンスを困難にしている場合-それらを削除してください!私はテストを他のコードと同じように扱います。リファクタリングして簡単にできる場合は、それを実行してください!

個人的には見ていませんが、一部の場所ではコードカバレッジとテストカウントを追跡していると聞きました。したがって、メトリックの収集がTDDの副作用である場合、それもマイナスであると考えられます。私は熱心に1000行のコードを削除し、それが20のテストを廃止し、コードカバレッジ%を落とすなら、まあまあです。


7
あなたは、パラグラフ2にそれを釘付け
シェルドンWarkentin

4
「個人的には見ていないが、コードカバレッジとテストカウントを追跡している場所があると聞いた」私はそのような環境に住んでおり、実際にコードがスローされることはありません。つまり、実際のテストのデバッグを開始し、それらの多くに重大な欠陥があることが判明するまで、テストに合格するためにコードに誤った結果を生成させました。そのとき、「誰がテストをテストしているのか」という質問を生み出しました。これまでのところ、TDDコミュニティから満足のいく答えを得たことはありません。ユニットテストのためのユニットテスト、誰か?
-jwenting

@jwenting-そしてこの逸話は、レイの議論をかなりうまくサポートしています。TDDの回帰保護の側面は、理論的には堅実な考えであるとしても、実際には誇張されていることがわかりました。テストは、動作するために本番コードと同じレベルに維持する必要があり、非本番コードをこのように扱うのは少し不自然です-ハードウェアシミュレータ、コードジェネレータ、など常に。
スティーブジャクソン

「クラス内部に絡み合った本当に簡単なテスト」<-そこには問題があります。パブリックインターフェイスに対してのみテストします。TDD!= UT
スティーブンA.ロウ

2
@ StevenA.Lowe-私は今知っていますが、9年前はそれほど明確ではありませんでした:)「TDDはテストスキルではありません」
スティーブジャクソン

41

私はここで手足に出て、それが文字通り時間の儀式的な浪費であることを残忍な誠実さで宣言します。(ほとんどの状況で。)

ユニットテストに関する本を購入し、TDDについても説明しました。UTの利点には同意しますが、TDDを約100時間試した後、さまざまな理由でそれをあきらめました。私はここにクロスポストのようなものですが、TDD:

  1. 実際のドキュメントよりも優れたドキュメントではありません。
  2. バグやリグレッションをキャッチしません
  3. 関数型プログラミングと構成可能性の概念を適用した場合、設計が最終的に改善されるわけではありません。
  4. コードレビューを行ったり、ドキュメントや仕様を磨いたりするのに費やすことができる時間です。
  5. マネージャーが何百もの緑色のアイコンのリストを見たときに、マネージャーに誤った安心感を与えます。
  6. 入出力マッピングが制限されたアルゴリズムの実装の生産性が向上します。
  7. TDDの結果、自分が何をしているかを知っているかもしれないという点で不器用ですが、なぜそれがうまく機能するのか、なぜデザインがうまくいくのかについて理解していません。

もう1つの懸念は、TDDを使用して正常に実行する必要のある議論の完成度です。プロジェクトの最初からチームの全員がTDDを永続的に行わないと、苦しむだけだと言う人もいます。他の人は、この本によってTDDを実行することはないと主張しています。これらの両方が真である場合、TDD実践者は、それを認識しているかどうかにかかわらず、苦しんでいることになります。

もちろん、TDDのような方法で物事を行うことで、TDDで簡単に作業できる設計にたどり着くと主張されている場合、それを達成するためのより迅速な方法があります。つまり、実際に構成可能性。そこには多くのリソースがあり、厳密な数学的理論もたくさんあります(主に関数型プログラミングだけでなく、他の分野でも)。すべてのTDD時間を学習に費やしてみませんか?

文化的には、TDDは儀式的な慣習であるという症状を示しています。それは罪悪感に乗っています。理解よりも手順を奨励します。たくさんの教義とスローガンがあります(「偽造するまで」は、客観的に見ると非常に憂慮すべきです)。ウィキペディアの「儀式」という言葉の定義は、実際にはかなり適切です。

心理学では、「儀式」という用語は、不安を中和または防止するために人が体系的に使用する反復的な行動の技術的な意味で使用されることがあります。それは強迫性障害の症状です。


非常に興味深い視点:儀式。また、一部のサークルでは、プログラマーの技術に対するコミットメントは、TDDの順守に比例していると判断されるという感覚も得ます。
yalestar

状況によっては設計を改善できると思いますが、ほとんどの場合、非常に明確で使いやすいパブリックインターフェイスを備えた高度にモジュール化する必要があります。このような場合にライブラリ自体を実装する前にテストを作成すると、パブリックインターフェイスのバグを解決し、そのモジュール性を強制できます。
-jwenting

8
@jwenting人々がTDDを行うのは、設計がモジュール式になっている理由がわからないため、40インチの自転車から35インチのトレーニングホイールを取り外すことができないためです。概念を理解していれば、モジュール設計の作成は常に管理しやすいタスクです。なぜなら、設計の各ジレンマは、概念上、モジュール化の過程にあるという事実により、管理可能なサイズになるからです。TDDがモジュール化の強制に効果的であることには同意しませんが、モジュール設計の作成を強制する必要があることに同意しません。モジュラーデザインは、完全に教えやすく学習可能なスキルです。
宮坂

@jwentingパブリックインターフェイスの使いやすさについては、TDD実践者の間で2つの考え方がありますが、どちらも望ましくありません。テストできるようにすべてを公開するか、テストする必要がない場合は非公開にします。前者は不必要な実装の詳細を強制的にエンドユーザーに公開し(潜在的に誤用または悪用される可能性があります)、後者はユニットテストをシステムテストに近づけるようにします。もちろん、ユニットテストツールを使用してプライベートにアクセスできますが、TDDではあまり意味がありません。
宮坂

1
@Kallそのインタビューで、彼は「あなたが彼を引用したように15%だけでなく」「約15から35%多くの時間」を言います。この研究では、Java / C ++ / C#(おそらく日付を指定するとC#2)のみが関係します。これは、同じ命令型OOPパラダイムのすべての言語です。私は確かに関数型言語(およびC#3でも)で15%以上、おそらく35%以上生産性が高く、ステートレスで構成可能なコードを作成するバグをはるかに少なくしています-テストを改善するのと同じ種類のバグ、どちらもまったく同じタイプの問題を解決するからです。言い換えると、確かに、バグが60〜90%削減されますが、と比較されます
宮坂

18

加えて、私が気づいたTDDに関するもう1つの懸念は次のとおりです。

TDDは、開発チームの品質コードからテストケースとコードカバレッジへ不注意なシフトを引き起こします!私は個人的にTDDが好きではありませんでした。TDDは創造性を低下させ、ソフトウェア開発を退屈な機械プロセスにしています。ユニットテストケースは、慎重に使用すると便利ですが、ソフトウェア開発の目標を処理すると負担になります。

私はマネージャーであり、かつてTDDに夢中になった技術的に退屈な人を知っています。彼にとって非常に不思議なことであり、保守性の低いコードで貧弱なアーキテクチャのソフトウェアのすべての問題に魔法の解決策をもたらすと信じていました。そのプロジェクトに何が起こったのかは言うまでもありません。彼のテストケースはすべて緑でしたが、彼の手で惨めに失敗しました。TDDは、「私のケースの99/100は環境に優しい」などの統計情報の取得に役立ち、品質を評価したり、デザインの改善を提案したりすることができないため、彼の強迫観念の理由になったと思います。


2
PHB地獄のようですね!ボーナススキームを導入している企業を思い起こさせます。もちろん、開発者は品質の高いコードではなく、ボーナスの要件を満たすことに専念します。必然的にあなたはクラッピーなコードを手に入れます。(現在の銀行危機にも類似しています:
TrojanName

TDDはプロジェクト管理手法ではないため、wannabe-managerが失敗したのも不思議ではありません。一方、テストを開発することで自動的にコードに関する別の見方が得られるので、私はそれほど創造的ではないと感じます。しかし、私は焦点が生産コードである必要があり、テストが良いソフトウェアアーキテクチャを台無しにすべきでないことに同意します。
アレックス

コードカバレッジは、TDD ではなくユニットテストの問題です。TDDは、パブリックインターフェイスを介した機能とテストのみを考慮します。
スティーブンA.ロウ

14

私の主な否定的な経験は、TDDを使用して、テストがない、または非常に基本的な統合テストがない別のプログラマーのコードを編集することです。機能を追加したり、コードの問題を修正したりするとき; 最初にテストを書くことをお勧めします(TDDの方法)。残念ながら、コードは密結合されているため、多くのリファクタリングを行わないとテストできません。

とにかくリファクタリングは素晴らしい練習ですが、コードをテスト可能な状態にするために必要です。そして、このステップの後、私の変更が何かを壊したかどうかを確認するためのチェックとバランスがありません。アプリケーションを実行し、すべてのユースケースを調べる必要はありません。

一方、TDDプロジェクトへの機能の追加/バグの修正は非常に簡単になります。本質的に、TDDで記述されたコードは、通常、作業する小さな部分と完全に分離されています。

いずれにしても、TDDはガイドラインです。最大の効果が得られると思われるところまでそれに従ってください。適切なテストカバレッジと分離されたコード、適切に記述されたコード。


1
単体テストを書くのが難しい場合、一般的に懸念事項の分離が不十分です。これがTDDのせいだとは思わない。もしそれがあればこれらの問題がすぐに明らかになる。
、トムカー

7
それはTDDのネガティブな経験ではありません。それは安っぽいコードのネガティブな経験です。
宮坂

13

システムの設計に関しては、テストに依存しすぎることがあるという経験をしました。基本的に、実装の詳細についてはあまりにも低すぎて、一歩進んで全体像を見ることができません。これにより、多くの場合、不必要に複雑な設計になります。私はコードをリファクタリングすることになっていることを知っていますが、時には一歩戻ることで多くの時間を節約できるという印象があります。

とはいえ、アーキテクチャの決定が非常に制限されているレールのようなフレームワークがある場合、これらの問題は基本的に存在しません。

もう1つの問題は、テストを盲目的に信頼する場合です。真実は-他のコードと同様に-テストにもバグがある可能性があります。そのため、テストに対しても実装に対しても重要です。


2
たぶん、あなたはあなたのテストのためにいくつかのテストを書くべきです!:p ......私は子供、私は子供
アレン

+1 +1 +1 +1 +1(ダミーアカウントが3つある場合)。センテンス#2は非常に洞察力があり、あまりにも普及しているTDD確認バイアスがありません。
tgm1024

11

TDDの大ファンとして、私はこれらの欠点を時々見ます

  • コードカバレッジがほぼ100%であるために、あまりにも多くのテストを記述する誘惑。私の意見では、テストを書く必要はありません
    • 単純なプロパティゲッター/セッター用
    • 例外がスローされるたびに
    • 異なるレイヤーを通して同じ機能をチェックします。(例:すべてのパラメーターの入力検証を確認する単体テストがある場合、統合テストを通じてこれらのすべてのテストを繰り返す必要はありません)
  • 同様のテストのテストコードのメンテナンスコストは、わずかに異なります(コードの複製(コピー/貼り付け/継承)によって作成されます)。既にお持ちの場合は、同様のものを簡単に作成できます。ただし、テストコードをリファクタリングしない場合、ヘルパーメソッドへのコードの重複を排除することにより、ビジネスコードの実装の詳細が変更された場合、テストを修正するのに時間が必要になる場合があります。

  • あなたが下にある場合は、時間圧力あなたがしたくなるかもしれません壊れたテストを排除する(またはそれらをコメントアウト)の代わりに固定するそれらを。このようにして、テストへの投資を失う


2
+1:「ほぼ100%のコードカバレッジのためにあまりにも多くのテストを記述するという試み。」:私は一度このintoに陥りました。単体テストではカバーされておらず、コードを段階的にデバッグすることで簡単に見つけることができます。
ジョルジオ

9

TDDが価値のあるゲーム開発者として、私はまだ複数のシナリオに出くわしていません。そして、そのインスタンスは、本質的に純粋に数学的なコードであり、膨大な数のエッジケースを同時にテストするための堅実なアプローチが必要でした。

いつか何かが私の心を変えるかもしれませんが、XPのプラクティスの中で、容赦なくリファクタリングするという考えと、独自の形式に進化するコードははるかに重要であり、私にとって最大の生産性につながります。James Newkirkの論文からの引用:

シンプルさ-「動作する可能性のある最も単純なものは何ですか?」
メッセージは非常に明確です。今日の要件を考慮して、ソフトウェアを設計および作成します。未来を予測しようとしないで、未来を展開させてください。多くの場合、これは非常に予測不可能な方法で行われ、予測は費用がかかりすぎるために費用がかかる場合があります。」

彼が言及する勇気フィードバックループの強化の概念は、私の考えでは、生産性の鍵でもあります。


9
問題は、単体テストなしで、あなたの容赦ないリファクタリングが同じことをするコードになることをどうやって知るのですか?私の経験では、私が問題に応じて、それは私に取ることができることを発見したより少ないそれはそれ自身のコードを記述するよりもテスト+コードを書くのに時間を!理由は主に、いくつかの問題については、手動でテストするよりもはるかに迅速にリファクタリングを試して、自動的に再テストできるため、反復の速度が非常に大きくなるという事実に帰着します。
マークブース

6
ゲームの場合、非常に頻繁に結果が表示されます。ゲームは主観的な体験であることを意図しているので、それらを見ることができ、十分によく見える場合、受け入れられます。一方、例えば 例として、Diablo 2は、戦闘式のエラーの数が、TDDが大きな価値をもたらし、パッチに関する膨大な量の作業を節約できる場所を示しました。方程式の解法など、非常に明確に定義された問題の場合、および実行時に視覚的な出力でこれらを判断できない場合、TDDは正確性を確保するために不可欠です。しかし、それはほとんどのゲームのコードのごく一部です。
エンジニア

また、シミュレーションの実行速度により、シミュレーションの実行中にリアルタイムで変数を監視するほうが、事実を確認するために数百万行のログファイルを保持するよりも優れていることに言及する価値があります。
エンジニア

3
私の経験では、単体テストはリファクタリングをはるかに簡単にします。
トム・カー

1
@Nickゲーム業界の大きな問題は締め切りです。これは常に「半年前に納品しなければなりませんでした」。私は、時間に制約のある環境での単体テストと時間の関係があると思います。場合によってはそれが正しい決定ではありませんが、ほとんどの場合、テスト記述なしで出荷する方が速いです。依存し、実際に依存して...
コーダ

7

私のネガティブTDDの経験は、限られているかもしれませんが、どこから始めればよいかを知るだけです!例えば、私は何かのTDDをしようといずれかのテストの些細な事を禁止する開始する見当がつかない(私は新しいことができますFooオブジェクトを、私はに渡すことができますQuuxBaz、など。何をテストしていないテスト)、または既存のプロジェクトに実装しようとすると、TDDで使用できるようにさまざまなクラスを書き換える必要があることがわかります。最終的な結果は、この概念をすぐに完全に放棄することです。

ユニットテスト(TDDまたはその他)が何であり、なぜそれが良いことなのかを知っているのは、会社全体で私だけであることが多いので、おそらく助けにはなりません。


1
モックフレームワークが登場します。インスタンスFooモックオブジェクトではなく、QuuxかつBaz直接、その後、あなたがテストし、その後、モックはあなたが期待する機能で呼び出されたことを確認したい関数を呼び出すことができます。モックオブジェクトは、ユニットを分離し、ユニットをテスト可能にするための有効化テクノロジーです。これがシングルトンが悪である理由です。なぜなら、あなたはしばしばそれらをモックアウトすることができないからです。* 8 ')
マークブース

7

TDD熱狂者。

私にとっては、彼らは私の行方が取り返しのつかないほど壊れており、救いへの唯一の道がイエス、ケント・バック、またはユニット・テストであることを証明しようとする、私の宗教的ルーニーの一列に過ぎません。

IMO、彼らの最大の嘘は、TDDがより良いアルゴリズム設計の救済にあなたを導くということです。TDDで書かれた有名なSodukuソルバーを参照してください:ここではここではここではここここ

TDDを使用せず、旧式のエンジニアリングを使用して行われたPeter Norvig数独ソルバーを比較してください。http//norvig.com/sudoku.html


これについて議論を続けることができます。しかし、ゲームデザインの学位を取得してFullsail大学を卒業して以来、仕事が多すぎます。私のコースと非常に要求の厳しい仕事に基づいて、TDDは、怠zyなプログラマーの行ごとの(設計の欠如)開発に本当に勝っていると言えるでしょう。ほんとうに言っていないかもしれませんが、それは本当です。通常の大学のCSプログラムに行ったほとんどの開発者はほとんど卒業していませんでした。 、 1行ずつ。フルセール大学には
ゾンビ

テスト駆動開発のみの完全なコースであり、それにより開発者は正しい軌道に乗ることができます(c ++でリンクリストを実装するのではなく)。
ゾンビ

リンクが壊れています!
lmiguelvargasf

これは何年も後ですが、@ Zombiesは「Confirmation Bias」を調べます。私たち全員が大学のCSで教えられていることの多くは、まさにそのカテゴリーに分類されます。「マジックナンバー」の外の手解雇およびC.でのgotoの狂気バッシングを見てみましょう
tgm1024

私はトローリングしていました...私はずっと前にその小さな宝石を忘れていたと書きました。
ゾンビ

5

これらの「熱狂的な」記事のTDDを使用すると、ソフトウェアにエラーがないという誤った安全感が得られます。


1
与えられた一連の入力に対して、ソフトウェアが与えられた一連の出力を返すことを知る以外の感覚を得ることができますか?

tddは開発プロセスであり、あらゆる種類の問題を解決するためのゴールドルールではないことを理解している限り、問題ありません。しかし、このプロセスを使用することを提案する人々のほとんどは、それが開発プロセスであり、他のプロセスと同様に明るい面と暗い面があることを忘れていました。彼らはすべての機能をカバーするためにテストを使用するので、tddを使用する場合はバグのないソフトウェアがあると皆に言っています。そして、通常は正しくありません。最良の方法では、各ケース(または少なくとも機能)のテストがありますが、テストはプログラム(バグがある)であり、ブラックボックステストのみです。
ダイニウス

4

TDDにはいくつかの利点があります。

  • あなたは、に焦点を当てる方法を代わりにこの問題を解決するに焦点を当てたの(あなたが最初のテストを書いて)最初に期待するあなたのコードと何を呼び出してから、あなたは、アプリケーションからの呼び出しに接着します。モジュール性により、モックとラップが簡単になります。
  • テストは、リファクタリングの前後でプログラムが同じように動作することを確認します。これは、プログラムにエラーがないことを意味するのではなく、同じように機能し続けることを意味します。

TDDは長期投資に関するものです。アプリケーションのメンテナンスモードに到達すると努力は報われますが、アプリケーションがそのポイントに到達する予定がない場合、投資を回収することはできません。

私は飛行機のチェックリストに類似した赤ん坊のステップでTDD赤緑サイクルを検討します。離陸前に飛行機内のすべてのものをチェックするのは面倒で面倒ですが、特に簡単な場合(TDDベビーステップ)は安全性が向上することがわかっています。すべてが機能することを確認することに加えて、基本的に飛行機をリセットします。つまり、飛行機は離陸する前に再起動されます。


3
メリットポイント2は、TDDアプローチを使用しない単純な単体テストでも実現できます。メリット1とにかくやるべきです。(APIに焦点を合わせて)TDDを使用して安っぽいAPIを作成することはまだ完全に可能ですが、はい、それは(書面テストのために)動作することが保証されています。
スティーブンジュリス

2
質問はTDDの利点について尋ねていませんでした。それについてはすでに他にもたくさんの質問があります。
アーロンノート

1
@aaronaught、私は彼の問題点に取り組んでいます。

答えは質問に対処する必要があります。
アーロンノート

1
@aaronaught、それからそれらのいくつかを書いてください。

3

TDDに対する私の否定的な経験は、多くの新しくて誇張されたもので感じるものです。実際、コードの妥当性を保証するTDDを楽しんでいます。さらに重要なことは、新しいコードを追加したり、何らかのリファクタリングを行った後、テストの失敗を認識できることです。

TDDについて私を悩ませているのは、それについて多くのルールやガイドラインがあるという事実です。まだかなり新しいので、私たちのほとんどはTDDの初心者になります。したがって、私たちの一部にとってうまくいくものは、他の人にとってはうまくいかないかもしれません。私が言いたいのは、TDDを実行するための本当の「間違ったまたは正しい」方法はないということです。私のために働く方法があります。

だから、テストを書く限り-実稼働コードの前後は本当に重要ではない-テスト駆動が本当に意味があるかどうかは、まだ証明されていないため、今述べられているすべてのガイドラインに従う必要があるかどうかわからない毎日の仕事に理想的なソリューション。テストを書くのにもっと良い方法を見つけたら、ブログに投稿するか、ここで議論するか、それについての記事を書くべきです。だから、10年かそこらで、TDDのどのルールが特定の状況で良いかそうでないかを判断できる十分な経験を共有したかもしれません。


+1素晴らしいコメント。本当の道である必要も、まったく道である必要もないのです。
-unpythonic

3

不器用だったので、次の日に破棄したコードを複数回書いたことがあります。TDDで再起動しましたが、解決策は改善されました。ですから、私はTDDのネガティブな経験のラインにあまり入っていません。しかし、そうは言っても、私は時間をかけて問題について考え、TDD以外の分野でより良い解決策を考え出しました。


1
通常、2回目の試行では、TDDであるかどうかに関係なく、最初の試行よりも多くの問題に関する洞察が得られます。
wobbily_col

3

緊急システムに関しては、TDDのパフォーマンスが低いことがわかりました。私はビデオゲームの開発者で、最近TDDを使用して、複数の単純な動作を使用してエンティティのリアルな動きを作成するシステムを作成しました。

たとえば、異なるタイプの危険なエリアからあなたを遠ざける責任がある行動と、異なるタイプの興味深いエリアにあなたを移動させる責任がある行動があります。各動作の出力を統合すると、最終的な動きが作成されます。

システムの内臓は簡単に実装され、TDDは各サブシステムが何を担当するかを指定するのに役立ちました。

しかし、振る舞いがどのように相互作用するか、さらに重要なこととして、それらが時間とともにどのように相互作用するかを指定することになると、問題に遭遇しました。多くの場合、正しい答えはありませんでした。最初のテストは合格しましたが、QAはシステムが機能しないエッジケースを見つけ続けることができました。正しい解決策を見つけるには、いくつかの異なる動作を徹底的に繰り返す必要があり、ゲーム内で動作することを確認する前に新しい動作を反映するために毎回テストを更新した場合、何度もテストを破棄することになりました。そこで、それらのテストを削除しました。

私はおそらくQAが発見されたエッジケースをキャプチャし、より強いテストを持っていたはずですが、あなたは多くの物理学とゲームプレイシステムの上に座って、このようなシステムを持って、ときあなたが時間をかけて行動を扱っている、それは少しになり何が起こっているかを正確に指定するのは悪夢です。

私はほぼ間違いなく自分のアプローチで間違いを犯しました。システムの根性について言ったように、TDDは見事に機能し、いくつかの最適化リファクタリングもサポートしました。

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