2012-03-21 3 views
1

결정된 순서대로 테스트 케이스를 실행하려고했지만 운이 없었습니다. 내가 다른 테스트에서 방법 후 @AfterClass 실행 주석 방법시피 :왜 @AfterClass가 다른 클래스의 테스트 후에 호출 되었습니까?

Configuring TestNG with: [email protected]e9d6 
RUN class com.example.testng.ITCaseOne.beforeClass() 
RUN class com.example.testng.ITCaseOne.someCase() 
RUN class com.example.testng.ITCaseTwo.beforeClass() 
RUN class com.example.testng.ITCaseTwo.someCase() 
RUN class com.example.testng.ITCaseOne.anotherCase() 
RUN class com.example.testng.ITCaseOne.afterClass() 
RUN class com.example.testng.ITCaseTwo.anotherCase() 
RUN class com.example.testng.ITCaseTwo.afterClass() 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.25 sec 

을 그리고 그것은 ITCaseTwo 모든 @Test 호출해야하기 때문에 실패 후에 만 ​​ITCaseOne.afterClass() (I 적절한 페이지를 확인해야합니다 하나의 경우에서 셀레늄 및 테스트를 사용하기 때문에) .

내 간단한 클래스 : 그것은 중요 경우

public class ITCaseOne { 

    @BeforeClass 
    public void beforeClass() { 
     System.out.printf("RUN %s.beforeClass()\n", getClass()); 
    } 

    @AfterClass(alwaysRun = true) 
    public void afterClass() { 
     System.out.printf("RUN %s.afterClass()\n", getClass()); 
    } 

    @Test(groups = "std-one") 
    public void someCase() { 
     System.out.printf("RUN %s.someCase()\n", getClass()); 
    } 

    @Test(groups = "logic-one", dependsOnGroups = "std-one") 
    public void anotherCase() { 
     System.out.printf("RUN %s.anotherCase()\n", getClass()); 
    } 

} 

public class ITCaseTwo { 

    @BeforeClass 
    public void beforeClass() { 
     System.out.printf("RUN %s.beforeClass()\n", getClass()); 
    } 

    @AfterClass(alwaysRun = true) 
    public void afterClass() { 
     System.out.printf("RUN %s.afterClass()\n", getClass()); 
    } 

    @Test(groups = "std-two") 
    public void someCase() { 
     System.out.printf("RUN %s.someCase()\n", getClass()); 
    } 

    @Test(groups = "logic-two", dependsOnGroups = "std-two") 
    public void anotherCase() { 
     System.out.printf("RUN %s.anotherCase()\n", getClass()); 
    } 

} 

내가 maven-failsafe-plugin 2.12 및 6.4

testng를 사용 (BTW, 나는 또한 preserve-order="true"과 스위트 파일을 사용하려고하지만, 그것은 나를 위해 작동하지 않습니다.)

미리 감사드립니다!

답변

1

기본적으로 종속 방법 요구 사항이 있습니다. 클래스를 별도의 클래스로 유지한다면 두 번째 클래스의 @Test를의 그룹 중 하나에 의존하도록 만들 수 있습니다. 당신은 @Test (그룹 = dependsOnGroups는 = "로직 하나" "- 두 표준"), 사물이 작동한다, u는 원하는대로 .. 나는이 문제를 재현 할 수 있었다

+0

아차. 나는 방금 내가 의도 한 것을 명확히하기 위해 나의 질문에 오타를 수정했다. 첫 번째 클래스의 모든 메서드를 수행 한 후에 만 ​​두 번째 클래스의 모든 메서드를 실행해야합니다. –

+0

대답은 여전히 ​​있습니다. –

+0

예, 작동합니다, 감사합니다. 그러나 여기에는 몇 가지 단점이 있습니다. 모든 클래스는이 방법으로 연결되어야하며 첫 번째 테스트 케이스에서 테스트 중 하나가 실패하면 다른 모든 테스트는 실패합니다. 또한이 솔루션은 테스트 실행에 대한 엄격한 명령을 추가하지만, 실제로는 먼저 ITCaseOne 또는 ITCaseTwo라는 사람을 먼저 부르지 않습니다. –

2

는, 그것의 유지 그래서 경우 버그. 나는 그것을 들여다 볼 것이다. 그 동안 두 dependsOnGroups 중 하나를 주석 처리하면 잘못된 동작이 수정됩니다.

+0

네, 양쪽 모두'dependsOnGroups' 속성을 주석 처리했을 때만 작동합니다. –

1

테스트 스위트와 preserve-order="true" (영감을받은 When needing to run tests from 2 classes from testng.xml, why does TestNG pick mehods randomly from classes?)으로 수정하는 또 다른 방법을 찾았습니다.

maven-failsafe-plugin

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-failsafe-plugin</artifactId> 
     <version>2.12</version> 
     <configuration> 
       <suiteXmlFiles> 
          <suiteXmlFile>${basedir}/src/test/config/testng.xml</suiteXmlFile> 
       </suiteXmlFiles> 
     </configuration> 
</plugin> 

하여 콘텐츠를

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="Selenium tests" preserve-order="true"> 
    <test name="Test #1"> 
     <classes> 
      <class name="com.example.testng.ITCaseOne" /> 
     </classes> 
    </test> 
    <test name="Test #2"> 
     <classes> 
      <class name="com.example.testng.ITCaseTwo" /> 
     </classes> 
    </test> 
</suite> 

핸들을 다음과 같이 src/test/config/testng.xml 만들기 그리고 지금은 예상대로 작동합니다

RUN class com.example.testng.ITCaseOne.beforeClass() 
RUN class com.example.testng.ITCaseOne.someCase() 
RUN class com.example.testng.ITCaseOne.anotherCase() 
RUN class com.example.testng.ITCaseOne.afterClass() 
RUN class com.example.testng.ITCaseTwo.beforeClass() 
RUN class com.example.testng.ITCaseTwo.someCase() 
RUN class com.example.testng.ITCaseTwo.anotherCase() 
RUN class com.example.testng.ITCaseTwo.afterClass() 
관련 문제