TestNGの各<test>の遅延時間を設定します
まず情報として:私はそれぞれ@Test
を異なるクラスに入れました(もちろん、各クラスには1つの@Test
注釈しかありません)。
実際、私の目標は、同じクラスを異なるパラメーターで再実行することですが、事前に別のクラスを最初に実行したいと思います。
TestNGが@Test
1つのクラスまたはメソッドアノテーションの繰り返しを許可しない多くの参照を見つけようとしました<test>
。提供されているリピートはinvocationCount
関数ですが、この関数が同時に繰り返されinvocationCount
てinvocationCount
から@Test
別のを実行できるため、目標を達成できません@Test
。
public class SimpleTest1 {
@Test
@Parameters({"acc"})
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleTest2 {
@Test
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
私は以下の構成のように実行することを想像します:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
しかし、2番目の構成SimpleTest1
が実行されなかったため、上記の構成は計画どおりに進みませんでした。
次に<test>
、以下と成功のように別々に実行してみましたが、それぞれの遅延時間に関する新しい問題に直面しています<test>
。
<test>
次のように、複数のシリアル(並列ではない)を実行します。
<suite name="Suite">
<test name="My Test1" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
</classes>
</test>
<test name="My Test2" >
<classes>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
</classes>
</test>
<test name="My Test3" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
TestNG Mavenの依存関係:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
確実な:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
IDE: Eclipse(バージョン:2018-09(4.9.0))
OS: macOS Mojave(バージョン10.14.6)
出力:
[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57
===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================
ただし、最初のテスト<test>
が終了した後、次の<test>
実行と次のテストの前に約10秒の遅延があります。
注:これはIDE(私はEclipseを使用しています)の問題だと思いましたが、そうではありませんでした。IDEとコマンドラインの2つの方法で実行してみましたが、この遅延の問題について同じ結果が得られました。
このコマンドを使用してコマンドライン経由:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
上記の遅延時間を短縮するための構成はありますか?
回答
まず、スイートはテスト計画ではなく(ところで、優れた機能要求になる可能性があります)、テストを選択するための単なる方法です。これは、テスト間の依存関係を定義できないことを意味します。そのため、同じテストクラスを使用しても機能しません(失敗するか、異なるインスタンスが作成されるはずです)。
私はあなたのニーズを理解しているので、最善の方法は、独自のロジックとそのテストフレームワークとの統合を分離することです。
- 必要に応じてヘルパー/フィクスチャクラスを設計します。
_
public class SimpleClass1 {
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleClass2 {
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
- テストフレームワークと統合するためのクラスを定義する
_
public class SimpleTest {
@Test
@Parameters({"acc"})
public void step1(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
@Test(dependsOnMethods = {"step1"})
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void step2(String senderAcc, String beneficiaryAcc, String amount) {
(new SimpleClass2()).transfer(acc);
}
@Test(dependsOnMethods = {"step2"})
@Parameters({"acc"})
public void step3(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
}
そして、期待されるパラメータを備えたスイート:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest">
<methods>
<include name="step1">
<parameter name="acc" value="11111"></parameter>
</methods>
<methods>
<include name="step2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</methods>
<methods>
<include name="step3">
<parameter name="acc" value="22222"></parameter>
</methods>
</class>
</classes>
</test>
</suite>
(免責事項:私はdtdに対してXMLをチェックしませんでした、間違っている可能性がありますが、あなたは考えを持っています)
器具の命名または作成方法は、独自の規則によって異なります。
ここで説明するように、アノテーションを使用して他のメソッドに優先度または依存関係を設定できます。
https://testng.org/doc/documentation-main.html#annotations
@ Test.priorityまたは@ Test.dependsOnMethodsを確認してください
これを行うと、テストを次々に連続して実行できるようになります。
私はあなたが別のテストで同じテストクラスを実行する必要がある理由を知りませんが、テストを開始するとき、それは多分時間がかかるし、多分テスト終了後に、それはいくつかのリソースをクローズする必要があり、すべての関連するコンテキストをロードすることができ、両方は時間がかかることがあります/数秒
詳細を使用して、遅延の原因の詳細を使用できます(また、ログを追加してタイミングを表示できます)
<suite name="Suite" verbose="10">
詳細レベルは0〜10で、10が最も詳細です。10に設定すると、コンソール出力にテスト、メソッド、リスナーなどに関する情報が含まれることがわかります。
プロセスを高速化するために、TestNGの並列機能を使用することもできます
threadPoolSize属性を使用すると、この実行に割り当てるスレッドの数を指定できます。