TestNG에서 각 <테스트>에 대한 지연 시간 설정

Dec 14 2020

먼저 정보로 : 나는 각각 @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

위의 지연 시간을 줄이기위한 구성이 있습니까?

답변

2 juherr Dec 23 2020 at 19:36

첫째, 스위트는 테스트 계획이 아니라 (좋은 기능 요청 일 수 있음) 테스트를 선택하는 방법 일뿐입니다. 이는 테스트간에 종속성을 정의 할 수 없음을 의미합니다. 이것이 동일한 테스트 클래스가 작동하지 않는 이유입니다 (실패하거나 다른 인스턴스를 만들어야 함).

귀하의 요구를 이해하고 있으므로 가장 좋은 방법은 자체 로직과 테스트 프레임 워크와의 통합을 분리하는 것입니다.

  1. 원하는대로 도우미 / 픽스처 클래스를 디자인합니다.

_

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()));
  }
}
  1. 테스트 프레임 워크와의 통합을위한 클래스 정의

_

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을 확인하지 않았으며 잘못되었을 수 있지만 아이디어가 있습니다)

픽스쳐를 만드는 이름이나 방법은 자신의 규칙에 따라 다릅니다.

1 vbn Dec 16 2020 at 15:36

여기에 설명 된대로 주석을 사용하여 다른 방법에 대한 우선 순위 또는 종속성을 설정할 수 있습니다.

https://testng.org/doc/documentation-main.html#annotations

@ Test.priority 또는 @ Test.dependsOnMethods 확인

이렇게하면 연속적으로 테스트를 차례로 실행할 수 있습니다.

1 user7294900 Dec 22 2020 at 16:22

난 당신이 별도의 테스트에서 동일한 테스트 클래스를 실행하는 데 필요한 이유를 모르겠지만, 테스트를 시작할 때 어쩌면 시간이 걸릴 어쩌면 시험 종료 후는 일부 리소스를 종료해야 할 수도 있습니다 모든 관련 컨텍스트를로드 할 수 있습니다, 모두 시간이 걸릴 수 있습니다 / 몇 초

자세한 정보 를 사용하여 지연 원인에 대한 자세한 정보 를 사용할 수 있습니다 (시간을보기 위해 로그를 더 추가).

<suite name="Suite" verbose="10">

상세 수준은 0에서 10까지이며 10이 가장 자세합니다. 10으로 설정하면 콘솔 출력에 테스트, 메서드 및 리스너 등에 관한 정보가 포함되는 것을 볼 수 있습니다.

프로세스 속도를 높이기 위해 TestNG의 병렬 기능을 사용할 수도 있습니다.

threadPoolSize 속성을 사용하면이 실행에 할당 할 스레드 수를 지정할 수 있습니다.