TestNG. Где проводить "выборку тестовых данных" для тестов

Hi
Работаем над итеграционными и Е2Е TA в продуктовой компании.
Специфика тест кейсов такая, что часто их надо вызывать для разных наборов данных. Выбран TestNG, используем датапровайдеры. Пока покрытие небольшое, то все устраивает. Но вот какая мысль начала тревожить. - рост числа датапровайдеров. Например: 80% тестов нужны просто пуговицы (это ок), но одному тесткейсу нужны пуговицы синие, второму синие с белыми точками, третьему - красные с белыми точками.

Выбор пуговиц связан с построением селектов к базе. Есть врапперы на наиболее частые вызовы, но не на все.
Напрашивается решение о параметризации датапровайдеров, но тут возникают проблемы :

  1. решение с параметризацией через testng.xml - выглядит очень грубо и ограничено
  2. решение с параметризацией через кастомные аннотации выглядит тоже не особо, так как фильтрация может быть громоздкой (sql - выражения, сетевые параметры и т.п.

Да и вообще, выглядит такая конструкция не консистентно (вынос кондишинов тестов на уровеь аннотаций\внешних файлов).

В идеале хотелось бы видеть в коде как-то так организацию наполнения датапровайдеров изнутри теста :smile: (Или хотя бы частично). Пример датапровайдера:

filter = filerBuilder.
withColor(green).
withHols(4).
withDots(white).
build().

testDataSet = buttonsStorage.getByFilter(filter)

“популярные” датапровайдеры::

testDataSet = buttonsStorage.getRandomButtons(100)
testDataSet = buttonsStorage.getLastPublishedButtons(10)

Т.о. я вижу пока две альтернативы:
1.Оставить подготовку в датапровайдерах.
Когда это все находится в датапровайдере, то мы получаем корректные репорты и распаралеливание в гриде. но растет код и тестовая логика получается размазанной по нескольким уровням. Чтобы не повторяться, придется переиспользовать датапровайры(или их части) что приведет к появлению еще одной иерархии классов для датапровайдеров, которая в общем случае не будет повторять тестовую. и будет запутывать рядовых тестеров.

  1. Если полностью отказаться от датапровайдеров и делая все выборки в тесте (Setup), то придется делать итерации по тестовому набору самостоятельно, хендлить таймауты, также нужно репортить все по иному. Ведь с т.з. TestNG это один тест, Всех этих расходов хочется избежать.

Поделитесь опытом, стоят ли датапровайдеры “вычинки” в принципе на проекте в потенциле до 500-600 тест кейсов ?

Thanks

Если я правильно понял, хотелось бы следующего:

  1. Не отделять провайдеры от тестов, т.к. они очень специфические.
  2. Сделать так, чтобы тесты с разными параметрами в отчете шли отдельно.

Так что мешает внутри тестового класса располагать последовательно: метод-провайдер-1, тест-1, метод-провайдер-2, тест-2, … Почти как внутри теста.

Другое дело, чтобы делать эти провайдеры максимально короткими и легко читаемыми, нужно организовать классы поддержки, но вот их как раз очень легко сделать обобщенными с максимальным переиспользованием.

Может я не понял суть вопроса.
Почему не устраивается разные дата провайдеры?

Можно хранить данные например в excel.
твоя excel будет называется как путь к твоему классу
( com.xxx.aqa.tests.HomePage.java)

com.xxx.aqa.tests.HomePage.xlsx

Количество листов в excel равно количеств тестов в классе
и соответственно название листов как и название методов

к примеру

определяешь где-то base set up (реализацию getDataFromExcelByTestMethodName могу скинуть )

@DataProvider(name = DATA_EXCEL) public Object[][] getExcelData(Method testMethod) { return TestDataProviderExcelProcessor.getDataFromExcelByTestMethodName(testMethod); }

юзаем
` @Test(dataProvider = Constants.DATA_EXCEL)
public void testName(String firstParameter, String secondParameter, String thirdParameter) {
/**

  • тест заранается три раза с тремя параметрами

*/
}`
В итоге 1 дата провайдер на все тесты