1

私はtestngを試しています。私の目標は、いくつかのクラスにテストメソッドを用意し、別のクラスに一連のテストを準備してまとめるための「サポート」メソッドを用意することです。

もう1つの要件は、テストスイートでは、複数のテストパーツに対してサポートメソッドを呼び出す必要があることです。たとえば、testAとtestBを含む最初の部分と、testCとtestDを含む2番目の部分です。これにより、次の手順が実行されます。

support1、testA、testB、support2、support1、testC、testD、support2

(部分的に)機能した私の最初のアプローチは、すべてのメソッドに注釈を付け@Test、グループを使用し、グループ間の依存関係を定義することでした。たとえば、テストメソッドはグループ「setUp」に依存します。これは、上記の例の1つのサポートメソッド「support1」のグループです。 。

このアプローチの問題は、サポートするメソッドがテストとしてカウントされるため、生成されたレポートに誤った数の「実際の」テストが表示されることです。

次のアイデアは、とを使用@BeforeGroups@AfterGroups、サポートメソッドをグループに入れ、グループの依存関係を使用することでした。サポートするメソッドは、もはやテストとしてカウントされるべきではありません。しかし、私は最初から立ち往生しています。たとえば、私は試しました

@BeforeGroups (groups = {"setUp"})

クラスのセットアップメソッドの場合Support、および

@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })

「実際の」テストクラスで。これにより、次の(単純化された)エラーが発生します。

[testng] DependencyMap::Method "TestClass.testSomething()[...]" depends on nonexistent group "setUp"

グループ「setUp」が存在しないのはなぜですか?私は何かを見落としましたか?

または、機能する別のアプローチはありますか?

ご協力いただきありがとうございます!

編集: テストはAntで開始され、次のようなtestng.xmlを使用します。

<test name="TestA">
    <groups>
        <run>
            <include name="setUp" />
            <include name="TestA"/>
            <include name="tearDown"/>
        </run>
    </groups>
    <classes>
        <class name="seleniumtest.test.technical.Support"/>
        <class name="seleniumtest.test.business.TestClassA"/>
    </classes>
</test>
<test name="TestB">
    <groups>
        <run>
            <include name="setUp" />
            <include name="TestB"/>
            <include name="tearDown"/>
        </run>
    </groups>
    <classes>
        <class name="seleniumtest.test.technical.Support"/>
        <class name="seleniumtest.test.business.TestClassB"/>
    </classes>
</test>
4

3 に答える 3

4

グリッチが発生しました!!

問題は注釈にあります

@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })

setUp基本的に、エラーメッセージは、グループ名が!!の@Testメソッドがないことを伝えようとしています。あなたの質問に来ると、解決策は以下のようにテストメソッドのアノテーションを変更することです

 @Test(groups = { "TestA" })

そして、サポートメソッドでアノテーションを変更します

  @BeforeGroups (groups = {"TestA"})

この設定でサンプル例を実行しました

public class TestSupport {

    @BeforeGroups(groups = { "sample","sample1" })
    public void beforeTest() {
        System.out.println("Before test");
    }

    @AfterGroups(groups = { "sample","sample1" })
    public void afterTest() {
        System.out.println("after test");
    }

}

そして私のテストクラスで

public class TestClassA {

    @Test(groups = { "sample" })
    public void superTestA() {
        System.out.println("This is the actual test");
    }

    @Test(groups = { "sample" })
    public void superTestB() {
        System.out.println("This is the another test under sample group");
    }

    @Test(groups = { "sample1" })
    public void superTest() {
        System.out.println("This is another test");
    }
}

以下に示すように私のtestng.xml

<test name="sampletest" >
     <groups>
        <run>
            <include name="sample" />
            <include name="sample1" />

        </run>
    </groups>
    <classes>
        <class name="test.global.testng.TestClassA"/>
        <class name="test.global.testng.TestSupport"/>
    </classes>

  </test>

これがテストの実行方法です:beforeGroups-> superTestA/superTestB ->afterGroupsそしてbeforeGroups-> superTest -> afterGroups終了します

于 2012-07-17T11:29:38.317 に答える
2

私は私が望んでいた解決策を思いついたと思います。

私が使用する必要があるのは、サポートクラスでそれぞれ@BeforeTest@AfterTestの代わりに@BeforeGroupsとです。@AfterGroups

@BeforeTest(groups = {"setUp"})
public void beforeTest() {[...]}

@AfterTest( groups = {"tearDown"})
public void afterTest() {[...]}

テストクラスでは:

@Test(groups = { "TestA" })
public void testSomething() {[...]}

dependsOnGroupsパットンのアプローチのように、それはなくなった。

testng.xmlは、私の質問と比較して変更されていません。つまり、Javaコードを変更することなく、 testng.xmlファイルでテストを構成できます。

さらに、このソリューションは、少なくともPatton(@Patton私はあなたを怒らせるつもりはありません)が想定しているように、BeforeGroupsアプローチの別の問題も取り除きます。beforeTest()後者の場合、メソッドはどのグループよりも前に実行されるため、複数のテストグループを使用したテストは意図したとおりに実行されません。たとえば、次のテスト(testng.xmlの抽出)がある場合:

    <groups>
        <run>
            <include name="TestA"/>
            <include name="TestB"/>
        </run>
    </groups>

...実行の結果のステップは次のとおりです:
beforeTest()、TestA、beforeTest()、TestB、afterTest()。

BeforeTestでソリューションを使用すると、次のテストが行​​われます。

    <groups>
        <run>
            <include name="setUp" />
            <include name="TestA"/>
            <include name="TestB"/>
            <include name="tearDown"/>
        </run>
    </groups>

...実行の結果のステップは次のとおりです:
setUp = beforeTest()、TestA、TestB、tearDown = afterTest()。

于 2012-07-17T14:02:19.520 に答える
0
package com.test.MySample;

import org.testng.annotations.*; 

public class TestNGTest1 {    

    @BeforeTest   
    public void BeforeTest() {         
        System.out.println("@BeforeTest");
    }

    @BeforeClass    
    public void BeforeClass() {         
        System.out.println("@BeforeClass");
    }      

    @BeforeGroups  (groups = {"My group"}) 
    public void BeforeGroups() {       
        System.out.println("@BeforeGroups");
    }

    @BeforeGroups  (groups = {"My group1"}) 
    public void BeforeGroups1() {       
        System.out.println("@BeforeGroups1");
    }

    @AfterGroups  (groups = {"My group1"}) 
    public void AfterGroups1() {       
        System.out.println("@AfterGroups1");
    }

    @BeforeMethod    
    public void BeforeMethod() {         
        System.out.println("@BeforeMethod");     
    } 

    @Test(groups = {"My group"})     
    public void test1() {         
        System.out.println("test1");     
    } 

    @Test (groups = {"My group", "My group1"})    
    public void test2() {         
        System.out.println("test2");     
    }

    @AfterMethod    
    public void AfterMethod() {         
        System.out.println("@AfterMethod");     
    } 

    @AfterGroups  (groups = {"My group"}) 
    public void AfterGroups() {       
        System.out.println("@AfterGroups");
    }

    @AfterClass    
    public void AfterClass() {         
        System.out.println("@AfterClass");
    }  

    @AfterTest   
    public void AfterTest() {         
        System.out.println("@AfterTest");
    }
} 
于 2013-08-15T14:21:01.873 に答える