如何使用现有的testng套件xml文件并以编程方式设置线程数?

如何使用现有的testng套件xml文件并以编程方式设置线程数?,xml,testng,build.gradle,Xml,Testng,Build.gradle,全部。我有现有的xml文件testng套件。我想在gradle任务中使用它,并以编程方式设置线程计数 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="UiTests"> <test name="UiTests" preserve-order="true">

全部。我有现有的xml文件testng套件。我想在gradle任务中使用它,并以编程方式设置线程计数

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="UiTests">
    <test name="UiTests" preserve-order="true">
        <packages>
            <package name="tests.web">
                <exclude name="tests.web.performance"/>
            </package>
        </packages>
    </test>
 </suite>

但是它不起作用-线程计数是从xml文件中获取的,因此如何以编程方式设置线程计数?

TestNG套件xml文件中指定的threadcount值具有最终决定权。这就是为什么即使您试图通过gradle测试任务中的TestNGOptions设置它,它也不会生效

要克服此问题,您需要执行以下操作:

  • 确保您使用的是TestNG v6.11或更高版本
  • 构建
    org.testng.IAlterSuiteListener
    的实现,其中您可以在
    XmlSuite
    级别(
    级别)或
    XmlTest
    级别(
    级别)更改线程计数
  • 将对上述创建的侦听器的引用添加到TestNG套件xml文件中。或者,您也可以通过
    @Listeners
    注释(或)通过套件xml(或)通过ServiceLoader插入侦听器。有关更多详细信息,请阅读我的博客文章
  • 将gradle接收到的所有系统属性传递给测试任务
下面是所有这些在行动中的表现

测试类看起来像这样

package test;

import org.testng.annotations.Test;

public class ParallelRunner {

    @Test(priority = 1)
    public void a() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 2)
    public void b() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 3)
    public void c() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 4)
    public void d() {
        System.err.println("**" + Thread.currentThread().getId());
    }
}
public class SuiteAlterer implements IAlterSuiteListener {

    @Override
    public void alter(List<XmlSuite> suites) {
        int count = Integer.parseInt(System.getProperty("threadcount", "3"));
        XmlSuite suite = suites.get(0);
        suite.setDataProviderThreadCount(count);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="many_methods_suite" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.SuiteAlterer"/>
    </listeners>
    <test name="many_methods_test" parallel="methods">
        <classes>
            <class name="test.ParallelRunner"/>
        </classes>
    </test>
</suite>
test {
    useTestNG() {
        suites 'src/test/resources/krmahadevan.xml'
        systemProperties(System.getProperties())
    }
    testLogging.showStandardStreams = true
}
测试侦听器看起来像这样

package test;

import org.testng.annotations.Test;

public class ParallelRunner {

    @Test(priority = 1)
    public void a() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 2)
    public void b() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 3)
    public void c() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 4)
    public void d() {
        System.err.println("**" + Thread.currentThread().getId());
    }
}
public class SuiteAlterer implements IAlterSuiteListener {

    @Override
    public void alter(List<XmlSuite> suites) {
        int count = Integer.parseInt(System.getProperty("threadcount", "3"));
        XmlSuite suite = suites.get(0);
        suite.setDataProviderThreadCount(count);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="many_methods_suite" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.SuiteAlterer"/>
    </listeners>
    <test name="many_methods_test" parallel="methods">
        <classes>
            <class name="test.ParallelRunner"/>
        </classes>
    </test>
</suite>
test {
    useTestNG() {
        suites 'src/test/resources/krmahadevan.xml'
        systemProperties(System.getProperties())
    }
    testLogging.showStandardStreams = true
}
这是输出

~/temp/example
23:15 $ gradle -Dthreads=2 clean test

> Task :test

Gradle Test Executor 13 STANDARD_ERROR
    Altered the suite thread count to 2

Gradle Test Executor 13 STANDARD_OUT
    ...
    ... TestNG 6.12 by Cédric Beust (cedric@beust.com)
    ...


many_methods_suite > many_methods_test > test.ParallelRunner.a STANDARD_ERROR
    **14

many_methods_suite > many_methods_test > test.ParallelRunner.b STANDARD_ERROR
    **15

many_methods_suite > many_methods_test > test.ParallelRunner.c STANDARD_ERROR
    **15

many_methods_suite > many_methods_test > test.ParallelRunner.d STANDARD_ERROR
    **15


BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 executed

现在,您可以通过JVM参数
-Dthreads

传入适当的线程数来控制线程数。TestNG套件xml文件中指定的threadcount值具有最终决定权。这就是为什么即使您试图通过gradle测试任务中的TestNGOptions设置它,它也不会生效

要克服此问题,您需要执行以下操作:

  • 确保您使用的是TestNG v6.11或更高版本
  • 构建
    org.testng.IAlterSuiteListener
    的实现,其中您可以在
    XmlSuite
    级别(
    级别)或
    XmlTest
    级别(
    级别)更改线程计数
  • 将对上述创建的侦听器的引用添加到TestNG套件xml文件中。或者,您也可以通过
    @Listeners
    注释(或)通过套件xml(或)通过ServiceLoader插入侦听器。有关更多详细信息,请阅读我的博客文章
  • 将gradle接收到的所有系统属性传递给测试任务
下面是所有这些在行动中的表现

测试类看起来像这样

package test;

import org.testng.annotations.Test;

public class ParallelRunner {

    @Test(priority = 1)
    public void a() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 2)
    public void b() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 3)
    public void c() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 4)
    public void d() {
        System.err.println("**" + Thread.currentThread().getId());
    }
}
public class SuiteAlterer implements IAlterSuiteListener {

    @Override
    public void alter(List<XmlSuite> suites) {
        int count = Integer.parseInt(System.getProperty("threadcount", "3"));
        XmlSuite suite = suites.get(0);
        suite.setDataProviderThreadCount(count);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="many_methods_suite" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.SuiteAlterer"/>
    </listeners>
    <test name="many_methods_test" parallel="methods">
        <classes>
            <class name="test.ParallelRunner"/>
        </classes>
    </test>
</suite>
test {
    useTestNG() {
        suites 'src/test/resources/krmahadevan.xml'
        systemProperties(System.getProperties())
    }
    testLogging.showStandardStreams = true
}
测试侦听器看起来像这样

package test;

import org.testng.annotations.Test;

public class ParallelRunner {

    @Test(priority = 1)
    public void a() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 2)
    public void b() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 3)
    public void c() {
        System.err.println("**" + Thread.currentThread().getId());
    }

    @Test(priority = 4)
    public void d() {
        System.err.println("**" + Thread.currentThread().getId());
    }
}
public class SuiteAlterer implements IAlterSuiteListener {

    @Override
    public void alter(List<XmlSuite> suites) {
        int count = Integer.parseInt(System.getProperty("threadcount", "3"));
        XmlSuite suite = suites.get(0);
        suite.setDataProviderThreadCount(count);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="many_methods_suite" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.SuiteAlterer"/>
    </listeners>
    <test name="many_methods_test" parallel="methods">
        <classes>
            <class name="test.ParallelRunner"/>
        </classes>
    </test>
</suite>
test {
    useTestNG() {
        suites 'src/test/resources/krmahadevan.xml'
        systemProperties(System.getProperties())
    }
    testLogging.showStandardStreams = true
}
这是输出

~/temp/example
23:15 $ gradle -Dthreads=2 clean test

> Task :test

Gradle Test Executor 13 STANDARD_ERROR
    Altered the suite thread count to 2

Gradle Test Executor 13 STANDARD_OUT
    ...
    ... TestNG 6.12 by Cédric Beust (cedric@beust.com)
    ...


many_methods_suite > many_methods_test > test.ParallelRunner.a STANDARD_ERROR
    **14

many_methods_suite > many_methods_test > test.ParallelRunner.b STANDARD_ERROR
    **15

many_methods_suite > many_methods_test > test.ParallelRunner.c STANDARD_ERROR
    **15

many_methods_suite > many_methods_test > test.ParallelRunner.d STANDARD_ERROR
    **15


BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 executed

现在,您可以通过JVM参数
-Dthreads

传入一个适当的线程来控制线程数。感谢您的解释,您还可以使用xml生成器动态生成sute xml,例如,感谢您的解释,您还可以使用xml生成器动态生成sute xml,例如