2017-02-22 3 views
2

私はグループと同様に方法でフィルタリングされたテストを実行するのが好きです。それはTestNGで可能ですか?方法とグループによるTestNGの実行

たとえば、私は以下の2つのTestNGクラスを持っています。

Class - SampleJ1 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 
Class - SampleJ2 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 

私のオートメーションフレームワークはTestNG XMLファイルを生成します。下のデータでXMLファイルを作成すると、上記の方法の健全性グループのみが実行されます。

<groups> 
    <run> 
    <include name="sanity" /> 
    </run> 
</groups> 
<test thread-count="12" name="Browser"> 
    <classes> 
    <class name="SampleJ1"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    <class name="SampleJ2"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    </classes> 
</test> 

可能であれば教えてください。

+0

予想される動作は何ですか?現在のスイートファイルにはすべてが含まれているため、すべてが実行されます。 – juherr

+0

実際には、私が組み込んだ方法を実行します。または、私が言及したグループを実行します。私の質問は、両方を混在させる方法はありますか?この例では、私が含まれているメソッドのためのグループサニティだけを実行するのが好きです。 – Jeyabal

+0

@Jeyabal、Mavenを使用しますか? –

答えて

0

あなたが所属する名前とグループによってテストメソッドを実行するようフィルタリングしたいと思う限り、 まず、純粋なTestNGに特別な解決策はありません(そうしなければ、@juherrのようなTestNGの専門家が答えたでしょう)。 InvokedMethodListenerの実装でテストメソッドをスキップすると、望ましくないログが残ります。

2つのオプションがあります。

Set<Method>またはSet<String>でテストクラスをインスタンス化できる@Factoryメソッドをコンストラクタのパラメータとして実装できます。それぞれのテストクラスでは、実行するメソッド(またはそのString表現)がSetにあるかどうかをチェックします。 @Before注釈付きメソッドまたはbeforeInvocationメソッドは、指定されたメソッドが実行されるかどうかにかかわらずロジックを処理します。さらに、testng.xmlは、実行する要素を<groups>と指定します。この場合も、Skipped: xをログとレポートに残すという欠点があります。

2番目のオプションは、MavenとそのSurefire Pluginをうまく活用することです。 (GradleやMavenのようなビルドツールを使用していない場合は、試してみてください)。 Mavenでテストするときには、実行するグ​​ループとテストメソッドを指定できます。 あなたpom.xmlは、以下のような非常にする必要があります:あなたのtestng.xmlあなたがグループを実行している、情報を置くことができるで

public class TestClass { 

    @Test(groups = {"firstGroup"}) 
    public void firstMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void secondMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void thirdMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void fourthMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 
} 

<!-- modelVersion, groupId, etc. --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
      <configuration> 
       <suiteXmlFiles> 
        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> 
       </suiteXmlFiles> 
      </configuration> 
     </plugin> 
     <!-- (...) --> 
    </plugins> 
    <!-- (...) --> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.10</version> 
    </dependency> 
    <!-- (...) --> 
</dependencies> 

言って、あなたはそのようなテストクラスを持っています

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Default Suite Name"> 
    <groups> 
     <run> 
      <include name="secondGroup"/> 
     </run> 
    </groups> 
    <test name="Default Test Name"> 
     <classes> 
      <class name="TestClass"/> 
     </classes> 
    </test> 
</suite> 

次に、実行する方法を決定するMavenの目標を実行します。

mvn clean -Dtest=TestClass#thirdMethod+secondMethod test 

複数のメソッドと複数のクラスの構文はhereです。
出力:

Running TestClass 
secondMethod 
thirdMethod 
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

第四の方法は、それがsecondGroupに属していても、実行されていません。 実行するメソッドがたくさんある場合は、カスタムbashスクリプトを記述することができます。

MavenのグループとTestNGのメソッドをフィルタリングすることはできませんでした(少なくとも私にとって)。

+0

このような詳細な説明に感謝します。 – Jeyabal

関連する問題