如何告诉Gradle将testng.xml文件用于测试类和排序?

Mik*_*ell 12 testng gradle

我试图让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>
Run Code Online (Sandbox Code Playgroud)

那为什么我需要这个呢?我想确保我的测试以一种类似于此处列出的注释定义的方式进行组织.正如您可能猜到的,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
}
Run Code Online (Sandbox Code Playgroud)

它似乎应该是一个明智的选择......分叉TestNG进程并让它运行,但我无法弄清楚如何告诉Gradle摆脱困境并执行我的测试.

Hen*_*ijo 10

以下是如何配置要在Gradle任务中执行的测试套件(xml):

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'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Nick那个链接现在已经死了但是你在想这个页面上的某些东西也许?https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html (2认同)

小智 8

我讨厌Gradle中的TestNG支持...与使用原始TestNG相比,发现它是最不灵活的.我厌倦了摆弄gradle.我的解决方案..使用Gradle任务直接运行TestNG

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"]
}
Run Code Online (Sandbox Code Playgroud)

我从命令行运行:

gradle runTests


小智 1

Gradle TestNG 运行程序假设,如果没有指定测试类(通过扫描它们或对名称进行模式匹配),那么它应该完全跳过测试执行。

相反,它还应该考虑是否提供了套件 xml。您能为这个问题添加一个 jira 问题吗?

一种可能的解决方法是使用 options.listener 来指定侦听器,并且根本不使用套件 xml 文件:

test {
   options.listeners << 'mypackage.MyListener'
   options.listeners << 'mypackage.TestOrderer'
}
Run Code Online (Sandbox Code Playgroud)

这样你就不需要指定测试类,你可以让扫描为你找到它们。