2014-09-10 4 views
1

두 가지 조건에서 여러 테스트를 사용하여 클래스를 실행하려고합니다. 기본적으로 검색과 관련된 여러 가지 테스트가 있습니다. 새로운 검색 전략의 새로운 기능을 추가하면서 동시에 두 구성 모두에서 이미 작성된 테스트를 실행하려고합니다. 각각 여러 테스트를 통해 여러 클래스를 보유하고 있으므로 가능한 한이 프로세스를 간소화하고 싶습니다. 기본적으로 클래스의 모든 테스트가 기본적으로 서로 다른 구성에서 두 번 실행되지만 데이터 공급자와 함께 @BeforeClass에서 설정을 수행하는 것이 좋습니다. 그러나 이것이 가능하지는 않습니다.@BeforeClass를 사용하여 TestNG 데이터 제공

는 지금은이 :

public class SearchTest1 { 
    @Test(dataProvider = "SearchType") 
    public void test1(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test1 logic 
    } 

    @Test(dataProvider = "SearchType") 
    public void test2(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test2 logic 
    } 

    @DataProvider(name = "SearchType") 
    public Object[][] createData() { 
     return new Object[][]{ 
      new Object[] {SearchType.scheme1, SearchType.scheme2} 
     } 
    } 
} 

이 작업을 수행 할 수있는 더 나은 방법이 있나요?

+0

을이 나를 위해 꽤 좋은 방법처럼 보인다. 데이터 제공자를 자체 클래스로 옮기는 것을 제외하고는 모든 사람들이 동일한 것을 참조 할 수 있습니다. – biziclop

+0

실제로 그것이 어떻게 준비되어 있는지입니다. 나는 여기서 그것을 더 쉽게 읽을 수 있도록이 방법으로 썼다. 나는 ~ 268 개의 테스트가있는 ~ 20 개의 클래스가 있음을 언급해야합니다. 나는이 모든 268 개의 줄에이 줄을 쓰는 것을 피하고 싶다. – Clayton

답변

1

데이터 공급자에게 각각의 모든 메서드에 주석을 달지 않으려면 Factory을 대신 사용할 수 있습니다.

public class SearchTest1 { 
    private final SearchType searchType; 

    public SearchTest1(SearchType searchType) { 
     this.searchType = searchType; 
    } 

    @Test 
    public void test2() { 
     //Do the test2 logic 
    } 
    ... 
} 

그리고 당신의 팩토리 클래스는 다음과 같습니다

public class SearchTestFactory { 
    @Factory 
    public Object [] createInstances() { 
     return new Object[] { new SeartchTest1(SearchType.ONE), new SearchTest1(SearchType.TWO) }; 
    } 
} 

here에 대한 자세한 내용을 참조하십시오.

그런 다음 각 테스트 클래스를 열거하는 하나의 팩토리 또는 각각에 대해 별도의 팩토리를 가질 수 있습니다. 첫 번째 팩트는 분명히 유연성이 떨어지고 두 번째 팩은 약간 더 많은 코드를 의미합니다.

+0

이것은 실제로 이러한 클래스 각각에 대해 생성자를 만들고 유형을 전달한다는 것을 의미합니다. 그건 내가 생각하기에 일이야. 또한이 패키지의 모든 클래스를 열거하는 방법을 가리키는 this [http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection]을 발견했습니다. 코드의 양을 최소화하는 것. – Clayton

+0

그래, 그게 좋겠지 만, Reflections 라이브러리의'MethodAnnotationsScanner' 스캐너로 패키지 스캐닝을 결합하여'@ Test'로 주석이 달린 메소드를 포함하고있는 클래스 만 반환 할 수도 있습니다. – biziclop

+0

하지만 그것은 일련의 메소드를 리턴 할 것입니다. 각각의 메소드를 통해 클래스를 인스턴스에 추가하는 것을 의미할까요? 아니면 반사음으로 필터링하는 방법이 있습니까? – Clayton

0

@BeforeClass에서 매개 변수를 사용할 수 있습니다. 그냥 (일부 정리와 함께)를 사용

context.getCurrentXmlTest().의 getParameters()를

@SuppressWarnings("deprecation") 
    @BeforeClass 
    public void setUp(ITestContext context) { 
    System.out.println(context.getCurrentXmlTest().getParameters());  

    } 
관련 문제