web-dev-qa-db-ja.com

JUnit 5で@TestInstanceアノテーションはどのように使用されますか?

@TestInstanceアノテーションの簡単な説明と、それがJUnit 5でどのように役立つかを教えてください。

おそらくフィールドをstaticにすることで同じ効果を達成できると思います。

13
Mahozad

ドキュメント は有用な要約を提供すると思います:

JUnit Jupiterが同じテストインスタンスですべてのテストメソッドを実行することを希望する場合は、テストクラスに@TestInstance(Lifecycle.PER_CLASS)の注釈を付けるだけです。このモードを使用すると、新しいテストインスタンスがテストクラスごとに1回作成されます。したがって、テストメソッドがインスタンス変数に保存された状態に依存している場合、@ BeforeEachまたは@AfterEachメソッドでその状態をリセットする必要があります。

「クラスごと」モードには、デフォルトの「メソッドごと」モードに比べていくつかの追加の利点があります。具体的には、「クラスごと」モードでは、非静的メソッドとインターフェイスのデフォルトメソッドで@BeforeAllと@AfterAllを宣言することが可能になります。したがって、「クラスごと」モードでは、@ Nestedテストクラスで@BeforeAllおよび@AfterAllメソッドを使用することもできます。

しかし、あなたはおそらくすでに読んでおり、フィールドを静的にすることは、フィールドをインスタンス変数として宣言し、@TestInstance(Lifecycle.PER_CLASS)を使用するのと同じ効果があると考えるのは正しいでしょう。

したがって、「JUnit 5でどのように役立つか」という質問に対する答えは、おそらく@TestInstance ...

  • あなたの意図について明示的です。 staticキーワードの使用は偶然であるのに対し、@TestInstanceは偶発的である可能性が低いか、コピーアンドペーストの結果です。
  • スコープとライフサイクルを管理する責任を委任し、フレームワークにクリーンアップするのではなく、自分で管理する必要があります。
11
glytching

この注釈は、単体テストの実行時に作成されるオブジェクトの数を減らすために導入されました。

@TestInstance(TestInstance.Lifecycle.PER_CLASS)をテストクラスに追加すると、クラスのすべてのテストに対してクラスの新しいインスタンスが作成されることを回避できます。これは、同じテストクラスに多くのテストがあり、このクラスのインスタンス化が高価な場合に特に役立ちます。

この注釈は注意して使用する必要があります。すべての単体テストは分離され、互いに独立している必要があります。テストの1つが状態odテストクラスを変更する場合、この機能は使用しないでください。

同じ効果を得るためにフィールドを静的にすることは良い考えではありません。実際に作成されるオブジェクトの数は減りますが、テストクラスのすべてのテストが実行されたときにそれらをクリーンアップすることはできません。これは、巨大なテストスイートがある場合に問題を引き起こす可能性があります。

5
dyVeloper

@TestInstance は、注釈付きテストクラスまたはテストインターフェイスのテストインスタンスのライフサイクルを構成するために使用されます

  • PER_CLASS :テストクラスごとに1回、新しいテストインスタンスが作成されます。
  • PER_METHOD :各テストメソッド、テストファクトリメソッド、またはテストテンプレートメソッドごとに新しいテストインスタンスが作成されます。このモードは、JUnitバージョン1〜4で見られる動作に似ています。

@TestInstance がテストクラスまたはテストクラスによって実装されたテストインターフェイスで明示的に宣言されていない場合、ライフサイクルモードは暗黙的にデフォルトの PER_METHOD になります。 =。


テストインスタンスのライフサイクルモードを PER_CLASS に設定すると、次の機能が有効になります。

  • 特定のテストクラスのテストメソッド間、およびテストクラスの非静的@BeforeAllメソッドと@AfterAllメソッド間で共有されるテストインスタンスの状態。
  • @BeforeAllテストクラスの@AfterAllおよび@Nestedメソッドの宣言。
  • インターフェイスのデフォルトメソッドでの@BeforeAllおよび@AfterAllの宣言。
  • Kotlinプログラミング言語で実装されたテストクラスの@BeforeAllおよび@AfterAllメソッドの簡易宣言。

詳細については、 test instance lifecycle documentationをご覧ください。

4
cassiomolin