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

Я пытаюсь, чтобы 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, чтобы найти тесты, которые он хочет выполнить. Даже если я отключу это, он не сможет выполнить методы соответствующим образом. Вот то, что я думаю, должно работать, но просто не работает.

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, чтобы он ушел с дороги и просто выполнил мои тесты. *

Ответы [ 4 ]

8 голосов
/ 16 июня 2015

Вот как можно настроить набор тестов (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'
    }
}
7 голосов
/ 05 марта 2015

Я ненавидел поддержку TestNG в Gradle ... Оказалось, что она наиболее негибкая по сравнению с использованием необработанного TestNG.И мне надоело возиться с градлем.Мое решение .. Запустите 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

1 голос
/ 09 февраля 2013

Этот метод не использует ваш файл 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

1 голос
/ 22 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...