Спасибо большое.
Что-то совсем заработался…
Попробовал сделать все как в примере GarikRocks, но значение из Jenkins так и не приходит.
Вместо этого в URL подставляется “маска” (${***})
Подскажите пожалуйста в чем может быть дело?
Спасибо большое.
Что-то совсем заработался…
Попробовал сделать все как в примере GarikRocks, но значение из Jenkins так и не приходит.
Вместо этого в URL подставляется “маска” (${***})
Подскажите пожалуйста в чем может быть дело?
Вам нужно включить фильтрацию ресурсов в pom, чтобы иметь возможность подставлять значения в properties вместо placeholder’ов.
А не могли бы вы более конкретно подсказать как это сделать?
Добавил в билд resource, но тоже не работает.
Файл POM
<profiles> <profile> <id>select_domain</id> <properties> <test.param>${env.TEST_PARAM}</test.param> </properties> </profile> </profiles>
<properties> <allure.version>1.4.23</allure.version> <aspectj.version>1.8.9</aspectj.version> <htmlelement.version>1.17</htmlelement.version> <selenium.version>2.53.0</selenium.version> </properties>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> </dependency>
<dependency> <groupId>com.github.detro.ghostdriver</groupId> <artifactId>phantomjsdriver</artifactId> <version>1.0.4</version> </dependency> <dependency> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-junit-adaptor</artifactId> <version>${allure.version}</version> </dependency> <dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId> <version>2.9.0</version> <scope>test</scope> </dependency>
</dependencies>
<reporting> <excludeDefaults>true</excludeDefaults> <plugins> <plugin> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-maven-plugin</artifactId> <version>2.5</version> </plugin> </plugins> </reporting>
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <properties> <property> <name>listener</name> <value>ru.yandex.qatools.allure.junit.AllureRunListener</value> </property> </properties> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
Так а вы профайл указали при сборке? Если вы не задали условие активации, вы должны явно вызывать соответствующий профиль.
И еще, как в пропертях обращаетесь к переменной?
Ответ:
В Jenkins в Goals была добавлена строка:
install -D DOMAIN=${DOMAIN}
В Jenkins был добавлен параметр Choice Param:
Name: DOMAIN
С двумя вариантами выбора
В pom.xml была добавлена строка:
<properties> <test.param>${env.DOMAIN}</test.param> </properties>
В Java в нужном месте вызывается с помощью:
System.getProperty(“DOMAIN”)
Всем спасибо!
Если задача стояла в чтении Jenkins переменной из java кода, минуя проперти, то все делается гораздо проще.
Это именно то что нужно, работает на УРА.
Спасибо Роман!!!
Привет всем!
Делал по примеру, как в этой теме.
Первое что мне необходимо, вынести в Jenkins выбор тестового окружения, на котором будут запущены автотесты
Смущает момент:
из комментов выше, я правильно понимаю, что переменная ${env.DOMAIN} будет всегда подсвечиваться красным как ошибка в pom.xml и это нормально, и делать с этим ничего не нужно??
и второй вопрос:
правильно ли я понимаю, что в коде достаточно сделать вот так, чтобы достать значение переменной DOMAIN , которое будет передаваться из Jenkinsa и использоваться далее в коде для формирования полных урлов страниц ?
очень нужна помощь и консультация по текущему вопросу, т.к. никогда прежде этого не делал и последние несколько дней не могу закончить прикручивание тестов в Jenkins
Для того, чтобы проверить вашу теорию, Jenkins совсем не нужен. IntelliJ, которую вы используете, позволяет просетить переменные окружения в run / debug configuration. Что мешает вам запустить maven профайл из идеи с нужной переменной DOMAIN
, и посмотреть результат?
Jenkins ничего нового - в плане переменных окружения - не делает.
P.S. А вообще, подсказочки можно найти и путем поиска по форуму. Уже были темы и о maven профайлах, и о переменных окружения и о параметризации различных конфигураций.
Можно отключить warning, если он так напрягает:
<!--suppress UnresolvedMavenProperty -->
Для чего вам профили в мавене? Настройку через env или properties можно и без них прочитать и передать.
можно наверное, я еще до конца не вник и нет понимания как это взаимосвязано работает. Поэтому и начал задавать вопросы тут. Буду благодарен за объяснение / примеры!
Добавил переменную окружения domain, но она не подтягивается в код.
POM:
.properties:
Переменные окружения:
и
Java class:
При загрузке страницы для любого теста происходит обращение через экземпляр класса environment и получение базового домена, к которому потом добавляются endPoints урлов страниц сайта.
Запускаю через IDE run иконку.
при дебаге вижу что там null.
если запускаю вот так:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -DDOMAIN=http://
то домен видит и подтягивает доменное имя, записывает и урлы формируются корректно.
Может кто-то подсказать, что неправильно сделал, почему только через указание параметра в консоли работает ??
Потому что в properties pom файла задаются параметры для этого pom, если не задано иное в плагине. От того что вы из env параметра запишете в pom переменную, то она не появится в System.getProperties()
. Параметры env можно вычитывать через System.getenv(name);
Так же можно передавать не через env, указав в параметрах запуска ключ -D”имя параметра”=“значение параметра”, тогда в System.getProperty(name);
можно вычитать этот параметр. В обоих случаях задавать профиль и properties в pom-файле нет необходимости.
Сегодня посмотрел видео:
Переделал у себя в следующий вид:
Запускаю через команду:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -P test
если я все правильно понял, то, при запуске указывая профиль -P test / prod / stage / qa (для моего случая) соответствующее значение site.url из профиля в pom должно быть записано в global.properties вместо ${site.url}, а в классе Environment достается значение из .properties.
Проблема в том, что при дебаге у меня в джава код приезжает ${site.url} именно в таком виде, а не значение в виде урла. Не понимаю, что я делаю не так =((
В видео же всё сказано. И то что настройки в профиле параметров используются внутри самого мавена, а не в коде. Как я выше уже указывал. Для запуска в IDE Алексей создал отдельный файл, который применяется по-умолчанию, если не задан запуск из мавена и в нём настройки заданы явно, а не через подстановку переменной в строку.
Профили мощная штука, но по мне так излишняя для вашей задачи. Всё тоже самое можно сделать и без них. Они нужны для того, чтобы собирать по разному проекты. В буквальном смысле можно собирать разные приложения и много что ещё делать. А для запуска на разных контурах/браузерах можно применить и обычные параметры через консоль и комплекты в TestNG/JUnit
@Necrosium простите может уже разобрались - для чтения из pom.xml
в код надо немного поработать:
например
<properties>
<selenium.version>3.13.0</selenium.version>
в коде
System.err.println("Property \"selenium.version\" = "
+ System.getProperty("selenium.version"));
будет пусто
Property "selenium.version" = null
и
надо
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<executions>
<execution>
<id>unit-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<selenium.version>${selenium.version}</selenium.version>
тогда
System.err.println("Property \"selenium.version\" = "
+ System.getProperty("selenium.version"));
напечатает
Property "selenium.version" = 3.13.0
это все помоему невероятно очень старые (можно выразиться древние) технологии… используем и радуемся что работает…
один из apache.commons вроде действительно выдавал литерал но не помню как воспроизвести
Спасибо. Заработало. Добавил:
все заработало запуском mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -P ‘profile_name’
и в этом случае .properties файл получается вообще не нужен.
я правда так до конца и не понял, как работает связка pom > properties > java, но да ладно… придет время разберусь))
Вот поэтому и советовал вам не браться за профили, если до конца не понимаете их принцип. В приведённом выше ответе @sergueik показал как через плагин можно передать переменные окружения в системные переменные. О чем я так же выше уже упоминал. Файл вам не потребовался скорее всего из-за того, что вы его не используете или используются не только он и что-то перебивает его данные. Очень странный подход к написанию кода без понимания что и откуда куда подаётся и как вычитывается.
Спасибо за помощь. Иногда так происходит, что понимание приходит после реализации, а не до
Скорее всего в вашем случае, если запустить вот так:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -Dsite.url=“тут URL вашего сайта”
То будет работать точно также и без всяких профилей.