Вашему вниманию предлагается библиотека-расширение стандартного TestNG DataProvider механизма - test-data-supplier.
Пользователям TestNG, пожалуй, не стоит рассказывать о тех неудобствах, которые приходится испытывать при работе с DataProvider. Не смотря на прекрасную идею, реализация самого механизма и отсутствие поддержки Java 8 лишает нас всякой гибкости при работе данными. В современном Java мире все уже давно пользуются Collections / Streams, а не убогими двумерными массивами / итераторами.
Что же предлагает test-data-supplier? Во-первых, расширенную поддержку типов возвращаемых значений. На текущий момент это:
- Collection (любые типы-наследники)
- Object[] (любые типы)
- double[]
- int[]
- long[]
- Stream (кроме специализированных)
- StreamEx (кроме специализированных)
- Любой неитерируемый стандартный или пользовательский тип
Если, к примеру, нам нужно осуществить какую-то сложную фильтрацию данных до непосредственной поставки в тест, можно использовать следующий синтаксис:
@DataSupplier
public Stream<User> getData() {
return Stream.of(
new User("Petya", "password2"),
new User("Virus Petya", "password3"),
new User("Mark", "password1"))
.filter(u -> !u.getName().contains("Virus"))
.sorted(comparing(User::getPassword));
}
@Test(dataProvider = "getData")
public void shouldSupplyStreamData(final User user) {
// ...
}
Где DataSupplier - аннотация-альтернатива DataProvider’у.
На текущий момент доступна лишь одна опция - extractValues = true / false (default), позволяющая раскладывать возвращаемую коллекцию / стрим на input аргументы теста. Т.е. если мы хотим запустить тест лишь раз, передав N аргументов на вход, можно воспользоваться следующей конструкцией:
@DataSupplier(extractValues = true)
public List<User> getExtractedData() {
return StreamEx.of(
new User("username1", "password1"),
new User("username2", "password2"))
.toList();
}
@Test(dataProvider = "getExtractedData")
public void shouldSupplyExtractedListData(final User... users) {
// ...
}
При этом, оба юзера попадут на вход тесту, вместо 2 независимых запусков с 1 юзером.
Если нам нужна не коллекция / стрим, а всего один объект (для очень простых тестов):
@DataSupplier
public String getData() {
return "username";
}
@Test(dataProvider = "getData")
public void shouldSupplySingleObject(final String username) {
// ...
}
В самой аннотации Test все остается без изменений. Но ссылаемся мы уже не на DataProvider, а на DataSupplier метод.
К сожалению, TestNG plugin inspections пока будут выдавать warnings о неиспользуемых методах и отсутствующих data providers. Частично это лечится на уровне IDE. Но по-хорошему, нужно либо обновлять соответствующий плагин, либо писать новый. На текущий момент этого нет в планах.
Поддержки специфических фич DataProvider (по типу параллелизации / кастомных имен) нет, и скорее всего не будет. За N лет работы с TestNG я не нашел им должного применения. Если у кого-то есть весомые аргументы “за их использование”, можем обсудить.
Помимо dependency, для использования библиотеки нужно подключить еще и спец. listener → io.github.sskorol.dataprovider.DataProviderTransformer.
По приведенной выше линке можно найти более детальную информацию и ссылки на sample проекты для maven / gradle + примеры тестов в основном репозитории.
Хотелось бы еще заметить, что библиотека является всего лишь оберткой, а не принципиально новой реализацией DataProvider. Т.е. все баги / специфическое поведение оного будут проявляться и у DataSupplier.
Буду признателен за фидбек / issues, т.к. библиотека еще не обкатана.
П.С. Лицензия Apache 2.0, монетизации не будет. Изначально разработана для личного использования, теперь в паблике.
You’re welcome!