Closed1

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

KanonKanon

@TestInstance(TestInstance.Lifecycle.PER_CLASS)は、JUnit 5(Jupiter)で使用されるアノテーションで、テストクラスのインスタンス生成に関するライフサイクルを制御します。

意味と効果

TestInstance.Lifecycle.PER_CLASS

デフォルトでは、JUnit 5はテストメソッドごとに新しいインスタンスを生成します。このライフサイクルはTestInstance.Lifecycle.PER_METHODと呼ばれます。しかし、@TestInstance(TestInstance.Lifecycle.PER_CLASS)を使用すると、テストクラス全体で1つのインスタンスのみが生成され、そのインスタンスがすべてのテストメソッドで共有されます。

具体的には、以下の効果があります:

  1. インスタンスの再利用:

    • テストクラス全体で1つのインスタンスが生成され、そのインスタンスがすべてのテストメソッドで共有されます。これにより、フィールドを使って状態を保持することができます。
  2. コンストラクタの呼び出し:

    • テストクラスのコンストラクタはクラスのインスタンスが生成されるときに一度だけ呼び出されます。
  3. @BeforeAll@AfterAllのインスタンスメソッド化:

    • @BeforeAllおよび@AfterAllアノテーションを付けたメソッドは、デフォルトではstaticでなければなりませんが、PER_CLASSライフサイクルを使用することで、インスタンスメソッドとして定義できます。

使用例

以下に具体的な例を示します:

import org.junit.jupiter.api.*

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTests {

    private var count = 0

    @BeforeAll
    fun setupAll() {
        println("Before all tests")
    }

    @BeforeEach
    fun setup() {
        count++
        println("Before each test: count = $count")
    }

    @Test
    fun test1() {
        println("Test 1: count = $count")
        assertEquals(1, count)
    }

    @Test
    fun test2() {
        println("Test 2: count = $count")
        assertEquals(2, count)
    }

    @AfterAll
    fun tearDownAll() {
        println("After all tests")
    }
}

出力結果の解説

この例では、PER_CLASSライフサイクルが設定されているため、テストクラスMyTestsのインスタンスは1回だけ生成され、すべてのテストメソッドで共有されます。

  1. @BeforeAllメソッドが最初に一度だけ呼び出されます。
  2. @BeforeEachメソッドは各テストメソッドの前に呼び出され、countフィールドをインクリメントします。
  3. 各テストメソッドでは、共有されたcountフィールドの値を確認します。
  4. @AfterAllメソッドが最後に一度だけ呼び出されます。

出力結果は以下のようになります:

Before all tests
Before each test: count = 1
Test 1: count = 1
Before each test: count = 2
Test 2: count = 2
After all tests

まとめ

  • @TestInstance(TestInstance.Lifecycle.PER_CLASS)を使用すると、テストクラス全体で1つのインスタンスのみが生成され、各テストメソッドで共有されます。
  • これにより、インスタンスフィールドを使って状態を保持したり、@BeforeAllおよび@AfterAllメソッドをインスタンスメソッドとして定義することができます。
  • このライフサイクルを使用することで、テストコードがより簡潔になり、特定のシナリオ(例えば、状態を共有する必要があるテスト)に対して便利です。
このスクラップは27日前にクローズされました