web-dev-qa-db-ja.com

各メソッドに個別のJUnitテストクラスが必要ですか?

クラスのJUnitユニットテストを作成しています。

メソッドごとに個別のクラスを用意するほうがいいですか、それとも実際のクラスごとにテストクラスを1つだけ持つほうがいいですか

14
viraj

テストを構成する方法は、テストを行うことの重要性と比較すると、それほど重要ではありません。

優れたテストスイートにとって最も重要なことは、すべての機能をカバーしていることです。これにより、回帰不良が発生したときにすぐに気付くようになります。メソッドごとに1つのテストを作成するか、メソッドの入力値の組み合わせごとに1つのテストを作成するか、またはそのメソッド内の可能なコードパスごとに1つのテストを作成するかは、それほど重要ではありません。これらのテストを少数または多数のテストクラスに編成するかどうかは、それほど重要ではありません。テストスイートは常に完全に成功する必要があるため、17のテストのうち3つまたは2つのテストが失敗するかどうかは関係ありません。修繕。

もちろん、テストコードはコードでもあるため、保守性、モジュール性などの通常のベストプラクティスに従う必要があります。ただし、テストクラス自体の保守性ではなく、テストスイート自体の保守性によって決定する必要があります。彼らがテストするクラス。あなたが言及する両方のポリシーは、一貫してそれらに従っている場合に物事を見つける場所を思い出すのに役立ちますが、そのためには一貫性がポリシーの選択よりも重要です。

18
Kilian Foth

特定の質問に JUnit規約、 は、アプリケーションクラス(Foo1.JavaFoo2.Java)およびJUnitテストクラス(Foo1Test.JavaFoo2Test.Java)。

とはいえ、使用される可能性のあるすべての組織的なスキームに対するユニットテストの精神/目標の重要性に関するキリアンの強調に全面的に同意します。いくつかの規則を選択し、ほとんどの場合は規則を守りますが、規則が正当な場合は、規則の例外を厳格に許可します。

9
0xb304

メソッドごとに個別のクラスを用意するほうがいいですか、それとも実際のクラスごとにテストクラスを1つだけ持つほうがいいですか

1つのクラスのメソッドに対して個別のテストクラスを作成する必要がある場合、設計が間違っています。メソッドは小さく、読みやすく、テストしやすく、変更しやすいものでなければなりません。テストデータの作成、モックなどにより、テストは元のコードより少し長くなる可能性がありますが、大幅に長くなることはありません。もしそうなら、テスト対象のクラスは複雑すぎて、確かに複数のことを行います(単一責任の原則):デザインに取り組みます。

4
Thomas Junk

通常、「メソッドごとに1つのテストクラス」と「クラスごとに1つのテストクラス」の両方が極端すぎると思います。

一般に、テストメソッド/ユニットテストごとに1つのチェックが必要です。たとえば、これらはlist.isEmpty = trueおよびlist.Length = 0、つまり、動作ごとに1つのテストメソッド/単体テスト。

これにより、動作を説明するテストメソッド名を簡単に作成できます。テストメソッドをテストクラスにグループ化するため、test classname.test method、 それは理にかなっている。通常、これらには共有セットアップコードがあり、テストセットアップ/フィクスチャに簡単に配置できます。テスト中のクラスに応じて、これはクラス全体の1つのテストクラスになることも、1つのメソッドの1つのテストクラスになることもあります。しかし、通常は、その中間になるでしょう。

通常のコードと同様に、テストをできるだけ読みやすくしたいとします。私に役立つのは、テストコードを整理するためのBDDの「いつ」か「いつ」か「アサートとアサート」というアサートスタイルに従うことです。テストクラスはそれを与えられているかもしれません、それはセットアップです。次に、そのクラスのすべてのテストメソッドは、指定された(またはその一部)を使用し、1つは1つ、1つは1つです。

単体テストは、テスト中のクラスの機能の使用方法に関するドキュメントとしても考えてください。優れた単体テストを使用すると、テストを読んで、使用するクラスの機能の使用方法と、その効果が正確にわかるようになります。

何かが壊れて単体テストが失敗した場合、何が壊れているかをできるだけ簡単に理解できるようにしたいのですが、テストごとに1つのアサーションが役立ちます。 1つのテストに複数のアサーションがある場合、最初のアサーションのみが失敗し、その後メソッドが終了するため、最初のアサーションが失敗した原因を修正するまで、次のテストでテストされた他の動作も壊れているかどうかはわかりません。 1つのアサーションで、他のすべてのテストメソッドが実行され、失敗の深さを理解する方がはるかに速くなります。

もちろん、私はKilian Fothに同意します。実際には、作業しているコードのユニットテストをいくつか実行できるのは幸運です。そして、小さなローカライズされたテストは、テストをまったく行わないよりも優れています。または、ビルドサーバーで実行される大きな統合テストのみに長い時間がかかり、通常はあまりローカライズされていません(エラーがどこにあるかをすばやく通知しません-あなた少し作業する必要があります)。

2
Emile Vrijdags

各クラスにテストクラスがあるのは正しいと思います。アイデアは、ターゲットクラスに関連するすべての単体テストを単一のテストクラスに集中させることです。次に、たとえば、MyClass.JavaにはMyClassTest.Javaというテストクラスがあります。

1
Jesús Castro

また、社内でのテスト方法に関するドキュメントがあるかどうか、または同僚がフォローしている方法について同僚に尋ねることもお勧めです。それらのガイドラインに従うと、他の人がテストを読みやすくなります。

0
Sae1962