TestNG에서 각 <테스트>에 대한 지연 시간 설정
먼저 정보로 : 나는 각각 @Test
을 다른 클래스에 넣습니다 (물론 각 클래스에는 하나의 @Test
주석 만 있습니다 ).
실제로 내 목표는 다른 매개 변수로 동일한 클래스를 다시 실행하는 것이지만 먼저 다른 클래스를 먼저 실행하고 싶습니다.
TestNG 가 하나의 클래스 또는 @Test
메서드 주석의 반복을 허용하지 않는 많은 참조를 찾으려고 노력했습니다 <test>
. 제공된 반복은 invocationCount
함수입니다.에 대해 invocationCount
알지만 invocationCount
이 함수 @Test
가 동시에 a 를 반복 한 다음 다른을 실행할 수 있기 때문에 목표를 달성 할 수 없습니다 @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>
그러나 위의 구성은 두 번째 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와 명령 줄을 통해 두 가지 방법으로 실행을 시도했으며이 지연 문제에 대해 동일한 결과를 제공합니다.
이 명령을 사용하는 명령 줄을 통해 :
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 속성을 사용하면이 실행에 할당 할 스레드 수를 지정할 수 있습니다.