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


13

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

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

回答:


19

テストをどのように構成するかは、テストを行うことの重要性と比較してかなり重要ではありません。

優れたテストスイートで最も重要なことは、すべての機能を網羅していることです。これにより、リグレッションの欠陥が導入されるたびに、すぐに気付くことができます。メソッドごとに1つのテストを書くか、メソッドの入力値の組み合わせごとに1つのテストを書くか、そのメソッド内の可能なコードパスごとに1つのテストを書くかはそれほど重要ではありません。これらのテストを少数または多数のテストクラスに編成するかどうかはさらに重要ではありません。テストスイートは常に完全に成功する必要があるため、17のテストのうち3つまたは2つのうちの1つが失敗するかどうかは関係ありません。修繕。

もちろん、テストコードもコードであるため、保守やモジュール化などの通常のベストプラクティスに従う必要があります。ただし、テストクラスとテストクラスの関係ではなく、テストスイート自体の保守性によって決定する必要があります。彼らがテストするクラス。言及したポリシーはどちらも、一貫して従えば、どこにあるかを思い出すのに役立ちますが、そのためにはポリシーの選択よりも一貫性が重要です。


9

特定の質問に対して、JUnitの規則は、アプリケーションクラス(Foo1.javaFoo2.java)とJUnitテストクラス(Foo1Test.javaFoo2Test.java)を1対1で対応させることです。

そうは言っても、使用される可能性のある組織スキームよりも単体テストの精神/目標の重要性を強調したKilianの意見に心から同意します。いくつかの規則を選んで、ほとんどの場合それらを守ります。ただし、必要に応じて、規則の例外を慎重に許可します。


4

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

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


2

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

一般に、テストメソッド/ユニットテストごとに1つのチェックが必要です。たとえば、これらはlist.isEmpty = trueおよびをチェックする複数のアサーションである可能性があるlist.Length = 0ため、動作ごとに1つのテストメソッド/ユニットテストを実行します。

これにより、動作を説明するテストメソッド名を簡単に見つけることができます。テストメソッドをテストクラスにグループ化したいので、を読むときにtest classname.test method意味があります。通常、それらには、テストセットアップ/フィクスチャに簡単に入力できる共有セットアップコードがあります。テスト対象のクラスに応じて、これはクラス全体に対して1つのテストクラスになり、1つのメソッドに対して1つのテストクラスになることもあります。しかし、通常、それは中間のどこかになります。

通常のコードと同様に、テストはできるだけ読みやすくする必要があります。私に役立つのは、テストコードを整理するBDDの指定時またはアレンジアクトアサートスタイルに従うことです。テストクラスにはそれを指定できます。セットアップです。次に、そのクラスのすべてのテストメソッドは、指定されたもの(またはその一部)を使用し、いつか1つを持ちます。

単体テストは、テスト対象のクラスの機能を使用する方法に関するドキュメントとしても考えてください。優れた単体テストを使用すると、テストを読んで、使用するクラスの機能を使用する方法と、正確な効果を調べることができます。

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

もちろん、Kilian Fothに同意します。実際には、作業中のコードに対していくつかの単体テストを行うことができます。そして、小さなローカライズされたテストは、テストをまったく行わないよりも優れているか、ビルドサーバーで実行される大きな統合テストのみに多くの時間がかかり、通常はあまりローカライズされていません少し作業する必要があります)。


良い点:「testclassname.testmethodを読むときに意味があるように、testmethodsでtestmethodsをグループ化したい」。
MAChitgarha

1

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.