TestNGのグループ管理
1.Groupの実行順序.
グループのTestを実行する場合は、@BeforeClass->@BeforeGroup->@Test->@AfterGroups->@AfterClassの順で実行されます.
GroupsがTest 1とTest 2の2つのクラスのように複数のクラスに分布している場合は、次のようになります.
Test1.@BeforeClass->
@BeforeGroups->Test1.@Test->Test1.@AfterClass->
Test2.@BeforeClass->Test2.@Test->
@AfterGroups->Test2.@AfterClass
なお、@BeforeClass、@AfterClassが実行するGroupsに属すると宣言しない場合、@BeforeClass、@AfterClassは実行されません.
2.グループが複数ある場合は、BeforeGroup、AfterGroupsを慎む
コード
このような場合、実行がグループを指定しない、つまり全グループを実行する場合、beforeGroupは2回(2つのグループが実行される前、後に1回ずつ)実行され、AfterGroupは1回しか実行されません(どういうわけか分かりません).beforeGroupを最初のグループの実行前に1回だけ実行させるには、afterGroupを最後のグループの実行が完了した後に1回実行するには、静的変数で実行回数を記録する小さなテクニックを使用します.次のようになります.
以上は一つのケースにすぎませんが、グループが複数のクラスに分布していると、状況が異なる可能性があります.まだよく研究されていません.
私はいつもTestNGがグループ管理の面で混乱していると感じて、公式のドキュメントもよく説明していません.なるべく慎みましょう・・・
グループのTestを実行する場合は、@BeforeClass->@BeforeGroup->@Test->@AfterGroups->@AfterClassの順で実行されます.
GroupsがTest 1とTest 2の2つのクラスのように複数のクラスに分布している場合は、次のようになります.
Test1.@BeforeClass->
@BeforeGroups->Test1.@Test->Test1.@AfterClass->
Test2.@BeforeClass->Test2.@Test->
@AfterGroups->Test2.@AfterClass
なお、@BeforeClass、@AfterClassが実行するGroupsに属すると宣言しない場合、@BeforeClass、@AfterClassは実行されません.
2.グループが複数ある場合は、BeforeGroup、AfterGroupsを慎む
コード
@BeforeGroups(groups = { "function", "smoketest" })
public void beforeGroup() {
//something
}
@AfterGroups(groups = { "function", "smoketest" })
public void afterGroup() {
//do something
}
@Test(groups = { "function" })
public void testMethod2() {
//do something
}
@Test(groups = { "smoketest","function" })
public void testMethod2() {
//do something
}
このような場合、実行がグループを指定しない、つまり全グループを実行する場合、beforeGroupは2回(2つのグループが実行される前、後に1回ずつ)実行され、AfterGroupは1回しか実行されません(どういうわけか分かりません).beforeGroupを最初のグループの実行前に1回だけ実行させるには、afterGroupを最後のグループの実行が完了した後に1回実行するには、静的変数で実行回数を記録する小さなテクニックを使用します.次のようになります.
private static int runNum=0;
@BeforeGroups(groups = { "function", "smoketest" })
public void beforeGroup() {
if (runNum == 0) {
runNum++;
//do something
}else{
runNum++;
}
}
@AfterGroups(groups = { "function", "smoketest" })
public void afterGroup() {
//do something
}
以上は一つのケースにすぎませんが、グループが複数のクラスに分布していると、状況が異なる可能性があります.まだよく研究されていません.
私はいつもTestNGがグループ管理の面で混乱していると感じて、公式のドキュメントもよく説明していません.なるべく慎みましょう・・・