Параметризация теста из Jenkins в конфигурационный файл TestNG

Добрый день.

 

Все тесты запускаются в Jenkins (+Maven). Конфигурационные файлы для запуска билдов - файлы вида testng.xml.

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

Проблема: сложность поддержки таких файлов при необходимости редактирования.

Как можно передать параметр из Job'а Jenkins в данный файл конфигурации?

Пример файла конфигурации: 

<suite name="suite_name" parallel="none">

<parameter name="os" value="win_8" />
<parameter name="platform" value="web" />
<parameter name="browser" value="ff" />
<parameter name="browserVersion" value="16" />

...

</suite>

Как нужно:

<suite name="suite_name" parallel="none">

<parameter name="os" value=${OS} />
<parameter name="platform" value=${PLATFORM} />
<parameter name="browser" value=${BROWSER} />
<parameter name="browserVersion" value=${BROWSER_VERSION} />

...

</suite>

где переменные ${OS}, ${PLATFORM}, ${BROWSER}, ${BROWSER} будут передаваться из Jenkins.

"Правильный" способ -- использование профилей в maven.

Подробнее проконсультировал Антона (коллегу Игоря) в привате, в скайпе.

Если будут силы и время -- напишите потом, как всё сделали :)

С Maven не работаю, но билд файлы того же Ant'a отлично видят переменные окружения Jenkins'a. Напишите скрипт (на любом языке, если конечно не важна кроссплатформенность), который получит на входе параметры браузера и вставит в XML. А затем заэкзекьютьте его из того же билд файла, до запуска testng сьюта.

Реализовали с использованием профилей Maven, согласно рекомендации Алексея Баранцева.

Значения параметров передаются теперь по следующей цепочке: Job (in Jenkins)->Profiles (in Maven)->Property file->Java code

Вопрос решен.

Спасибо за помощь.

 

Расскажите, пожалуйста, более подробно о данном способе.

1 лайк

1. Создаем параметризированный Job.
1.1 Создаем параметр. Пусть имя параметра будет TEST_PARAM типа String.
1.2 В Build->Goals and options указываем команду для запуска Maven с именем будущего профиля:
clean test -P my_profile
где:
my_profile - имя вашего профиля.
1.3 Сохраняем Job.
2. Создаем профиль my_profile в pom.xml:
...
<profiles>
    <profile>
        <id>my_profile</id>
        <properties>
            <test.param>${env.TEST_PARAM}</test.param>
        </properties>
    </profile>
</profiles>
...
где:
my_profile - имя профайла (может быть любым)
test.param - имя параметра в файле .properties, который будет принимать параметр
${env.TEST_PARAM} - имя переменной окружения, в которой хранится значение параметра (TEST_PARAM - имя параметра из Job'a)
3. В проекте создаем файл .properties, который будет принимать параметр из профиля Maven:
test.param=${test.param}
4. Считываем данные из файла .properties там, где это нужно и используем по назначению)

Итого, схема передачи параметра выглядит следующим образом.
Job parameter -> Maven profile -> Property file -> Java class

1 лайк

Здравствуйте.
Окружение: Maven + Java + JUnit + Allure + REST
Задача: надо выбирать в Jenkins какие-то параметры (домены) для запуска тестов (.ru or .com) и чтобы урлы в тестах изменялись в зависимости от выбранного параметра

Пытаюсь подружить Jenkins c Maven. Делаю все как описано в коменте выше, но Maven подчеркивает строку красным.

properties>
select.domain>${env.DOMAIN}</select.domain
/properties>

В Jenkins создал параметр и запускаю через него же.

<===[JENKINS REMOTING CAPACITY]===>channel started
Executing Maven: -B -f /var/lib/jenkins/jobs/am-tests-back-temp/workspace/pom.xml clean test -P select_domain
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building am-statuscode-desk 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] — maven-clean-plugin:2.5:clean (default-clean) @ am-statuscode-desk —
[INFO] Deleting /var/lib/jenkins/jobs/am-tests-back-temp/workspace/target
[INFO]
[INFO] — maven-resources-plugin:2.6:resources (default-resources) @ am-statuscode-desk —
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/main/resources
[INFO]
[INFO] — maven-compiler-plugin:3.5.1:compile (default-compile) @ am-statuscode-desk —
[INFO] No sources to compile
[INFO]
[INFO] — maven-resources-plugin:2.6:testResources (default-testResources) @ am-statuscode-desk —
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/resources
[INFO]
[INFO] — maven-compiler-plugin:3.5.1:testCompile (default-testCompile) @ am-statuscode-desk —
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 5 source files to /var/lib/jenkins/jobs/am-tests-back-temp/workspace/target/test-classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/java/statusMainPageTest.java:[3,44] package com.sun.xml.internal.fastinfoset.sax does not exist
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.454 s
[INFO] Finished at: 2016-07-18T15:10:02+03:00
[INFO] Final Memory: 25M/166M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:testCompile (default-testCompile) on project am-statuscode-desk: Compilation failure
[ERROR] /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/java/statusMainPageTest.java:[3,44] package com.sun.xml.internal.fastinfoset.sax does not exist
[ERROR] → [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] MojoFailureException - Apache Maven - Apache Software Foundation
[JENKINS] Archiving /var/lib/jenkins/jobs/am-tests-back-temp/workspace/pom.xml to ru.am.rambler.autotests/am-statuscode-desk/1.0-SNAPSHOT/am-statuscode-desk-1.0-SNAPSHOT.pom
channel stopped

Ваша ошибка никак не связана с переменными окружения.

П.С. Подчеркивает правильно, т.к. maven ничего не знает о вашей переменной, установленной на уровне Jenkins. Но сборке это никак не помешает, т.к. значение переменной прилетит в рантайме. Для начала разберитесь с ошибками компиляции. :wink:

Спасибо большое.
Что-то совсем заработался…

Попробовал сделать все как в примере 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”)

Всем спасибо!

3 лайка

Если задача стояла в чтении Jenkins переменной из java кода, минуя проперти, то все делается гораздо проще.

Это именно то что нужно, работает на УРА.
Спасибо Роман!!!

Привет всем!
Делал по примеру, как в этой теме.

Первое что мне необходимо, вынести в Jenkins выбор тестового окружения, на котором будут запущены автотесты

Смущает момент:

Domain

из комментов выше, я правильно понимаю, что переменная ${env.DOMAIN} будет всегда подсвечиваться красным как ошибка в pom.xml и это нормально, и делать с этим ничего не нужно??

и второй вопрос:

Environment

правильно ли я понимаю, что в коде достаточно сделать вот так, чтобы достать значение переменной DOMAIN , которое будет передаваться из Jenkinsa и использоваться далее в коде для формирования полных урлов страниц ?

очень нужна помощь и консультация по текущему вопросу, т.к. никогда прежде этого не делал и последние несколько дней не могу закончить прикручивание тестов в Jenkins

Для того, чтобы проверить вашу теорию, Jenkins совсем не нужен. IntelliJ, которую вы используете, позволяет просетить переменные окружения в run / debug configuration. Что мешает вам запустить maven профайл из идеи с нужной переменной DOMAIN, и посмотреть результат? :wink:
Jenkins ничего нового - в плане переменных окружения - не делает.

P.S. А вообще, подсказочки можно найти и путем поиска по форуму. :wink: Уже были темы и о maven профайлах, и о переменных окружения и о параметризации различных конфигураций.

1 лайк

Можно отключить warning, если он так напрягает:

<!--suppress UnresolvedMavenProperty -->

Для чего вам профили в мавене? Настройку через env или properties можно и без них прочитать и передать.

1 лайк

можно наверное, я еще до конца не вник и нет понимания как это взаимосвязано работает. Поэтому и начал задавать вопросы тут. Буду благодарен за объяснение / примеры!

Добавил переменную окружения domain, но она не подтягивается в код.

POM:
domain

.properties:

Переменные окружения:

и

Java class:
Environment

При загрузке страницы для любого теста происходит обращение через экземпляр класса environment и получение базового домена, к которому потом добавляются endPoints урлов страниц сайта.
Запускаю через IDE run иконку.
при дебаге вижу что там null.

если запускаю вот так:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -DDOMAIN=http://
то домен видит и подтягивает доменное имя, записывает и урлы формируются корректно.

Может кто-то подсказать, что неправильно сделал, почему только через указание параметра в консоли работает ??