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

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

Попробовал сделать все как в примере 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://
то домен видит и подтягивает доменное имя, записывает и урлы формируются корректно.

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

Потому что в properties pom файла задаются параметры для этого pom, если не задано иное в плагине. От того что вы из env параметра запишете в pom переменную, то она не появится в System.getProperties(). Параметры env можно вычитывать через System.getenv(name);
Так же можно передавать не через env, указав в параметрах запуска ключ -D”имя параметра”=“значение параметра”, тогда в System.getProperty(name); можно вычитать этот параметр. В обоих случаях задавать профиль и properties в pom-файле нет необходимости.

1 лайк

Сегодня посмотрел видео:

Переделал у себя в следующий вид:

Запускаю через команду:
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

1 лайк

@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 вроде действительно выдавал литерал но не помню как воспроизвести

2 лайка

Спасибо. Заработало. Добавил:

все заработало запуском mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -P ‘profile_name’

и в этом случае .properties файл получается вообще не нужен.

я правда так до конца и не понял, как работает связка pom > properties > java, но да ладно… придет время разберусь))

Вот поэтому и советовал вам не браться за профили, если до конца не понимаете их принцип. В приведённом выше ответе @sergueik показал как через плагин можно передать переменные окружения в системные переменные. О чем я так же выше уже упоминал. Файл вам не потребовался скорее всего из-за того, что вы его не используете или используются не только он и что-то перебивает его данные. Очень странный подход к написанию кода без понимания что и откуда куда подаётся и как вычитывается.

Спасибо за помощь. Иногда так происходит, что понимание приходит после реализации, а не до :slight_smile:

Скорее всего в вашем случае, если запустить вот так:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -Dsite.url=“тут URL вашего сайта”

То будет работать точно также и без всяких профилей.