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

Для того, чтобы проверить вашу теорию, 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 вашего сайта”

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

Этот вариант, задавая параметр в строке запуска через -D, - я проверил самым первым. Он сразу отработал у меня, но я хотел разобраться во взаимодействии через pom и properties
В конечном итоге придется отложить оба вышеперечисленных варианта.
Пообщался с ребятами из devops. Они сказали, что будут делать одну джобу в дженкинсе с выбором параметров где и как запускать. Я на своей стороне должен принимать те значения, которые передает Jenkins. На сколько я понял, то в этом случае мне нужен вариант который предложил товарищ ArtOfLife:

поправьте, если ошибаюсь…

Привет. Подскажите пожалуйста, есть на проекте файл config.properties, где есть настройки, например url=http://… , name = test, email= email@test.com
Пробовал запустить через дженкинс вот так: -D url=http:// -D name=test -D email=email@test.com , не работает.

-Durl - надо слитно
Вам надо смотреть в код кто и как обрабатывает config.properties, и туда добавлять такое:
Если системная переменная <имя_переменной> пустая, то читаю её из файла.
-D - это и есть задание системной переменной.

1 лайк

Вы хотите сказать, мне нужно на проекте удалить значения из файла config.properties и прописать их в дженкинс через -D?
В коде у меня, вот так Configuration.baseUrl=сonfig().getProperty(“url”);

Надо примерно так:

If (System.getProperty("url").isEmpty)
  Configuration.baseUrl=сonfig().getProperty(“url”);
else
  Configuration.baseUrl=System.getProperty("url");
2 лайка

Не работает selenide.baseUrl: пусто

if(System.getProperty(“url”).isEmpty())
Configuration.baseUrl = сonfig().getProperty(“url”);
else
Configuration.baseUrl=System.getProperty(“url”);

Goals and options:
clean compile test -P Myprofile install -Durl=http://test.com -Duser=test

config.properties
url=
user=

А если так:

1 лайк

Не помогло, уже 5 минут вот такой спектрейс

1586945821.252][SEVERE]: Timed out receiving mess[age from renderer: 0.100
1586945821.253][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.352][SEVERE]: Timed out receiving message from renderer: 0.100
[[15869451821.355][586945821.354][SEVERE]: Timed out receiving message from rendererSEV: 0.100
ERE]: Timed out receiving message from renderer: 0.100
[1586945821.453][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.455][SEVERE]: Timed out receiving message from[ rendere1586945821.45r: 0.1006][SEVE
RE]: Timed out receiving message from renderer: 0.100
[1586945821.556][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.557][SEVERE]: Timed out receiv[in1586945821.558][SEVERE]: Timed out receiving message from renderer: 0.100
g message from renderer: 0.100
[1586945821.657][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.658][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.660][SEVERE]: Timed out receiving message from renderer: 0.100
[1586945821.758][SEVERE]: Timed out receiving message from renderer: 0.100
[[1586945821586945821.761][SEVER1.760][SEVERE]: Timed out reE]: Timed out receiving message from renderer: 0.100
ceiving message from renderer: 0.100
[1586945821.860][SEVERE]: Timed out receiving message from renderer: 0.100
[1586[945821.863][SEVERE]: Timed out receiving 1586945821.862][SEVERE]: Timed out rmeceivingessage from rendere message from renderer: 0.100
r: 0.100