Как я могу использовать итератор объектов DataProvider и запускать несколько тестов параллельно в java? - PullRequest
0 голосов
/ 17 июня 2020

Итак, мне нужно проверить несколько CSV (более 500 КБ), и их количество никогда не бывает одинаковым. Каждый файл CSV состоит из одной или нескольких строк и 30 строк. Мне нужно взять каждый файл и проверить поля с данными из API.

Решение, о котором я думаю сейчас:

Один DataProvider, который может предоставить итератору объектов все файлы, которые я Нужно проверить. Для каждого файла я проведу несколько тестов (10-15). Все они работают параллельно с несколькими потоками. И чтобы не выполнять запрос API для каждого теста, мне нужно сделать запрос @ BeforeSuite.

Я не нашел способа выполнять тесты параллельно с этим типом DataProvider. Тесты запускают сначала test1 для всего набора данных, затем test2 для всего набора данных, поэтому вызов API @BeforeSuite не имеет значения. Есть идеи?

Это пример кода:

Фабрика данных:

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

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class DataFactory {
    @Factory(dataProvider = "dp")
    public Object[] createInstances(String filename) {
        return new Object[]{new TestSuite(filename)};
    }

    private static final String CSV_PATH = "src/main/resources/files/";

    @DataProvider(name = "dp")
    public Iterator<Object[]> getFileList() {
        File[] files = new File(CSV_PATH).listFiles();
        List<Object[]> data = new ArrayList<>();

        for (File file : files) {
            data.add(new String[]{file.getName()});
        }

        return data.iterator();
    }
}

Класс тестов:

import java.lang.reflect.Method;
import org.testng.annotations.Test;

public class TestSuite {
    String filename1 = "";

    public TestSuite(String filename) {

        filename1 = filename;
    }

    @Test
    public void test1(Method res) {
        System.out.println("…Executing…" + res.getName() + " dataProviderData " + filename1 + " thread number " + Thread.currentThread().getId());
    }

    @Test
    public void test2(Method res) {
        System.out.println("…Executing…" + res.getName() + " dataProviderData " + filename1 + " thread number " + Thread.currentThread().getId());
    }

TestNG XML config :

<suite name="Tests Suite" thread-count="20" parallel="methods">
    <test name="CSV test">
        <classes>
            <class name="DataFactory" group-by-instances="true"/>
        </classes>
    </test>
</suite>

1 Ответ

0 голосов
/ 18 июня 2020

Найдено одно решение:

Добавлен @BeforeClass в мой файл тестового набора:

    @BeforeClass
        public void getIdFromFilename(ITestContext context) throws IOException {

            String id = "";
            String name = "";

    //Get data from API
    //Get data from CSV

            context.setAttribute("product", product);
            context.setAttribute("id", id);
            context.setAttribute("name", name);
        }

@Test
    public void test1(ITestContext context) {
        PojoApi product = (PojoApi) context.getAttribute("product");
        String idFromApi = product.getId();
        String id = (String) context.getAttribute("id");

        System.out.println("Test id: ");
        System.out.println("Product id from api: " + idFromApi);
        System.out.println("Product id from CSV: " + id);
        System.out.println(Thread.currentThread().getId());

        Assert.assertEquals(id, idFromApi);
    }

    @Test
    public void test2(ITestContext context) {

        PojoApi product = (PojoApi) context.getAttribute("product");
        String name = (String) context.getAttribute("name");
        String nameFromAPI = product.getName();

        System.out.println("Test name: ");
        System.out.println("Product name from api: " + nameFromAPI);
        System.out.println("Product name from CSV: " + name);
        System.out.println(Thread.currentThread().getId());

        Assert.assertEquals(name, nameFromAPI);

    }

Я изменил параллельный режим на parallel = "instance" в TestNG XML config

<suite name="CSV Suite" group-by-instances="true" parallel="instances" thread-count="10">
    <test name="CSV Test" >
        <classes>
            <class name="DataFactory"/>
        </classes>
    </test>
</suite>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...