testng: как спроектировать запуск @test с несколькими случаями от поставщика данных на разных URL-адресах, которые принадлежат другому поставщику данных?

Предположим, у меня есть набор тестовых случаев, и я сначала открываю один URL-адрес и запускаю тест:

@BeforeMethod
    @Parameters("browser")
    public void start(String browser) throws Exception {
    driver = new FirefoxDriver();
    driver.get(url);

}
@Test(dataProvider = "TestA", dataProviderClass = xxx.class)
public void TestA(String VariableA1, String VariableA2..){

}

@Test(dataProvider = "TestB", dataProviderClass = xxx.class)
public void TestB(String VariableB1, String VariableB2..){

}

@Test(dataProvider = "TestC", dataProviderClass = xxx.class)
public void TestC(String VariableC1, String VariableC2..){

}

И я хочу запустить один и тот же набор тестов на другом URL-адресе, который также хранится в одной из таблиц от поставщика данных. Как я могу разработать для достижения этой логики?:

  1. получить URL-адрес urlX из таблицы URL-адресов в поставщике данных Excel.
  2. запустить тест: TestA, TestB, TestC.
  3. затем получите URL-адрес из таблицы URL-адресов в поставщике данных Excel.
  4. запустить тест: TestA, TestB, TestC...
  5. так далее и так далее..

Как я могу этого добиться?

Спасибо!


person yueran    schedule 08.12.2015    source источник


Ответы (2)


Взгляните на фабрики TestNG. например

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.Iterator;

public class DemoTest {
    private final String url;

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

    @Test(dataProvider = "someData", dataProviderClass = DemoTest.xxx.class)
    public void something(int a, int b) {
        System.out.println(String.format("%s, %d, %d", url, a, b));
    }

    @Test(dataProvider = "someOtherData", dataProviderClass = DemoTest.xxx.class)
    public void somethingElse(int a, int b) {
        System.out.println(String.format("%s, %d, %d", url, a, b));
    }

    public static class xxx {
        @DataProvider
        public static Iterator<Object[]> urls() {
            String[] urls = {
                    "https://www.google.com/",
                    "https://inbox.google.com/",
                    "https://calendar.google.com/",
                    "https://drive.google.com/"
            };
            return Arrays.stream(urls)
                    .map(s -> new Object[]{s})
                    .iterator();
        }

        @DataProvider
        public static Object[][] someData() {
            return new Object[][]{
                    {1, 2},
                    {3, 4}
            };
        }

        @DataProvider
        public static Object[][] someOtherData() {
            return new Object[][]{
                    {4, 3},
                    {2, 1}
            };
        }
    }
}

Пример вывода:

https://calendar.google.com/, 1, 2
https://calendar.google.com/, 3, 4
https://inbox.google.com/, 1, 2
https://inbox.google.com/, 3, 4
https://drive.google.com/, 1, 2
https://drive.google.com/, 3, 4
https://www.google.com/, 1, 2
https://www.google.com/, 3, 4
https://calendar.google.com/, 4, 3
https://calendar.google.com/, 2, 1
https://inbox.google.com/, 4, 3
https://inbox.google.com/, 2, 1
https://drive.google.com/, 4, 3
https://drive.google.com/, 2, 1
https://www.google.com/, 4, 3
https://www.google.com/, 2, 1
person mfulton26    schedule 09.12.2015
comment
Большое спасибо за ваш ответ. Я немного исследовал фабрики TestNG и смог заставить их работать. Я реализовал это немного иначе, чем ваше решение. Я использовал Excel в качестве поставщика данных как для @ фабрик, так и для @ теста. - person yueran; 21.12.2015

Я реализовал следующим образом:

public class Test {
    WebDriver driver;
    private String hostName;
    private String url;


    @Factory(dataProvider = "xxxx global variables", dataProviderClass = globalxxx.class)
    public GetVariables(String hostName, String url, String GFlag) {
        this.hostName = hostName;
        this.url = url;

    }

    @BeforeMethod
    @Parameters("browser")
    public void start(String browser) throws Exception {

        driver = new FirefoxDriver();
        driver.get(url);
        Thread.sleep(1000);

    }

    @Test(priority = 10, dataProvider = "dataprovider Test A", dataProviderClass = xxxA.class)
    public void TestA(Variable1,
            Variable2,Variable3) throws Exception {
        some test here...

    }

    @Test(priority = 20, dataProvider = "dataprovider Test B", dataProviderClass = xxxB.class)
    public void TestB(Variable1,
            Variable2,Variable3)
            throws Exception {
        some test here...
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }
person yueran    schedule 21.12.2015