2016-08-09 3 views
1

기능이 동일하지만 스킨이 다른 70 개 이상의 웹 사이트에 대해 동일한 테스트를 수행해야합니다. 그러나 서로 다른 URL을 통해 모두 액세스 할 수 있습니다. 가) 각 사이트에 대한 각 테스트를 실행하고 같은 나보고) 시간을 절약하기 위해 병렬로 테스트를 실행 : 나는 할 수 있도록 시험에 URL을 통과 할 수있는 효율적인 방법이 될 것입니다 무엇 TestNG를 자바를 사용수많은 웹 사이트에 대해 동일한 테스트를 실행합니다.

, (향후 필요)

URL을 최종 사용자에게 공개되고 사용자가 구성 할 수있는 형식으로 저장하려고합니다. 이상적으로는 .csv 또는 testng.xml 파일과 유사합니다. @DataProvider 또는 @Factory 중 하나를 생각하고 있지만 외부 소스에서 매개 변수를 가져 오는 데 효율적이고 유지 관리가 쉬운 방법으로 이러한 메서드를 사용하는 방법이 확실하지 않거나 현재 모델에서 이러한 메서드를 가장 잘 배치 할 수 있습니까? 내가 가지고있는 어려움은 데이터를 필연적으로 한 번에 하나의 값 (URL)으로 전달하고 모든 @Test 주석이있는 메서드에 대해 실행하여 @ Test로 반드시 데이터를 전달하고 싶지 않다는 것입니다.

testngxml: 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 

<suite name="Suite1" verbose="1"> 
<test name="FindARouteTest"> 
    <parameter name="number" value="1"/> 
    <parameter name="from" value="LONDON"/> 
    <parameter name="to" value="GLASGOW"/> 
    <parameter name="emailAddress" value="[email protected]"/> 
    <classes> 
     <class name="acceptancetests.EndToEndTest"> 
     </class> 
    </classes> 
</test> 

내 수용 테스트 :

public class EndToEndTest extends DriverBase{ 

private HomePage home; 
private String url; 

@Factory(dataProvider = "urls", dataProviderClass = URLProvider.class) 
public EndToEndTest(String url) { 
    this.url = url; 
} 


@BeforeSuite 
public void stuff(){ 
    newDriver(); 
} 


@BeforeClass 
public void setup(){ 
    home = new HomePage(driver, url); 
} 

@Test (priority = 1) 
@Parameters({"from","to"}) 
public void searchForARoute(String from, String to) throws InterruptedException { 
    home.selectWhereFrom(from); 
    home.selectWhereTo(to); 
    //some assertions... 

내 PageObject :

public class HomePage extends SeleniumBase { 

public HomePage(WebDriver driver, String url) { 
    super(driver, url); 
    try { 
     visit(url); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
    driver.manage().window().maximize(); 
} 

public void someMethodOrOther(){ 
//some methods... 

내 셀레늄 방법베이스 페이지를 다음과 같이

나의 현재 간단한 설치는

public class SeleniumBase implements Config { 

public WebDriver driver; 
public String url; 

public SeleniumBase(WebDriver driver) { 
    this.driver = driver; 
    this.url = url; 
} 

public void visit() throws MalformedURLException { 
    driver.get(url); 
} //more methods... 

내 드라이버 자료 페이지 :

public class DriverBase implements Config { 

public static WebDriver driver; 
public static String url; 

    protected void newDriver() { 
     if (host.equals("localhost")) { 
      if (browser.equals("firefox")) { 
       System.setProperty("webdriver.gecko.driver", 
         System.getProperty("user.dir") + "\\drivers\\geckodriver.exe"); 
       FirefoxProfile fp = new FirefoxProfile(); 
//more stuff 

URL 제공자 클래스 : 마지막으로

public class URLProvider { 

@DataProvider(name = "urls") 
public static Object[][] dataProviderMethod() 
{ 
    return new Object[][] {{"http://siteone.com"}, 
          {"http://sitetwo.com"}, 
          {"http://sitethree.com"} 
    }; 
} 
} 

, 현재 만 base을 보유하고 구성 :

public interface Config { 

String baseUrl = System.getProperty("baseUrl", 
String browser = System.getProperty("browser", "chrome"); 
String host = System.getProperty("host", "localhost"); 

} 

답변

2

당신이 할 수있는 t에 대해 생성자에서 @Factory 주석을 사용합니다. Est 클래스 EndToEndTest 및 dataprovider를 제공하십시오.

private String url; 

@Factory(dataProvider = "urls", dataProviderClass = URLProvider.class) 
public EndToEndTest(String url) { 
    this.url = url; 
} 

당신은 당신이 원하는 URL 데이터 공급자 엑셀에 액세스 할 수 클래스 또는 어떤 파일의 구현을 제공하는 Object [] []를 반환해야합니다.

HomePage 및 SeleniumBase의 생성자를 수정하여 @BeforeClass 메서드에서 호출중인 URL을 전달해야합니다.

이렇게하면 모든 URL 문자열에 대해이 테스트 클래스에 대한 별도의 인스턴스를 만들고 @Test 메서드를 호출해야합니다.

문자열 URL보다 많은 데이터를 전달해야하는 경우 대신 개체를 사용할 수 있습니다. testng.xml에서 메서드에 대한 4 개의 매개 변수를 볼 수 있습니다.

병렬 처리는 매우 간단해야합니다. 단일 스레드에서 주어진 URL에 대해 @Test 메서드를 모두 실행하고 싶을 것입니다. 병렬 옵션은 "클래스"입니다.

+0

답장을 보내 주셔서 감사합니다. 귀하의 제안을 시도해보고 – Steerpike

+0

이 어떻게 작동하는지 알려 드리지만 URLProvider.class에서 x3 URL로 디버깅하면 '@Factory'주석이 달린 생성자를 볼 수 있습니다. '@BeforeClass'앞에 3 번 (각 매개 변수 당 한 번) 호출되며 이것은 3 개의 스레드를 의미합니까? 나는 믿고, 3 개의 브라우저 윈도우는 테스트가 병렬로 실행된다. 시작하려면 각 URL을 전달하고 '@Tests'를 하나의 URL에 대해 실행 한 다음 다음 URL을 가져 오십시오. 따라서 EndtoEnd 생성자에 하나의 URL을 전달하고 테스트를 실행 한 후 다음을 가져옵니다. – Steerpike

+0

나는 당신이 그것이 연속적으로 실행되기를 원한다는 것을 이해함에 따라, 한 URL은 다른 URL 다음에오고있다. 평행하지 않습니다. 그 맞습니까? testng.xml 또는 테스트에서 병렬 옵션을 제거하면 테스트가 차례대로 실행됩니다. – Grasshopper

관련 문제