TestNg передача параметров в xml файл через переменную в gradle

погулил ответов не нашёл прямых(воркеарундов много типа через sh переписать значение перед запуском или юзать проперти устаналиваемые на CI итд)

желаемый флоу такой

  1. есть раннер тестов где ${stage} желаемый изменять параметр на ходу перед запуском билда
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test suite" verbose="10" parallel="classes" data-provider-thread-count="1">
    <parameter name="stage" value="${stage}"/>
    <test name="Test first">
        <classes>
            <class name="suites.draft.TestNgPoc">
                <methods>
                    <include name="test1"/>
                    <include name="test2"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>
  1. есть гредл типа
task testDebugSuite(type: Test) {
  gradle.startParameter.rerunTasks = true
  testLogging.showStandardStreams = true

  useTestNG {
    useDefaultListeners false
    ignoreFailures true
    suites 'src/test/resources/run/stub-runner.xml'
  }
}
  1. есть пайплайн
  parameters {
    choice(
        choices: 'author\npublish\ndispatcher',
        description: 'select server',
        name: 'SERVERS'
    )
    choice(
        choices: 'testDebugSuite\naaaaaaaaa',
        description: 'select suite',
        name: 'SUITE'
    )
          def server = params.SERVERS
          switch (server) {
            case "author":
              def command = "gradle ${params.SUITE}"
              sh command
              break

Как это хотелось бы чтобы работало:

  1. а) передаём параметр в гредл ${params.SERVERS}
  2. б) или сетаем переменнную системную и читаем в гредле

server= “$System.env.SERVER”

  1. сетаем переменную в хмл файл…
    пока не нашёл примера чтобы testNg такое поддерживал…

  2. Как вариант - можно ли вызвать тест НГ в пайплайне и на ходу сетнуть параметры перед запуском теста? передать в гредл готовый вариант
    навеяно этим постом
    Cannot parse xml file in jenkins pipeline - Stack Overflow

Судя по наследованию параметров через родителя

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

может я не до конца понял вопрос, но все таки, зачем себе усложнять жизнь ? судя по всему, параметр нужен для того чтобы использовать его внутри теста (или прекондишна), нельзя ли его там и вытащить ?

задача сделать set/insert в хml динамического параметра например имя конфига - откуда берутся все проперти для тестов средствами testNg

тогда можно еще проще, если у Вас не 100500 конфигов, необходимо прописать xml\property\yml не важно для каждой конфигурации и вытаскивать набор параметров по имени конфигурации, в спринге к примеру, это уже давно стандартная фича, но в принципе руками такое написать не проблемма
а идея динамичесского формирования атрибутов имхо стремная )

таки да

  • конфигов много
  • много комбинаций параметров
    которые можно/хочется выбрать при билде
    через мульти выбор

если не найду тестНг нативного варианта просто буду

  1. модифицировать хмл
  2. копировать
  3. вызывать
    image

еще вариант, использовал сам от безвыходи но мне такое вообще не нравиться
выносяться переменные как глобальные и потом на стороне дженкинса сетяться через Active choise reactive parameter(там прописываються все возможные комбинации чтбы не давать пользователю лишнего выбрать)

1 лайк

после дня нетрадиционного секаса с пайплайном который интерпритирует груви через одно место (XmlSlurper) решил что чем проще тем лучше, вот рабочий пример

  parameters {
    choice(
        choices: 'author\npublish\ndispatcher',
        description: 'select server',
        name: 'SERVERS'
    ) 
  }
stage('Select test server type') {
      steps {
        script {
          echo "Selected server is  ${params.SERVERS}"
          String server = params.SERVERS
          String runnerFolderPath = "${WORKSPACE}/src/test/resources/run/ci/"
          String inputPath = "${runnerFolderPath}${params.SUITE}.xml"
          def fileContents = readFile file: inputPath, encoding: "UTF-8"
          fileContents = fileContents.replace("CONFIG_NAME", server)
          echo fileContents
          writeFile file: inputPath, text: fileContents, encoding: "UTF-8"
        }
      }
    }
  }

ну и следущий степ

 stage('Select test suite') {
      steps {
        script {
          echo "Selected suite is  ${params.SUITE}"
          String command = "gradle ${params.SUITE}"
          sh command
        }
      }
    }

вообшем KISS победил (