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

groovy
jenkins
testng
Теги: #<Tag:0x00007f7b644223b8> #<Tag:0x00007f7b64422250> #<Tag:0x00007f7b644220e8>

(Vatslau) #1


погулил ответов не нашёл прямых(воркеарундов много типа через 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. Как вариант - можно ли вызвать тест НГ в пайплайне и на ходу сетнуть параметры перед запуском теста? передать в гредл готовый вариант
    навеяно этим постом
    https://stackoverflow.com/questions/49149021/cannot-parse-xml-file-in-jenkins-pipeline

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


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


(Ramon Menezes) #2

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


(Vatslau) #3

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


(Ramon Menezes) #4

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


(Vatslau) #5

таки да

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

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

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

(Ramon Menezes) #6

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


(Vatslau) #7

после дня нетрадиционного секаса с пайплайном который интерпритирует груви через одно место (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 победил (