メソッドごとにいくつのテストがありますか?
理論的で非常に非実用的な最大値は、N-Pathの複雑さです(テストはすべて、コードのさまざまな方法をカバーすると仮定します;))。最小値はONE!です。つまり、パブリックメソッドごとに、実装の詳細をテストせず、クラスの外部動作(戻り値と他のオブジェクトの呼び出し)のみをテストします。
あなたは引用する:
*そして、各メソッドを独自のテストメソッド(1対1の関係)でテストするという考えは笑えるでしょう。*
そして尋ねる:
各メソッドのテストを作成することが「笑える」場合、どのように/いつテストを書くかを選択しますか?
しかし、あなたはここで著者を誤解していると思います:
one test method
per を持つという考えはone method in the class to test
、著者が「笑える」と呼ぶものです。
(少なくとも私にとって)それは「少ない」ということではなく、「もっと」ということです
だから私が彼を理解したように言い換えさせてください:
そして、各メソッドをONLY ONE METHOD(1-1の関係にある独自のテストメソッド)でテストするという考えは、笑えるでしょう。
見積もりを再度引用するには:
テストを書くのではなく、動作を指定することがすべてだということに気づくと、視点が変わります。
TDDを練習するとき、あなたは考えない:
メソッドがあり、メソッドに関するすべてをテストcalculateX($a, $b);
するテストtestCalculcateX
が必要です。
TDDからわかることは、コードがどのようにすべきかを考えることです。
私は2つの値のうち大きい方を計算する必要があります(最初のテストケース!)が、$ aがゼロより小さければエラーを生成するはずです(2番目のテストケース!)そして$ bがゼロより小さければ....(3番目のテストケース!)など。
コンテキストのない単一のメソッドだけでなく、動作をテストする必要があります。
そうすれば、コードのドキュメントであるテストスイートを取得し、実際にそれが何をするのか、おそらくその理由を説明します:)
単体テストを作成するコードの部分をどのように決定しますか?
さて、リポジトリや本番に近い場所で終わるすべてのものにはテストが必要です。上記で述べようとしたので、あなたの引用の著者はそれに反対するとは思わない。
テストを行っていない場合、特に変更を加えていない場合は、コードを変更するのがはるかに難しくなります(より高価になります)。
TDDは、すべてのテストを確実に行う方法ですが、テストを作成する限り問題ありません。あなたは後でそれをするつもりはないので、通常は同じ日にそれらを書くのが役立ちますか?:)
コメントへの応答:
他のメソッドに依存している、または依存しているため、特定のコンテキスト内で適切な量のメソッドをテストすることはできません
これらのメソッドが呼び出すことができるものは3つあります。
他のクラスのパブリックメソッド
他のクラスをモックアウトして、状態を定義します。コンテキストを制御しているので、問題はありません。
* 同じ上の保護されたメソッドまたはプライベートメソッド*
通常、クラスのパブリックAPIの一部ではないものは直接テストされません。
実装ではなく動作をテストし、クラスがすべてを1つの大きなパブリックメソッドまたは呼び出される多くの小さな保護されたメソッドで機能する場合は、implementationです。テストに触れることなく、これらの保護されたメソッドを変更できるようにする必要があります。コードを変更すると振る舞いが変わるとテストが中断するためです!それはあなたのテストが何のためにあるのか、あなたが何かを壊したときにあなたに知らせる:)
同じクラスのパブリックメソッド
それは頻繁に起こりませんか?そして、次の例のようになっている場合、これを処理する方法がいくつかあります。
$stuff = new Stuff();
$stuff->setBla(12);
$stuff->setFoo(14);
$stuff->execute();
セッターが存在し、executeメソッドシグネチャの一部ではないことは別のトピックです;)
ここでテストできるのは、間違った値を設定したときにexecuteが爆発するかどうかです。それは、setBla
我々はこれら二つの許容値(12&14)はthatsの一つのテストケースよりも、(何らかの理由で)一緒に動作していないことをテストしたい場合は、文字列を渡すときに例外をスローすると、個別にテストすることができますが。
「良い」テストスイートが必要な場合は、PHPで、おそらく@covers Stuff::execute
このメソッドのコードカバレッジのみを生成するために注釈を追加し、セットアップされているその他のものは個別にテストする必要があります(もう一度、あなたはあれが欲しい)。
つまり、最初に周囲の世界をいくつか作成する必要があるかもしれませんが、通常は1つまたは2つの実際の機能だけに及ぶ意味のあるテストケースを作成できるはずです(セッターはここではカウントしません)。残りはエーテルをあざけるか、最初にテストしてから依存することができます(を参照@depends
)
*注:質問はSOから移行され、最初はPHP / PHPUnitについてでした。そのため、サンプルコードと参照はphpの世界からのものです。テストフレームワーク。