Java 如何使用TestNG动态地将测试组设置为@testmethods?

Java 如何使用TestNG动态地将测试组设置为@testmethods?,java,testing,testng,Java,Testing,Testng,我想在运行时根据某些条件将组设置为特定的@Test方法 假设我有以下课程 public class MyTest1{ @Test public void test1(){ System.out.println("test1 called"); } } public class MyTest2{ @Test(groups={"group1"}) public void test2(){ System.out.println("test2 called");

我想在运行时根据某些条件将组设置为特定的@Test方法

假设我有以下课程

public class MyTest1{
  @Test
  public void test1(){
    System.out.println("test1 called");
  }
}

public class MyTest2{
  @Test(groups={"group1"})
  public void test2(){
    System.out.println("test2 called");
  }

  @Test(groups={"group2"})
  public void test3(){
    System.out.println("test3 called");
  }
}
现在,在运行测试时,我在命令行中将“-groups group1”或“-groups group2”发送到TestNG。因此,testng根据传递的组名运行test2()或test3()。现在我的要求是运行test1(),它不应该附加任何组。无论我向testng runner提供什么组,每次都应该运行这个test1()。我尝试了实现IAlterSuiteListener的alter方法,但是我无法获得所有的测试方法,包括那些没有考虑运行的测试方法。因此,我无法在运行时设置组名


那么,有没有其他方法可以在运行时将组设置为@Test methods(没有定义组)?

如果指定组,则没有直接的方法。但是,还有两种方法可以做到这一点

  • 您可以在名为“nogroups”的组中标记所有没有组的测试,并在运行时包括该组 或
  • 如果您已经有了大量的测试,那么编写一个注释转换器,它基本上添加了这个组中没有组的案例——下面的示例。编写转换器也可以帮助您以编程方式控制边缘情况
  • public void转换(ITestAnnotation注释、类testClass、构造函数testConstructor、方法testMethod){
    if(annotation.getGroups().length==0){
    setGroups(新字符串[]{“noGroups”});
    }
    }
    

    您也许应该开始探索TestNG为此提供的beanshell方法选择方式

    某个时候,我写了一篇博客文章,讨论如何在TestNG中使用Beanshell表达式。您可以阅读更多关于它的信息,并参考官方TestNG文档

    引用TestNG文档

    为了方便起见,TestNG定义了以下变量:

    • java.lang.reflect.Method:当前的测试方法
    • org.testng.ITestNGMethod testngMethod:当前的测试方法
    • Map groups:当前测试方法所属组的映射
    就以您的示例为例,我创建了一个套件xml文件,如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="1265_Suite" parallel="false" verbose="2">
        <test name="92" parallel="false" preserve-order="true">
            <method-selectors>
                <method-selector>
                    <script language="beanshell">
                        <![CDATA[whatGroup = System.getProperty("groupToRun");
                    (groups.containsKey(whatGroup) || testngMethod.getGroups().length ==0);
                    ]]>
                    </script>
                </method-selector>
            </method-selectors>
            <classes>
                <class name="com.rationaleemotions.stackoverflow.MyTest1"/>
                <class name="com.rationaleemotions.stackoverflow.MyTest2"/>
            </classes>
        </test>
    </suite>
    

    在这种情况下,我必须为testng runner指定NoGroup。然后同样的问题来了。我可以用测试方法本身附加nogroup,而不是使用transformer。这是我给你的第一个选项。在这两种情况下,您都需要在xml或runnerI中指定noGroups。我这里有一个问题。如果我提供-DgroupToRun=group1,group2,它会工作吗?你说它不为你工作是什么意思?你能帮我详细说明一下什么对你不起作用吗?不,如果你试图指定多个组,那是行不通的,因为我在回答中分享的beanshell只涉及一个组。您需要增强它以支持多个组。可能我需要增强它。。谢谢如果我的回答已经回答了你的问题,你能帮我接受我的回答吗?
    mvn clean test -DsuiteXmlFile=dynamic_groups.xml -DgroupToRun=group2
    
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running TestSuite
    ...
    ... TestNG 6.11 by Cédric Beust (cedric@beust.com)
    ...
    
    test1 called
    test3 called
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15.377 sec - in TestSuite
    
    Results :
    
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0