From b33bea322e121a4e9f4f8c7d21fcec3365f45ebc Mon Sep 17 00:00:00 2001 From: Viktor Sidochenko Date: Wed, 10 Nov 2021 10:52:49 +0700 Subject: [PATCH] Add ability to set custom test data provider via #356 --- .../tag/pagefactory/data/DataFactory.java | 26 +++++++++++++------ .../pagefactory/properties/Configuration.java | 3 +++ .../src/main/asciidoc/cucumber_data.asciidoc | 25 ++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/data/DataFactory.java b/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/data/DataFactory.java index 284c5aa3..cc0c7ea7 100644 --- a/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/data/DataFactory.java +++ b/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/data/DataFactory.java @@ -1,11 +1,7 @@ package ru.sbtqa.tag.pagefactory.data; -import com.mongodb.DB; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; - -import java.lang.reflect.InvocationTargetException; - import com.mongodb.client.MongoDatabase; import org.apache.commons.lang3.reflect.ConstructorUtils; import org.slf4j.Logger; @@ -15,6 +11,8 @@ import ru.sbtqa.tag.datajack.exceptions.DataException; import ru.sbtqa.tag.pagefactory.properties.Configuration; +import java.lang.reflect.InvocationTargetException; + import static java.lang.String.format; public class DataFactory { @@ -22,7 +20,7 @@ public class DataFactory { private static final Logger LOG = LoggerFactory.getLogger(DataFactory.class); private static final Configuration PROPERTIES = Configuration.create(); private static TestDataProvider testDataProvider; - private static final String BASE_FQDN = "ru.sbtqa.tag.datajack.providers."; + private static final String BASE_FQDN = PROPERTIES.getDataProviderFqdn() + "."; private enum PROVIDERS { JSON_DATA_PROVIDER("json.JsonDataProvider"), @@ -85,7 +83,15 @@ public static TestDataProvider getDataProvider() throws DataException { LOG.debug("Data provider isn't set. Leaving all placeholders as is."); break; default: - throw new DataException(format("Data provider %s isn't supported", dataType)); + LOG.debug(format("Using custom data provider %s", dataType)); + if (!dataExtension.isEmpty() && !PROPERTIES.getDataDb().isEmpty()) { + throw new DataException("data.extension and data.db could not be set both"); + } + testDataProvider = initProvider(dataType, + dataFolder, + initialCollection, + dataExtension+PROPERTIES.getDataDb() + ); } } if (!PROPERTIES.getGeneratorsClass().isEmpty()) { @@ -106,12 +112,16 @@ public static void updateCollection(TestDataProvider newObject) { } private static TestDataProvider initProvider(PROVIDERS provider, Object... args) throws DataException { + return initProvider(provider.value, args); + } + + private static TestDataProvider initProvider(String provider, Object... args) throws DataException { try { - Class providerClass = DataFactory.class.getClassLoader().loadClass(BASE_FQDN + provider.value); + Class providerClass = DataFactory.class.getClassLoader().loadClass(BASE_FQDN + provider); return (TestDataProvider) ConstructorUtils.invokeConstructor(providerClass, args); } catch (ClassNotFoundException e) { throw new DataException(format("Could not find data provider %s in classpath. " + - "Make sure you're added required maven dependency", provider.getName())); + "Make sure you're added required maven dependency", provider)); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException ex) { throw new DataException(format("Could not initialize data provider %s", provider), ex); } diff --git a/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/properties/Configuration.java b/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/properties/Configuration.java index 6bbf53ce..51d05673 100644 --- a/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/properties/Configuration.java +++ b/page-factory-core/src/main/java/ru/sbtqa/tag/pagefactory/properties/Configuration.java @@ -137,6 +137,9 @@ public interface Configuration extends Config { @DefaultValue("") String getFragmentsPath(); + @Key("data.provider.fqdn") + @DefaultValue("ru.sbtqa.tag.datajack.providers") + String getDataProviderFqdn(); @Key("data.initial.collection") @DefaultValue("") diff --git a/page-factory-doc/src/main/asciidoc/cucumber_data.asciidoc b/page-factory-doc/src/main/asciidoc/cucumber_data.asciidoc index 1bc13c16..1f8ac03a 100644 --- a/page-factory-doc/src/main/asciidoc/cucumber_data.asciidoc +++ b/page-factory-doc/src/main/asciidoc/cucumber_data.asciidoc @@ -7,6 +7,7 @@ * properties * excel * mongo +* custom test data provider ====== Тип и расположение файлов тестовых данных @@ -70,6 +71,30 @@ data.db = bd data.arrayDelimiter = ! ---- +====== Подключение своего провайдера тестовых данных +Есть возможность зарегистрировать свой провайдер данных. Для этого необходимо, реализовать интерфейс https://github.com/sbtqa/datajack/blob/master/datajack-api/src/main/java/ru/sbtqa/tag/datajack/TestDataProvider.java[TestDataProvider]. + +В классе реализации должен присутствовать конструктор со следующими параметрами: `new MyDataProvider(String initialCollection, String extensionOrDb)` + +Конфигурация задается следующими параметрам в `application.properties` (на примере JsonDataProvider): +---- +# Полное имя java пакета +data.provider.fqdn=ru.sbtqa.tag.datajack.providers + +# Имя артефакта и имя класса реализации +data.type = json.JsonDataProvider + +# Указать изначальную коллекцию +data.initial.collection = Data + +# Задать расширение файла, либо имя базы данных (нельзя задавать оба значения одновременно) +data.extension = json +# data.db = bd +---- + +Это позволит начать использовать свой провайдер данных по общим правилам фреймворка. + + ====== Путь к элементу коллекции Для обозначения пути внутри коллекции используются фигурные скобки