単体テストとテスト駆動開発の違い


64

説明を読むことで、TDDテストでは関数を記述する前に行われ、ユニットテストでは後に行われることを理解しています。

これが主な違いですか、それとも2つの用語を比較することすらできませんか。おそらく、ユニットテストはTDDに統合された部分です。

回答:


104

ユニットテストは、を意味し何をテストしている、TDDするとき、あなたがテストしています。

2つは直交しています。

ユニットテストとは、まあ、個々の動作ユニットをテストすることです。個々の動作単位は、個別に個別にテストできる可能な最小の動作単位です。(これら2つの定義は循環的ですが、実際には非常にうまく機能しているようです。)

コードを書く前、コードを書いた後、またはコードを書いている間にユニットテストを書くことができます。

TDDとは、テストが開発(および設計)を促進することを意味します。単体テスト、機能テスト、受け入れテストでそれを行うことができます。通常、3つすべてを使用します。

TDDの最も重要な部分は、中央のDです。テストを駆使してください。テストは、完了したら、何をすべきか、次に何をすべきかを示します。彼らはAPIがどうなるか、デザインは何かを教えてくれます。(これは重要です。TDDは最初にテストを書くことではありません。最初にテストを書くがTDDを実践しないプロジェクトがたくさんあります。最初にテストを書くことは、テストが開発を推進できるようにするための前提条件です)


1
すばらしい答え。追加します... TDDは、テストを促して開発努力を引き出す機能を提供するときです
Martin

しかし、それらは直交していません。ユニットテストなしではTDDを使用できません。
ジャックB

1
@JacquesB、なぜ?私たちのテストは、定義によって単体テストと呼ばれるものではなく、インフラストラクチャや他のコンポーネントに大きく依存しますが、私たちは少なくとも十分な観察可能性を持っているので、少なくとも一部はTDDを実行しています。
AProgrammer

3
@AndrewWillems:TDDは、テストが開発を推進することを意味します。あなたはデザインがどのように見えるかを決定しません、テストはあなたに言います。次の作業を決定する必要はありません、テストはあなたに伝えます。いつ終了するかは決まらない、とテストが教えてくれる。最初にテストを記述し、次にそれらがあなたに言っていることをすべて無視することは完全に可能です。たとえば、最初にテストを記述し、その後すべてのテストがグリーンになった後でもコードを記述し続けることができます。つまり、テストを最初に作成しますが、テストとしてテストを扱い、開発を推進させないようにします。
ヨルグWミットタグ

1
@JörgWMittagあなたは正真正銘の見方をしているかもしれませんが、TDDが白黒ではないことも知っています。TDDを適切に使用しても、テストで開発を完全に進めることはできず、テストではデザインがどのように見えるかを常に決定するわけではありません(ユニットテストで部分的にこれを行うことはできますが、より高い抽象レベルでのテストはできません)。リファクタリングはどうですか?これはTDDの非常に重要な側面です。また、現実の世界では、「テストが伝えるすべてを無視する」というようなことはありません。定義により、最初にテストを記述する場合、「何らかの形式のTDD」を使用します。
NickL

21

単体テストはテスト駆動開発のコンポーネントです

テスト駆動開発を行わずに単体テストを実行できます。ただし、単体テストを使用せずにテスト駆動開発を行うことはできません。

従来の単体テストを行う場合、コードを記述した後にテストを記述します。

テスト駆動開発アプローチは、コードを書く前に単体テストを書くことです。

単純な単体テストと比較したTDD(IMHO)の最も興味深い利点:

  • コードは完全にテスト済みのコードです。テストは簡単です。
  • クラスを正しく設計する必要があります。
  • また、単純な愚かさ維持することを強制します。
  • Red-Green-Refactorのサイクルは絶対的な先延ばしキラーです!

声明で意図的に「ユニット」を見逃したことがありますか?「しかし、テストを使用せずにテスト駆動開発を行うことはできません。」?
-ratkok

@ratkok:いいえ、それは意図的ではありませんでした。修正させてください。

この定義が一番好きです。他の答えよりも言葉でまとめる方が良い。
Tek

2
おそらく、真の単体テストではなく、モジュールテストまたはシステムテストを使用してTDDを実行できます。テストの実行に時間がかかりすぎると多くのメリットが失われるため、お勧めしませんが、不可能ではありません。
トビースパイト

13

TDDと単体テストは、非常に特殊な2つの用語であり、しばしば誤用されます。

TDDは失敗するテストを作成してから、実行に必要な最小限のコードを作成し、コードをリファクタリングしてクリーンにします。これはサイクルで行われ、失敗->合格->リファクタリング、コードの既知の要件ごとに新しいテストを追加します。さらに最近では、TDDは、そのサイクルで単体テストを記述することについてさらに具体的になり、同様のサイクルで受け入れテストを記述するATDD(BDDのサブセット)と区別しています。

単体テストとは、小さな孤立したユニットでコードをテストすることです。ここでの一般的な混乱は、xUnitやRspecなどの単体テストツールを使用して、単体テストを作成しているテストを実行していると考えることです。これは必ずしも真実ではありません。これらのツールは、Seleniumフレームワークを使用してsayテストを実行するために使用できます。その場合、単体テストランナーを使用して受け入れテストを記述します。単体テストは、特に高速化のために他のすべてから分離された小さなロジックに焦点を当てた非常に具体的なテストです(そのため、頻繁に実行し、新しいバグに関する迅速なフィードバックを得ることができます)。


1
JUnit自体のJUnitテストは良い例です。これらの重要な部分は、JUnitで作成されていても、ユニットテストではなく機能テストと受け入れテストです。また、JUnitの作成者はたまたまTDDの作成者でもあり、JUnitはかなりの量の機能テストと受け入れテストを使用してTDDを使用して開発されました。受け入れテストはTDDの不可欠な部分です。
ヨルグWミットタグ

6

あなたが言ったように、TDDは開発前にテストケースを書くアプローチであり、開発者はテストケースをパスするためにコードを書きます。ユニットテストは、システムテスト、統合テスト、受け入れテスト以外の狭い範囲のタイプのテストを説明するために使用される用語です。


3

TDDは、コードを記述するための哲学的なアプローチです。最初にテストを記述します。作成するテストは単体テストです。


1

2つを分離する方法は、TDDはテストではなく、コードの設計に関するものだと考えることです。次に、単体テストを使用して、終了コードの期待値を設定します。終了コードが作成され、テスト(仕様)に合格すると、テストを使用して設計されたコードが得られます。


1

すべての優れた答え。ユニットテストでは「ユニット」を小さなコンポーネントと見なす傾向がありますが、TDDは統合テストと受け入れテストを含めるようにスケールアップします。

(一部のTDDバリアントは、「ユニット」を目的の機能に向けた最小の増分ステップと見なします...)


彼らはそうすべきですが、実際の私の経験ではそうではありません。企業/グループによると、TDDを行うのは、プログラマーにjUnitテストを最初にテストさせることであり、その後、開発中にすべてが既にテストされているという事実を利用して、QAおよび統合テストを廃止(または大幅に削減)します。
11

1
@jwentingは、それを実践していると主張する人たちの欠点を方法論のせいにしないでください。どのツールも悪用される可能性があります
スティーブンA.ロウ

1
私はそうはしませんが、TDDが理論的に何であるかと、実際に何であるかとの間には大きな違いがあることを理解する必要があります。そして、ほとんどの人(OPを含む)はおそらく現実を見るだけなので、違いは彼らに指摘されるべきです。
11

TDDは設計に関するものであることを考慮すると、なぜ受け入れテストが含まれるのでしょうか?デザインをどのように「駆動」しますか?
Vitalii Isaenko

@VitaliiIsaenkoの受け入れテストは、設計の最高レベルの範囲を提供します
Steven A. Lowe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.