web-dev-qa-db-ja.com

テスト駆動開発は誰が行うのですか?

私は過去4年半、エンタープライズスペースで働いてきましたが、一般的に言って、エンタープライズはテストファーストスタイルの開発に適した環境ではないことに気づきました。プロジェクトは通常、固定コスト、固定タイムライン、ウォーターフォールスタイルです。ユニットテストは、仮に行われたとしても、通常はQAフェーズでの開発後に行われ、別のチームによって行われます。

企業で働く前は、多くの中小規模の企業に相談しましたが、テストファーストスタイルの開発プロジェクトにお金を払うつもりはありませんでした。彼らは通常、すぐに、または短い設計変更の後に開発を開始することを望みました。

テスト駆動開発はどのタイプのショップ、企業、クライアントで最も効果的に機能しますか?どのような種類のプロジェクトがTDDを助長する傾向がありますか?

23

私が書くコードのすべての行は、テスト駆動開発を使用しています。最初にテストを書くことで管理職が同席していない場合、私はそれについて管理職に話しません。テスト駆動開発はより良いプロセスだと強く感じます。

33
mpenrow

私の上司はこれで今日私に良いものを与えました、私は彼が他の誰かからそれを盗んでいたように私はそれを盗むつもりだと思います。

「大工が板を切る前に板を測定することを期待しますか?」

私は高校で木工教室を受講し、学校を通して建設作業をしました。私たちの信条は常に「2回測定し、1回カット」でしたが、それは皮肉なことに「私はそれをカットしてもう一度カットしましたが、まだ短すぎました!」

17
MIA

後でテストする場合は、作成したコードをテストするのが困難になるため、やり直しを作成します。最初にテストするとき、またはコミットする前に少しでも途中でテストするときは、作成するソフトウェアのテストが簡単になります。チェックリストを満たすために本番コードが記述された後にユニットテストを作成する企業は、労力を無駄にしています。

既存のテストが難しいソフトウェアとの統合も、光沢のある新しいテスト駆動コードが使用する依存関係を制御できるようにテストシームを作成する必要があるため、追加の作業が発生します。グローバルな状態と神オブジェクトを多用するフレームワークなどの場合、これを達成するのは非常に困難です。テスト駆動開発の認識されている難しさは、多くの場合、経験の不足と適切なテストの作成および密結合コードのテストの試みに起因します。

ウォーターフォールプロジェクトでもドライブコードをテストできます。これは、プロジェクト管理手法ではなくエンジニアリング分野です。

私は決してTDD狂信者ではありませんが、ソフトウェア設計について多くを教えてくれます。

12
Ryan Roberts

あなたの状況はすぐには変わらないでしょう、そしてそれを乗り越えるための鍵は、それをあなたの個人的な規律の一部にして、それを他人にプッシュしようとする前にそれを上手にすることです。あなたがそれが機能している例であることができるならば、あなたの上司は客観的な利点を見るべきです。

良いビジネスケースを作ることもできます:

  • TDDは、「システムが自動的にそれ自体を検証できる仕様」として簡単に要約できます。プログラミングが異なるわけではなく、別の製品を構築するものでもありません。

  • 単体テストは、実際には自動テストの一種です。これは、コンピューターが肉空間エンジニアに手動で支払うと思われることをコンピュータに任せるだけです。自動テストはより速く、より一貫して実行され、適切に記述されている場合は、問題の迅速かつ簡潔で正確なフィードバックと説明および指示を提供します

  • TDDは、何をしているのかを知っている誰かによって行われると、コードファーストと同じくらい速く結果を生成します。学習/トレーニング曲線が存在します(そして、エンジニアが人材プールの短期間にいる場合、TDDを推進する可能性を完全に失う可能性があります-この場合、あなたができる最善のことは、それをチャンピオンし続けることですそして、管理の質問をするthem TDDではなく)

  • TDDは、タスクを開始する前に、目前のタスクをじっくりと考えることを重視しています。これは、「2回測定し、1回カット」という線に沿っています。追加の測定により、タスクにわずかな時間が追加されますが、最も貴重なリソースの廃棄は回避されます(開発時間)。

...そして覚えておいてください。あなたができる最も重要なことは、模範を示すことです。 TDDに慣れていない場合は、時間をかけてより良くなるようにしてください。熟練したら、仕事を始めてください(上司は本当にテストを書いていると不平を言うでしょうか?)。一度に1つの戦いを戦い、それに向けて歩みを進めます。シバン全体に行くことは失敗につながる可能性が高く、それを強く押した場合は非難があなたにかかります。

6
STW

これは明らかに.Netフレーバーになるので、私と一緒に耐えてください:p

テストファーストのアプローチに適しているプロジェクトのタイプに関して、私が気をつけるべきいくつかの事柄:

  • 既存のコードベースを扱っていますか?多くの場合、テストスイートの改造には法外な費用がかかります。継承された技術的負債がどれだけあるかを理解してください
  • 特定のプラットフォームとフレームワークは本質的にテストに適していません。たとえば、SharePointはTDDにとって非常に困難です(ただし不可能ではありません)。このようなものについては、TypeMockのような市販のアイソレーター製品が役立つかもしれません。
  • 特定の実装アプローチは、他のものよりもTDDに適しています。たとえば、コードビハインドを備えたASP.Net-あまりテストできません。 ASP.Net MVC-テスト可能。コードビハインド付きのSilverlight-それほどテストできません。 SilverlightとMVVM-テスト可能。

最終的に、「組織」はテストファーストへの移行をサポートするために多くのことを行うことができますが、発生する必要がある主要なシフトは開発者の心にあります。私は「あなたは最初にあなたのテストを書く」というアプローチをあきらめ、代わりに教えられる瞬間を探しました。

mpenrowのコメントに+1があり、mgmtに問題があるかどうかを通知しない:p

6
H.Y.

私がやります。それは私の好みの開発方法です。私は、大規模な金融会社で働いており、締め切りに間に合い、高品質のコードを生成する限り、自分が適切だと思う方法で仕事をしてくれることに満足しています。正しく行われれば、テストファースト開発は開発後のテストよりも長くかかる必要はありません。後でシステムテストから欠陥が少なくなるという、テストファースト開発の他の見返りを忘れないでください。

2
Chris Knight

悲しいことに、私は本当に古典的なテストファーストの感覚でそれを使用する機会がなかったので、「私!私!私はそれをする!」とは言えません。質問は、「誰もがTDDを日常生活に忍び込ませることができるのではなく」ではなく、「どの業界/企業がTDDを全面的に使用しているのか」を問うことだと思います。個人の開発者がグループ全体に強制せずにTDDを完全に実行できることに同意します。それが問題のポイントだったとは思いません。

業界について聞いた私の印象は、次のような状況では、会社のほとんどの開発グループでTDDを目にする可能性が高くなるということです。

  • TDDの開始前は、既存の大きなコードベースはありませんでした。

  • 同社は巨大ではないため、「私たちは常に他の方法でやってきた」という反発があまりありません。

  • 同社は、正式なプロセスに大きな投資をしていません。たとえば、CMMI認定企業などでTDDを実装できなかったというわけではありませんが、TDD以外のプロセスがある場合、CMMIを更新して監視するすべてのプロセスを取得することは、大きな投資になる可能性があります。

  • テストはスクリプト化できます。これは最も複雑なコードベースです。ユーザーに最も近いレイヤーを簡単にスクリプト化できない場合でも、内部の一部をスクリプト化できるためです。しかし、十分に開発されたテスト自動化オプションを備えた状況は、TDDの最も適した場所であると考えています。これは、テストのフィードバックを非常に迅速に必要とする一連のテスト全体を再実行して中断しないことに基づいているためです。私の考えでは、スタンドアロンのWebアプリはTDDの優れたターゲットであり、主要なCOTS統合またはGUIベースでない入力を備えたシステムは扱いにくいかもしれません。

  • プロトタイプ化されていない状態のシステム。理想的には、次の大きなバージョンプロトタイプ-概念実証が完了し、プロジェクトに資金が提供されますが、次の試みは品質を上げる必要があることを誰もが知っています。

  • プロセスに投資している利害関係者。

2
bethlakshmi

私は可能な限り試みましたが、それはあなたがあなた自身を見つける企業環境に本当にかかっていると思います。私は長年(アーティストとして)ゲーム業界で働いていましたが、TDDの概念はありませんでした。私はWeb開発に移行しましたが、正式な承認(または...の知識)を備えたユニットテスト/ TDDを持つ機関でまだ働いていません。同じことが、幅広い分野で働いている同業他社のほとんどにも当てはまります。

販売に特化した代理店では、TDDが顧客に提供するROIはごくわずか短期であるため、プロジェクトを範囲指定するときにラインマネージャーに販売することは困難です。ただし、プロジェクトが大きくなるほど、説得力が増します。

Death March のような本が普及している現象、つまり「クランチ」および「マイルストーン」主導の開発に悩まされている業界を指していることを考えると、TDDは多額の資金を集めた新興企業やモノリシックエンタープライズショップ以外ではおそらく珍しいと思っています。そこの人々がTDDの価値を信じていないということではありません-しかしそれは彼らの顧客に販売するにはあまりに抽象的です。

2
sunwukung

TDDを行うための鍵は、コードの記述の一部としてそれを行うことであり、必要に応じて、あなたはあなたがしていることを誰かに伝えないでください。行っているすべてを説明する必要はありません。あなたの最終結果は作業コードです。

「私はテストを書いている」と説明すれば、The Powers That Beは「ああ、私たちはそれを排除できる!」と言うことができます。しかし、誰にも言わなければ、コーディングプロセスの残りとしてテストが残っています。

プログラミングは、作業用ステートメントをエディターに入力するだけではありません。人々がそれを扱うことができないなら、彼らがそれを処理する準備ができるまで、彼らをこの真実から守ってください。この場合の「準備完了」とは、プロジェクトが1つまたは2つ完了し、時間どおりに確実で信頼できるコードで完了したことを意味します。そうですね、ユニットテストも用意されています。

2
Andy Lester

私は自分でTDDに入ろうとしています。私があなたがすでに知っているルート(毎日の仕事)をたどる限り、それはかなり簡単だと思います。しかし、UIパーツのテストや、これまでに発生したことがないいくつかの問題の新しい解決策を考え出さなければならないときは、頭を一周できません。または、あなたが知らないフレームワークを使用します。

だから、あなたはある種のLearningTestsを行い、概念実証を別々にして、後でそれを書き直すなどする必要があると思いますか、それとも私は間違っていますか?

そして(私はそれが古いものであることを知っていますが、私はまだ良い答えを見ていません):TDDを使用してアルゴリズムをどのようにコーディングしますか(結果が本当に簡単に「アサート」するために複雑になる可能性がある場合)?

私は本当にTDDとimのポジティブな側面をボートで見ることができますが、あなたが書いたコードがほとんど2倍の時間を費やすので、初心者にとっては非常に困難ですRAD付き)

2
Carsten

私がやる。ユーザーストーリーの進行状況は、開発の左側(上流)に"Has a Test?"列があるカンバンボードで追跡されます。

このやや珍しいレイアウトにより、1つのポリシーが明確になります。失敗した自動受け入れテスト(通常、いくつか)が存在する必要があります。顧客の要求にトレーサブルでなければなりません。受け入れテストは、満足の条件から発生します。これは、会話の結果です。 ストーリーカードで始まる。私は、要件をブレインストーミングし、ギャップを特定し、ユーザーの価値が(定義の完了)。これは、プログラマー、ビジネスアナリスト、場合によってはテスターが参加する共同作業です。

受け入れテストのフィードバックループは少し長いです。ストーリーが完了するまでに数日かかる場合があります。開発には独自の短いTDDフィードバックループがあります。

「[...テストファーストスタイルなし...]アジャイルに似ている...」

これはアジャイルを完全に偽って表現しています。 完了の定義はアジャイルの主要コンポーネントであり、アジャイルの基礎となる柱の1つは自動受け入れテストです(上記で説明したのは、そのための1つの方法です)。極端なプログラミング(XP)が使用されている場合アジャイル実装方法として、ATDD/BDDおよびTDDが規定されています。

1
azheglov

私はそうしますが、一般的には非UIコンポーネントに対してのみであり、モジュールのアルゴリズム全体を一度に頭の中で維持できないことがわかっている場合、またはモジュールが私が取り組んでいるシステムの新しい部分である場合、したがって、高度にデバッグされているのに、使用しているライブラリの大部分に依存することはできません。

基本的に、要件が複雑であることを意味する場合は、そうでなければコードで迷子になる可能性があります。

開始するのは難しい習慣であり、管理者の賛同が必要ですが、テストが開発の途中で中断し始めた場合、それは救命になり得ます。

1
johnc

実際にTDDを実践している企業の数を確認するために、まさにこの質問をしたいと思いました。

11年間、私は専門的にプログラミングをしてきましたが、最後の2つの組織だけがTDDに気づいていました(それは、ほぼ5年間に及び、それ以前はTDDは今日ほど人気が​​ありませんでした)。 TDDのセールスピッチに入る前に、私は追跡に立ち、質問に答えます:)

私が最後に働いた会社(人文科学コレクションのオンラインの学術出版社)では、TDDを実践する必要があることはわかっていましたが、そこに到達することはできませんでした。私たちの弁護では、250kのコードベースがあったため、そのサイズのテスト不可能なコードベースにテストを追加することは、乗り越えられないと感じました(今、タイプするのは罪悪感を感じます!)最高の私たち 間違いをする

TDDを少しでも実行した人なら誰でも、テスト不可能なコードのブラウンフィールドへの改造テストがいかに苦痛であるかを知っています...主な原因は 暗黙の依存関係 (すべてのレバーを引き出すことで結果を主張することはできませんコード-シナリオをあざけることはできません)および 単一の責任の原則 の違反(テストは複雑で不自然であり、設定が多すぎて理解しにくい ))。

リリース前にプラットフォームをテストするために、QAチームを一時的に(1人から2人で6名以上に)増やしました。時間的にも経済的にも非常に費用がかかり、「テスト」を完了するのに3か月かかるリリースもありました。それでも、私たちが問題を抱えて出荷していることを知っていました。それらは「ブロッカー」や「クリティカル」ではなく、単に「高優先度」でした。

長年の商業経験がある場合は、すべての会社がcriticalタスクをアサートし、それより高い優先度レベル、そしておそらくそれより高い優先度レベルを発明することを感謝します-特にaboveの誰かが機能/バグ修正をプッシュしているとき。余談ですが...

現在の会社(通信、Web、モバイルアプリ開発会社)でTDDを実践していることを報告し、Jenkins CIと組み合わせて他の静的分析レポートを提供します(テストスイートパスをアサートした後、コードカバレッジが最も役立ちます)。 。私がTDDを使用したプロジェクトは、支払いシステムとグリッドコンピューティングシステムです。

売り込み...

多くの場合、自動テストを技術者以外のチームメンバーに正当化するのは困難な作業です。テストを作成すると、開発プロセスにさらに多くの作業が追加されますが、...現在テストに投資する時間があると、後でメンテナンス作業を節約できます。あなたは本当に借用時間です。製品の使用期間が長いほど、節約額が大きくなります-回避するのに役立ちます大きな書き換え

最初にテストするということは、最初にインテントをコーディングし、次にコードがそのインテントを満たしていることを確認することを意味します。これはフォーカスを提供し、意図したものだけを実行するようにコードを抽出します。これは、同時に実行可能な仕様とドキュメントです(テストが適切に記述されており、テストがシステムコードと同じくらい読みやすく/クリーンである必要があります)。

非プログラマーは(多くの場合)この洞察を持たないため、TDDはそれらの価値をあまり持たず、以前のリリース日への使い捨てのショートカットと見なされます。

プログラミングはourドメインであり、私の心の中で、これはTDDのようなベストプラクティスについて助言することを専門家として私たちの責任にします。開発時間を短縮するためにそれが行われたかどうかをプロジェクトマネージャーが判断するのではなく、それは彼らの管轄外です。使用するフレームワーク、キャッシングソリューション、または検索アルゴリズムを通知しないのと同じように、自動テストを採用する必要があるかどうかも通知しません。

私の意見では、ソフトウェア開発業界(全体)は現在壊れていますが、ソフトウェアのテストを行うことは標準ではありません。

医療、航空、自動車、化粧品、ぬいぐるみ、アルコール飲料など、他の業界でこれを描きます。私は婚約者に製品をテストしていない業界に名前を付けるよう依頼しました!

おそらく、テストが行​​われないためにテストが行​​われないと言うのは不当です。しかし、自動テストを行わない企業では、それは非常に手動/人間の(不格好でエラーが発生しやすい)プロセスです。

あなたの質問で私が主張する1つのポイント...

彼らは通常、すぐに、または短い設計作業の後に開発を開始したいと考えていました。アジャイルに似ています。

「アジャイル」であることはテストなしで続行することを規定していません。 agilemanifesto.org にリストされている最初のメンバーは Kent Beck であり、XP =そしてTDD!

TDDに興味がある、またはまだ読んでおらず、熱心なプログラマーである場合は、私が強くお勧めする2冊の本です(これは誰もが正しく読んでいる人ですか?;)

テストによってガイドされる成長するオブジェクト指向ソフトウェア

クリーンコード-Robert C Martin( "Uncle Bob")Series

これらの2冊の本は互いに補完し合い、数ページに多くの意味を凝縮しています。

この質問をしてくれてありがとう:)

1
Greg K

私は数回試しましたが、うまくいきました。残念ながら、ほとんどの場合、自分のアプリを手動でテストできる場合は、何かを実装するのに飽き足りないと感じるか、簡単に修正できないバグがあるまで、ユニットテストを延期します。

1
Alexandru

明らかにこれはかなり珍しいケースですが、SQLiteの開発者はテストを広範囲に使用しています。 (私は彼らの開発プロセスがテストファーストだと思いますが、私にはわかりません。)

  • 73,000行のコード
  • 91,378,600行のテストコード

http://www.sqlite.org/testing.html を参照してください

0
Paul D. Waite

クローンを実装する人。既存のプログラムとまったく同じように機能する何かを開発する場合、これ以上のプロセスは考えられません。

0
P Shved