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を慎む
コード
    
    @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がグループ管理の面で混乱していると感じて、公式のドキュメントもよく説明していません.なるべく慎みましょう・・・