2

私の目標は、各テスト メソッドの後に javax.persistence.EntityManager を clear() することです。

テスト クラスの例を次に示します。

public class Example
{
    @Test(dataProvider = "sampleDataProvider")
    public void testA(String parameter)
    {
        System.out.println(parameter);
    }

    @Test(dataProvider = "sampleDataProvider")
    public void testB(String parameter)
    {
        System.out.println(parameter);
    }
}

entityManager は、DB にテスト データを照会することによって、dataProvider "sampleDataProvider" で使用されます。テスト データは、次の形式でコンパイルされますnew Object[2][1]。データのクエリとコンパイルはすべて、テスト メソッド (@DataProvider で注釈を付けたもの) が実際に実行される前に行われ、文字列だけでなくエンティティを実際にクエリしていることに注意してください。

上記のテスト クラスは次のように実行されます。

testA("some queried entity 1")
testA("some queried entity 2")
testB("some queried entity 1")
testB("some queried entity 2")

私の最初の解決策は、@AfterTest注釈を使用して entityManager をクリアすることでした。ただし"some queried entity 2"、 の 2 回目の実行 (または 2 回目のテスト インスタンス) の前に entityManager から切り離さtestAtestB、 のメンバーへの読み取り/書き込み操作で問題が発生します"some queried entity 2"

私の目標は、テスト メソッドの後に entityManager をクリアすることであり、必ずしもテスト メソッドのすべてのインスタンスの後であるとは限りません。

TestNG は、次に実行されるテストを知ることを可能にしますか? そうすれば、次のテストが新しいテストである場合、entityManager を簡単にクリアできます。

他の推奨事項はありますか?

4

1 に答える 1

0

次のテストメソッドを取得する簡単な方法がわかりません。ところで、@AfterGroups アノテーションを使用して同じ結果を得ることができます。

@Test(groups = {"groupA"})
public void testA(...) { ... }

@Test(groups = {"groupB"})
public void testB(...) { ... }

@AfterGroups(groups = {"groupA"})
public void afterGroupA() {
    // clear entity manager here
}

テストの開始順序は、@Test アノテーションの dependsOnMethods または dependsOnGroups パラメーター、または testng.xml ファイルのタグの「preserve-order」属性で明示的に指定するまで、TestNG によって保証されないことに注意してください。

アップデート

別の方法として、独自のTestListinerを使用できます。必要に応じて、クリアを行うonTestStart()メソッドを実装できます。AFAIU、呼び出されたテストメソッドは、部分的に埋められた ITestResult で利用できます。ところで、注意してください - これは、暗黙的なテスト ロジックによって引き起こされる問題につながる可能性があります (クリアはテスト コードからは見えません)。

于 2011-01-18T05:49:31.870 に答える