Подтвердить что ты не робот

Как я могу сказать Gradle использовать мой файл testng.xml для тестовых классов и порядка?

Я пытаюсь выполнить Gradle некоторые тесты, определенные с помощью файла testng.xml. Мой файл testng.xml выглядит так:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="mySuite" verbose="1">

  <listeners>
    <listener class-name="mypackage.MyListener" />
    <listener class-name="mypackage.TestOrderer" />
  </listeners>

  <test name="Tests">
    <classes>
      <class name="mytestpackage.CrazyTest1"/>
      <class name="mytestpackage.CrazyTest2"/>
      <class name="mytestpackage.CrazyTest3"/>
    </classes>
  </test>
</suite>

Так зачем мне это нужно? Я хочу, чтобы мои тесты были организованы таким образом, который был определен аннотациями, аналогичными тем, которые были перечислены в здесь. Как вы могли догадаться, TestOrderer является IMethodInterceptor.

Здесь проблема, Gradle, кажется, захватывает мой файл testng.xml и очищает тестовый каталог, чтобы найти те тесты, которые он хочет выполнить. Даже если я отключу это, он не сможет выполнить соответствующие методы. Здесь то, что я думаю, должно работать, но просто, не делает.

test {
  useTestNG()
  options.suites("src/test/resources/crazyTestNG.xml") 
  # Adding 
  # scanForTestClasses = false 
  # causes zero tests to be executed, since the class names don't end in Test
}

Кажется, что это должно быть без проблем... развивает процесс TestNG и позволяет ему работать, но я не могу понять, как сказать Gradle, чтобы уйти с дороги и просто выполнить мои тесты.

4b9b3361

Ответ 1

Я ненавидел поддержку TestNG в gradle... Нашел, что он будет самым несгибаемым по сравнению с использованием raw TestNG. И я устал возиться с gradle. Мое решение.. Запустите TestNG напрямую с помощью задачи Gradle

task runTests(type: JavaExec, dependsOn: 'classes') {
    main = 'org.testng.TestNG'
    classpath = files("./src/test/resources",
                      project.sourceSets.main.compileClasspath,
                      project.sourceSets.test.compileClasspath,
                      project.sourceSets.main.runtimeClasspath,
                      project.sourceSets.test.runtimeClasspath)
    args = ["-parallel",  "methods", "-threadcount", "1", "-d", "./build/test-output", "./src/test/resources/test.xml"]
}

Что я запускаю из командной строки:

gradle runTests

Ответ 2

Здесь вы можете настроить тестовый набор (xml) для выполнения в задаче Gradle:

apply plugin: 'java'

repositories {
    mavenCentral()
}
dependencies {
    // add the dependencies as needed
    testCompile group: 'org.testng', name: 'testng', version:'6.8.8'
    testCompile fileTree('lib')
}
test {
    useTestNG() {
        // runlist to executed. path is relative to current folder
        suites 'src/test/resources/runlist/my_test.xml'
    }
}

Ответ 3

Бегун Gradle TestNG предполагает, что если тестовые классы не заданы, сканируя их или сопоставляя шаблоны по имени, то он должен полностью пропустить выполнение теста.

Вместо этого он должен учитывать, был ли предоставлен набор xml или нет. Не могли бы вы добавить проблему jira для этой проблемы?

Одна возможная работа заключается в том, чтобы использовать options.listener для указания прослушивателей и вообще не использовать xml файл пакета:

test {
   options.listeners << 'mypackage.MyListener'
   options.listeners << 'mypackage.TestOrderer'
}

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

Ответ 4

Этот метод не использует ваш файл testng.xml, но вы также можете эмулировать тестовые группы TestNG и заказывать, создавая тестовые группы JUnit в качестве задач Gradle, а затем заказывайте их вручную, заказывая выполнение задачи при выполнении сборки:

// in build.gradle
task testGroupOne(type: Test) {
   //include '**/*SuiteOne.*'
   include '**/SuiteOne.class'
   testReportDir = file("${reportsDir}/SuiteOne")
   testResultsDir = file("${buildDir}/test-results/SuiteOne")
}

task testGroupTwo(type: Test) {
   //include '**/*SuiteTwo.*'
   include '**/SuiteTwo.class'
   testReportDir = file("${reportsDir}/SuiteTwo")
   testResultsDir = file("${buildDir}/test-results/SuiteTwo")
}

Затем запустите свою сборку следующим образом: gradle testGroupTwo testGroupOne