web-dev-qa-db-ja.com

TDD(テスト駆動開発)を行わずにアジャイルになることはできますか?

TDD(テスト駆動開発)を行わない場合、自分(またはチーム)を「アジャイル」と正しく呼ぶことはできますか?

44
CraigTP

はい、はい、はい、百万回はい。

アジャイルは哲学であり、TDDは特定の方法論です。

本当にうるさくなりたい場合、xDDにはかなりのバリエーションがあることを簡単に指摘できます。これは、支持者が詳細に説明するnot TDDですが、それらはまだ実質的に最初のテストに縛られているので、それは不正行為です。

だから、これを言いましょう-「テストファースト」開発をしなくてもアジャイルになることができます(スクラムの動作方法を見てください-コードの記述方法に関する詳細はどこにもありません)。かんばんボードを見て、あらゆる種類のアジャイル手法を見てください。

単体テストが必要ですか?もちろん、あらゆる種類の理由でそうします-ユニットテストなしではアジャイルにできないと主張するかもしれません(私はそうすることができると思いますが)-しかし、最初にそれらを書く必要はありませんアジャイル。

そして最後に、Test Firstを実行できることも同様に真実ですなし全体的な開発哲学に関係なく、最初にTestを実行するためのアジャイルで強力な引数です。


他の人(もっとSOLID担当者)も同様の意見を持っているようです...

http://www.Twitter.com/unclebobmartin/status/208621409663070208

@unclebobmartin: http://t.co/huxAP5cS TDDとOODなしでアジャイルを実行することは不可能ではありませんが、困難です。 TDDがなければ、反復率は...

(ツイート内のリンクは、LinkedInの完全な回答へのリンクです)

50
Murph

「アジャイルであること」とは、単に アジャイルマニフェスト の価値観と原則を守ることを意味します。そのドキュメントには、TDD、またはその問題の単体テストについては何も言及されていません。

つまり、TDDや単体テストを行わなくても、俊敏性を確保できます。

私はそれをお勧めしません...

19
Martin Wickman

はい

アジャイル値の1つを見てください。

プロセスとツールに関する個人と相互作用

それはすでに答えているはずです。 TDDは特定の方法論、プロセスです。実際、アジャイル開発プロセスで使用できる可能性のあるプロセスだけですが、それ以上のものはありません。 TDDは今、アジャイルであるときの最先端技術だと思います。しかし、TDDが他のプラクティスに置き換えられたとしても、アジャイルの概念は存続できると思います。

私はそれを要約します:

  • 今日のTDDはアジャイルであるための事実上の標準です

  • TDDなしでアジャイルになる方法がある場合があります

11
FabianB

私は言う

[種類]なし

元のソースに戻る場合 http://en.wikipedia.org/wiki/Extreme_Programming TDDはプロセスの基本です。テストは、ウォーターフォールの要件仕様とユースケースに取って代わり、生きたドキュメントや機能例などとして役立ちます。これらは不可欠です。

ただし、「アジャイル」にはさまざまなフレーバーが存在するため、そのうちの1つがTDDを避けている可能性は十分にあります。

編集:@Murphの質問の解釈が推奨されるようです。ヘック私もそれを支持しました、それは良い答えです。 ただし、アジャイルマニフェストは原則であり、開発方法論ではないという立場を維持しています。メリットをもたらすプラクティスを実際に実装することなく、「ああ、そうです、私はアジャイルです」と言っても無駄です。特に:

動作するソフトウェアは、進行状況の主要な尺度です。

そして

アジャイルプロセスは持続可能な開発を促進します。スポンサー、開発者、およびユーザーは、無期限に一定のペースを維持できる必要があります。

私にとって、これらの2つの原則はTDDを必要としないとしても意味します-少なくとも私はTDDなしでそれらを達成する他の方法を知りません!

編集2:はい、技術的には後でテストを書くことができます;しかし、私はまだテストファースト/ TDDを基本と考えています。これがないと「アジャイル」にできないためではなく、moreアジャイルになるためです。 Test-first/test-drivenは、test-later/test-afterthoughtよりもはるかに効率的なアプローチです。 テストの説明要件です。後でまで延期しないでください;-)

編集3:私はついにマーフの非常によく書かれた答えについて私をそんなに悩ませるものを理解しました。これは、実際に実行せずに「アジャイルになる」ことができるという概念です。そして、「それを行う」(上記のように)には、TDDがかなり必要です。

5
Steven A. Lowe

俊敏にできますが、おそらく改善の余地があります。

アジャイルの原則の1つは、変化に対応できる必要があることです。これは、何を構築する必要があるかを事前に知らないことを意味します。ウォーターフォールプロセスに従う場合、xか月前に構築する必要があるものを正確に把握し、個々のソフトウェアコンポーネントを設計して、それぞれがより大きなスキームに参加し、最終製品に到達するようにすることができます(少なくとも、そうだった)。しかし、アジャイルでは最終製品が何であるかがわからないため、コードが何に使用されるか、さらに重要なのはいつ変更されるかがわからないということです。

したがって、コードベースが変更されても、すでに構築した機能が引き続き機能することを確認するための徹底的なテストスイートが必要です。

しかし、それ自体はTDDではありません。コードを記述した後でテストを記述する場合、それはTDDではありません。しかし、TDDは別の側面で役立ち、過剰生産を防ぎます。

私自身のアジャイルチームでは、プロジェクトの後半で役立つと思われるコードを作成する開発者と苦労してきました。それが次のxか月のプロジェクト計画に何かのサポートを追加していたので、それがおそらくOKであるウォーターフォール開発であったなら。

しかし、アジャイルの原則に従っている場合は、このコードを書くべきではありません。それが必要かどうかさえわからないからです。来週に予定されていた機能は、突然無期限に延期される可能性があります。

TDDの原則に正しく従う場合、テストがこのコード行を指示する前に、1行のコードが存在することはできません(個人的には、テストなしで簡単なコードを書くことができます)。必要な機能を提供するために何が必要か。

そのため、TDDは過剰生産を回避し、チームが可能な限り効果的になることを可能にします。これは、アジャイルの中心原則でもあります。

動作するソフトウェアは、進行状況の主要な尺度です

2
Pete

厳密に言えば、あなたは アジャイルマニフェスト を守ることでアジャイルになります。実際には、コードベースは、十分なテストカバレッジがない限り、俊敏ではありません。 TDDを実行して、機能の開発前/開発中にテストを記述したり、開発後に機能のテストを記述したりできます。ただし、TDDの方法を使用する方が通常は簡単で効果的です。

2
Alb

TDD(テスト駆動開発)を行わずにアジャイルになることはできますか?

短い答え:はい。

より長い答え:この質問にはすでに非常に良い答えがたくさんあり、非常に良い参照があります。私はそれらの点について議論するつもりはありません。

私の経験では、アジャイルは手元のプロジェクトに適したリーンネスのレベルを選ぶことについてです。リーンネスとはどういう意味ですか?そして、なぜ私はそれをこの答えに持ってくるのですか?

リーンとは、メソッドから可能な限りすべてを切り刻むという意味ではありません。同僚の一人が述べたように、あなたの行動にTDDや単体テストを含める必要はありません。ただし、プロジェクトのコンテキストでは、それが有益な場合とそうでない場合があります。

AKにある大規模な名前のない小売業者のサプライチェーンについて考えてみましょう。消費者がいます。彼らは店に入ります。店舗はトラックでさまざまな商品を受け取ります。おそらく、トラックは倉庫からそれらの製品を入手します。倉庫はさまざまなメーカーからの出荷で満たされています。次に、製造業者は供給チェーン全体を所有しています。

上記のサプライチェーンの輸送担当ゼネラルマネージャーが、フリートのトラック数が10未満の場合、毎年100万ドルの年間ボーナスを受け取ると言われた場合はどうなりますか?彼はすぐに艦隊を9台のトラックに切断します。この「ひどい」シナリオでは、倉庫に保管されている商品の量が増加します(そのノードのコストが増加します)。そして、それは店頭を「飢えさせる」でしょう。

したがって、全体を考慮せずにローカルの最適化が許可されると、サプライチェーン全体が影響を受けます。

TDDとUTに戻る。 TDDは要件表現メカニズムです。システムは、これらの制約に対して実行する必要があります。けっこうだ。 TDDは、ユースケース駆動開発の要件動作またはユーザーストーリー駆動開発の要件動作を置き換えることができます。これには、単体テストと要件のワークロードを組み合わせるという「学習」という利点があります。全体的な作業負荷が軽減されるとメリットがあります。サプライチェーン全体の作業負荷が増加した場合(品質を修正しましょう)ではありません。

そして、あなたは尋ねました:TDD(テスト駆動開発)をしなくてもアジャイルになることはできますか?

できますよ。別の、おそらくより良い質問は次のとおりです。-このプロジェクトにTDDを適用すると、ソフトウェアの配信が全体的に効率的になりますか、それとも効率が低下しますか?

お気に入りの著者を引用するには... J.R.R.トールキン

ロード・オブ・ザ・リング。リングの交わり。 94ページ「そして、それはまた言われている」とフロドは答えた、「エルフの弁護士に行くな。

つまり、結局のところ、それは場合によります。あなたは質問に答えなければなりません。どの経路が最も効率的に目的の目標にあなたを導くでしょう。

TDDに、またはTDDに。それは問題のままです。 :-)

PS-この回答を別のサイトにも再投稿しています。 https://www.ibm.com/developerworks/mydeveloperworks/blogs/c914709e-8097-4537-92ef-8982fc416138/?maxresults=15&sortby=4&lang=en

1
M Kevin McHugh

城の設計と比較する。

アジャイル城

アジャイルを使用して城を設計する場合。特定の機能を持つ部分を記述し、ユーザーに機能部品の使用を促し、ユーザーの反応に合わせて将来のデザインを調整します。したがって、ダンジョンを構築し、ダンジョンキーパーと通信し、土地とダンジョンによって提供される基礎をテストします。あなたは欄干を作り、それが良いかどうか夜警に尋ねます。あなたは壁を作り、兵士に防御値をテストさせるでしょう。あなたは台所を建てて、料理人にそれを見てもらいます。そしてこのプロセスの間、これまでのすべての部分が現在の構造に加えて機能します。したがって、ダンジョンを終了すると、囚人を中に入れることができます。しかし、城を完成させたら、脱獄した囚人を見つけます。次に、ダンジョンに戻って、太いバーが必要であることがわかりますが、ドアはバーを保持するのに十分な深さではなく、ヒンジは大きなドアをサポートしていません。

TDDキャッスル

TDDを使用すると、囚人と一緒に現れ、彼らが脱出するかどうかを確認します。次に、脱獄できないまで刑務所の独房を書きます。次に、コードをリファクタリングして、不要なセルを削除し、間違った場所にあるバーを削除して、もう一度テストします。囚人は逃げませんでした。あなたは看守と通信する必要はありません。そして、すべてを完成させたら、城全体を届けることができます。その時点で看守は、ダンジョンにはもっと多くのセルが必要であると言い、今度はより多くの基礎を掘り下げる必要があります。

アジャイルTDD城

アジャイルとTDDを組み合わせる場合。囚人が脱出したかどうかを確認し、刑務所に何が必要か尋ねます。もっと細胞が必要だと彼は言う。あなたは、囚人のふりをして、彼らが脱出するかどうか確かめるために、ランダムな人々をつかみに行くでしょう。そうでない場合、あなたはそれを看守に見せれば、彼はそれに満足しています。次に、欄干の構築を開始します。

結論

したがって、どちらも異なる問題を解決します。アジャイルは、プロセスの中で最も適応しやすい段階で製品が開発されるのを見て、ユーザーのニーズを発見することに基づいて要件を変更するのに役立ちます。これには、全体的な設計から分割された安定した追加のリリースが含まれます。

TDDは、障害を予測する問題を解決します。プロセスの中で最も簡単に修正できる時点で発生する障害を発見して修正します。これには、設計全体から分割された、安定した分離されたコード単位のテストが含まれます。

TDDはアジャイルの拡張機能と見なすのは簡単です。どちらもTDDは同じパターンに従っており、ユニット主導で進捗とレビューを行うためです。違いは、アジャイルのユニットは全体として外部的に機能するのに対し、TDDのユニットは一部として機能し、外部レビュー用の機能製品を生成しない可能性があることです。そして、両方のプロセスが異なるニーズを管理します(使いやすさと正確さ)。どちらもユニットでの開発プロセスを介して機能するため、TDDをより細かく分割して、両方のレビュープロセスを同様の時点で行うことができます。

ノート

  • 単体テストだけでTDDを使用するという意味ではありません。 TDDとは、生成されたユニットの前にテストを行い、開発中にユニットを確認するためにテストを使用することを意味します。 TDDを使用しない単体テストは、以前に構築された機能を無効にしないようにするために使用できます。
  • スプリントやその他の会議を行っても、俊敏性はありません。マニフェストの目標は、俊敏性を高めます。プロセスよりも人を優先するというコミットメントを満たさずに、ウォーターフォールの目標を作業単位のあるスプリントに分割できます。
  • TDDとアジャイルの定義による。単体テストは配信できないユニットを管理するため、TDDはアジャイルよりも速く循環します。また、両方を使用する場合、アジャイルサイクルには1つ以上のTDDサイクルが含まれます(すべてのユニットがテストされている場合)。
  • 私が理解していることから、ユーザーに成果物/意味のあるユニットを開発することに失敗すると、アジャイルに失敗します。製品を高速化しても、単位は意味があります。しかし、アジャイルはメンテナンスを容易にするためのリファクタリングをどのように説明しますか?私はそれに答えるのに十分カバーしていません。
  • ユニットテストに失敗すると、TDDに失敗します。機能を正しく生成しないコードの生成。
1
Lee Louviere

アジャイルでは、すべての反復でスケジュールと品質のリスクに対処して軽減する必要があります。つまりTDDはアジャイルと見なされる必要はありません

ただし、TDDは、特に多数のイテレーションまたは人員がいるプロジェクトの場合、品質リスクを軽減するための素晴らしいテクニックです。このようなプロジェクトでは、テストケースも作成する必要があるため、TDDは初期の反復でスケジュールリスクを追加します。ただし、TDDは品質リスクを継続的に軽減するため、後の反復で大幅なコスト削減をもたらします。つまりTDDが推奨されます。

0
Jay Godse