Повторите весь тестовый класс в TestNG с другими параметрами.

У меня есть этот код для тестирования сайта с веб-драйвером selenium. Есть четыре метода @Test и @DataProvider с тремя значениями. Таким образом, всего выполняется двенадцать тестов.

public class SomeTest {

    WebDriver driver;

    @DataProvider(name = "URLs")
    public Object[][] createData1() {
     return new Object[][] {
       {"url 1"},
       {"url 2"},
       {"url 3"}};
    }

    @BeforeMethod
    //right now I'm just setting up weddriver for chrome, but 
    //I'll need to run this test for firefox, chrome, and IE
    public void setUpWebDriver(){
        driver = WebDrivers.getChromeDriver();
    }

    @AfterMethod
    public void closeWebDriver(){
        driver.quit();
    }   

    //test methods below

    @Test(dataProvider = "URLs")
    public void test1(String url){
        //test 1 with url
    }

    @Test(dataProvider = "URLs")
    public void test2(String url){
        //test 2 with url
    }

    @Test(dataProvider = "URLs")
    public void test3(String url){
        //test 3 with url
    }

    @Test(dataProvider = "URLs")
    public void test4(String url){
        //test 4 with url
    }

}

Прямо сейчас эти тесты выполняются в Chrome. Но я также хочу повторить все эти тесты со всеми вариантами поставщиков данных в Firefox и Internet Explorer. Как я могу повторить весь класс тестов для этих других веб-драйверов? Это похоже на то, что мне нужно @DataProvider для всего класса (для метода before).


person Andrio    schedule 27.10.2015    source источник
comment
У меня была такая же проблема, когда я использовал Selenium + TestNG для своего проекта тестирования веб-приложений. Я попросил помощи в списке рассылки TestNG и получил ее, но так и не нашел решение, которое мне действительно понравилось.   -  person reinierpost    schedule 27.10.2015


Ответы (2)


Вы должны использовать @Factory.

public class SomeTest {

    @Factory
    public Object[] createInstances() {
        Object[] result = new Object[]{            
            new SomeTest(WebDrivers.getChromeDriver())
            // you can add other drivers here
        };
        return result;
    }

    private final WebDriver driver;

    public SomeTest(WebDriver driver) {
        this.driver = driver
    }

    @DataProvider(name = "URLs")
    public Object[][] createData1() {
     return new Object[][] {
       {"url 1"},
       {"url 2"},
       {"url 3"}};
    }    

    @AfterClass
    public void closeWebDriver(){
        driver.quit();
    }   

    //test methods below

    @Test(dataProvider = "URLs")
    public void test1(String url){
        //test 1 with url
    }

    @Test(dataProvider = "URLs")
    public void test2(String url){
        //test 2 with url
    }

    @Test(dataProvider = "URLs")
    public void test3(String url){
        //test 3 with url
    }

    @Test(dataProvider = "URLs")
    public void test4(String url){
        //test 4 with url
    }

}
person juherr    schedule 27.10.2015
comment
Это то, что я искал, но если у меня есть конструктор тестов с параметром, я получаю java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null. - person vimterd; 11.11.2015
comment
Вы должны предоставить полную трассировку стека. - person juherr; 11.11.2015

Надеюсь, вы запускаете тестовые примеры из файла TestNG.xml. Если да, вы можете использовать parameters, предоставленный TestNG, и настроить файл TestNG.xml для запуска тестовых случаев следующим образом.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1" verbose="1" >
    <test name="Internet Explorer Test" >
        <parameter name="browser" value="IE">
        <classes>
            <class name="com.somePackage.SomeTest" />
        </classes>
    </test>

    <test name="Firefox Test" >
        <parameter name="browser" value="FF">
        <classes>
            <class name="com.somePackage.SomeTest" />
        </classes>
    </test>

    <test name="Chrome Test" >
        <parameter name="browser" value="CH">
        <classes>
            <class name="com.somePackage.SomeTest" />
        </classes>
    </test>
</suite>

Некоторое изменение требуется и для @BeforeMethod.

@BeforeMethod
@Parameters{"browser"}
public void setUpWebDriver(String  browser){
    if (browser.equals("IE"))
        driver = WebDrivers.getIEDriver();
    else if (browser.equals("FF"))
        driver = WebDrivers.getFireFoxDriver();
    else if (browser.equals("CH"))
        driver = WebDrivers.getChromeDriver();
}
person Sighil    schedule 27.10.2015