web-dev-qa-db-ja.com

TDDでは、最初にテストまたはインターフェイスを最初に記述する必要がありますか?

私が知る限り、私はc#を使用してTDDを学習していますテストは開発を推進する必要があります、つまり失敗したテストを最初に書き込みます書き込み後に最小限の最小値 =テストに合格し、リファクタリングを行うコード。

しかし、「Program to Interface、not Implementation」と書かれているため、-interface firstと記述します。これが私の混乱の始まりです、私が最初にインターフェイスを書いている場合、それは2つのことに違反しています

  1. インターフェイス用に作成されたコードはテストでは駆動されませんです。

  2. ベアミニマムではないのは明らかですが、簡単なクラスで記述できます。

インターフェイスのテストも作成する必要がありますか?実装なしで何をテストするのですか?

この質問が馬鹿げて申し訳ありませんが、私は完全に混乱しています。文字通りに物事を取りすぎているのかもしれません。

23
k4vin

最初の違反(「インターフェース用に作成されたコードはテストによって駆動されていません。」)は無効です。ささいな例を使ってみましょう。電卓クラスを作成していて、加算演算を作成しているとします。どんなテストを書けますか?

public class CalculatorTest {
    @Test
    public void testAddTwoIntegers() {
        Calculator calc = new Calculator();
        int result = calc.add(2, 2)
        Assert.assertEquals(4, result);
    }
}

テストでインターフェースが定義されました。 addメソッドです。 addは2つの引数を取り、それらの合計を返します。後で複数の計算機が必要であると判断し、(この場合)Javaインターフェースをその時点で抽出します。publicそのクラスのインターフェース。

より理論的なレベルでは、テストはシステムの実行可能な仕様です。システムへのインターフェースは、そのシステムのユーザーによって駆動される必要があり、テストは、相互作用を定義する必要がある最初の方法です。

インターフェイス設計とテスト設計を分離することはできないと思います。相互作用の定義とそれらのテストの設計は同じ精神的操作です-whenこの情報をインターフェースに送信しますI特定の結果を期待するWhen入力に問題がある場合、Iexpectこのエラーが発生します。この設計作業を紙で行い、それからテストを作成することも、同時に行うこともできます-それほど重要ではありません。

28
Michael K

interfaceを書くとき、私たちは何をしていますか?コードを書いているか、設計しているか?

私はテスト駆動設計の概念のファンではありませんが、I loveテスト駆動開発。個人的には、テストを書く前にインターフェイスを設計することにより、クラスを前もって設計したときに最高の結果が得られました。インターフェイスをコードとして数えません。インターフェイスは、TDDを使用して実装する設計です。私が作業するにつれて進化が変わる可能性がありますが、それは私のロードマップです(私のテストリストと共に)。

私が怒鳴り始める前に立ち止まりますが、うまくいけば、それがあなたがそれについて考えるのに役立つ方法です。

5
RubberDuck

TDDでは、最初にテストまたはインターフェイスを最初に記述する必要がありますか?

それはすべて、どのように正統/宗教的にしたいかによって異なります[〜#〜] tdd [〜#〜]

TDDを学習しています

学習しているので、自分に合った個人的なワークフローを得るために実験する必要があります。

  1. あなたがそれをしたい場合本によると、あなたは最初にテストを書きます。コードがまったくないため、最初はテストが失敗します。次に、テストに合格するためのコードを記述します。それができたら、リファクタリングのためのある種のセーフティネットを提供するテストがあるので、既存のコードを自由にリファクタリングできます。 Interfaceの使用を決定することは、ある種のリファクタリングです。

  2. TDD以外の問題:インターフェイスを使用するかどうかという問題は、そもそも興味深いものではありません。もちろん、確かな場合は、複数のオブジェクトに分散したい動作が異なる場合、インターフェイスの使用を検討するのは理にかなっています。たとえば、異なる宛先へのある種の出力がある場合、それを介して実装するのが理にかなっています。インターフェースWriterで、出力用に異なるクラスがあります(FileWriter、-Printerなど)。 インターフェースに書き込むにはよくあることですが、それは次の意味ではありません:すべてにインターフェースを使用する。時にはそれは多くのことへの間接的なレベルの1つです。ところでサービスについても同様です。しかし、それは別のトピックです。

  3. 一方、別の方法でテスト駆動型を開発することもできます。テストしやすいようにコードを設計します。つまり、テストは簡単に記述できますが、テストを記述しても後でとなります。とにかくテストする限り、事前にテストを作成しても、後でテストを作成してもかまいません。

4
Thomas Junk

TDDまたはBDDは、最初にドメインインターフェイスを実行し、次に私の解釈によってそれらに対するテストを作成することを意味します。インターフェースの実装には予期された動作があります。

インターフェースにはテスト可能なロジックが含まれていないため、コードよりも先にテストされます。これは、テスト対象の構造です。

次のようにします

  1. セミフォーマルな振る舞いを書く(与えられた:時:その後:)

  2. インターフェースの記述(ホスト動作カプセル化メソッドへ)

  3. 識別したテストを記述します(与えられたものを入力し、いつ呼び出すか、次にテストします)

  4. テストに合格するための具象(インターフェースを実装するクラス)の記述/変更

2
user3721330

インターフェイスを設計する前にテストを記述しないでください。どのような種類のテストを記述するか(テスト設計)を検討しているときは、同時にアプリケーションを設計(設計)してはなりません。 2つのことを同時に考えないでください。懸念の分離について聞いたことがありますか?コードの物理構造だけでなく、思考プロセスにも適用されます。

最初にアプリケーションを設計する方法を決定します。これは、インターフェースとこれらのインターフェース間の関係を設計することを意味します。これが完了するまで、テストについて考え始める必要はありません。インターフェイスが何であるかがわかったら、まずそれらを作成してから、それらに対するテストを作成するか、最初にテストを作成してから作成することができます。後者の場合、明らかにテストをコンパイルすることはできません。テスト前にインターフェースを作成しても、TDDの哲学に害や違反は見られません。

0
Nissim Levy