Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Параллельный запуск теста на разных браузерах

webdriver
testng
selenium
Теги: #<Tag:0x00007fedbbc98c30> #<Tag:0x00007fedbbc98780> #<Tag:0x00007fedbbc98410>

(Dan Perman) #1

Добрый день.

Есть вопрос. Подскажите пожалуйста как я могу запустить 2 теста параллельно но для логина в апликацию использовать 2 разных юзера? Например User1 и User2. Оба теста идентичны, разница только в юзерах.
Использую TestNG и Data Provider. Когда запускаю параллельно , оба браузера берут первую строчку данных из DataProvider.scv

Спасибо.


(Vasiliy Rakshin) #2

Вам надо свой датапровайдер переделать в вид

@DataProvider(name = "test1")
public Iterator<Object[]> createData() {
  return new MyIterator(DATA);
}

Взято отсюда http://testng.org/doc/documentation-main.html#parameters-dataproviders
начиная с The data provider supports injection too.


(Dan Perman) #3

Это мой DP
@DataProvider(name = “CsvDataProvider”)
public static Iterator<Object[]> provideData(Method method) {
List<Object[]> list = new ArrayList<Object[]>();
String pathname = “C:/WebAutomation/src/test/resources/test_data/WEBAutomation.csv”;

	File file = new File(pathname);

	try {
		CSVReader reader = new CSVReader(new java.io.FileReader(file));
		String[] keys = reader.readNext();
		if (keys != null) {
			String[] dataParts;
			while ((dataParts = reader.readNext()) != null) {
				Map<String, String> testData = new HashMap<String, String>();
				for (int i = 0; i < keys.length; i++) {
					testData.put(keys[i], dataParts[i]);
				}
				list.add(new Object[] { testData });
			}

		}
		reader.close();
	} catch (FileNotFoundException e) {
		throw new RuntimeException("File" + pathname + " was not found.\n" + e.getStackTrace().toString());
	} catch (IOException e) {
		throw new RuntimeException("Could not read " + pathname + " file.\n" + e.getStackTrace().toString());
	}

	return list.iterator();

}

(Vasiliy Rakshin) #4

И добавить к нему
@DataProvider(parallel = true)


(Dan Perman) #5

так?
@DataProvider(name = “CsvDataProvider”, parallel = true)


(Vasiliy Rakshin) #6

Проще же запустить и посмотреть, чем ждать моего ответа же?


(Dan Perman) #7

при таком запуске открывается по 2 страницы login Page на chrome , причем только в одном вводится user name: User1
в fire fox тоже 2 страницы login Page, но берет user name из 2 строк : User2User3


(Vasiliy Rakshin) #8

Опять же, зачем так сложно? Вы так читаете логин и пароль из файла?
Как вы получаете в тесте уже логин и пароль из датапровайдера?
Выведете в консоль то что приходит в каждый тест из датапровайдера.
Я бы ещё просто в самом датапровайдере проверил что вы корректно считали и записали в мэп нужную инфу из файла.


(Dan Perman) #9

А как проще сделать ?
В будущем планирую добавить еще параметры для каждого теста.
Этот я взял как пример , когда начал писать свой тест.


(Sergey Korol) #10

Race condition же. Драйвер то у вас наверняка static. На форуме было уже множество тем на этот счет. :wink:


(Dan Perman) #11

Спасибо , поищу.
Значит плохо искал по форуму :frowning:


(Vatslau) #12

Поробуйте это
Чтение в БеворКласс

 @Parameters({"path_generated", "stage", "country"})
    @BeforeClass(enabled = true)
    public void setUpSuite(String path_generated, String stage, String country) {
        initSentry();
        environment = new ImportEnvironment().readJsonEnvironment(stage, country);
        String pathToFile = pathToGeneratedJson(environment, path_generated);

        rootLogger.debug(path_generated);
        this.userProfiles = new ImportDataUsers().userProfiles(pathToFile, stage, country);
        return;
    }

А
тут просто нужно Лист объектов переадать

@DataProvider(name = "users", parallel = true)
    public Iterator<Object[]> users() {
        Collection<Object[]> data = new ArrayList<>();
        this.userProfiles.forEach(item -> data.add(new Object[]{item}));
        return data.iterator();
    }