如何仅使用TestNG在Test类中执行第一个测试

时间:2017-11-10 20:47:53

标签: java testng qa

我正在组建一个导航测试套件,用Java / Selenium / TestNG在我公司内部应用程序的每个页面上运用一些功能。

假设我的NavigationTests目录中有一个名为ApplicationsIT的测试类。在这个课程中,我有10个@Tests注释,因此每次运行完整的NavigationTests套件时,所有10个测试都会运行。

但是,为了时间的推移,我是否只能在每个测试类中运行第一个测试?

我试过搞乱“(alwaysRun = false)”标签,但它看起来并不像我预期的那样。

我知道这是一个构造不良的问题/帖子,所以我很乐意澄清我能做的任何事情。

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以动态执行此操作。

  1. 使用org.testng.IAnnotationTransformer的实现。在这里,您基本上实现了接口org.testng.IAnnotationTransformer,并在其transform()方法中检查传入的testMethod java.lang.reflect.Method对象,以检查其名称是否与您要运行的内容相匹配跑。您可以通过JVM参数指定运行/不运行一堆方法的意图。如果匹配,那么您基本上通过annotation.setEnabled(false)来禁用测试方法,此处annotation类型为org.testng.annotations.ITestAnnotation。您需要使用套件xml文件中的<listeners>标记通过服务加载程序(或)连接此侦听器。有关一般听众的更多信息,您可以查看我的博客文章here
  2. 另一个选择是使用beanshell。以下示例显示了如何使用beanshell。您可以在我的博文here上阅读有关如何使用beanshells的更多信息。
  3. <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="47230879_Suite" parallel="false" verbose="2">
        <test name="47230879_test" verbose="2">
            <method-selectors>
                <method-selector>
                    <script language="beanshell">
                        <![CDATA[
                            try {
                                input = System.getProperty("methods","");
                                if (input.trim().isEmpty()) {
                                    return true;
                                }
                                methods= input.split(",");
                                for (int i =0; i< methods.length; i++) {
                                    if (method.getName().equals(methods[i])) {
                                        return true;
                                    }
                                }
                                return false;
                            } catch( e ) {
                                print(e);
                            }
                        ]]>
                    </script>
                </method-selector>
            </method-selectors>
            <classes>
                <class name="com.rationaleemotions.stackoverflow.qn47230879.TestclassSample"/>
            </classes>
        </test>
    </suite>
    

    测试类如下所示

    package com.rationaleemotions.stackoverflow.qn47230879;
    
    import org.testng.annotations.Test;
    
    public class TestclassSample {
        @Test
        public void a() {
            System.err.println("a()");
        }
    
        @Test
        public void b() {
            System.err.println("b()");
        }
    
        @Test
        public void c() {
            System.err.println("c()");
        }
    
        @Test
        public void d() {
            System.err.println("d()");
        }
    
        @Test
        public void e() {
            System.err.println("e()");
        }
    }
    

    如果在没有通过JVM参数指定任何方法的情况下运行套件,则所有方法都会运行,但如果通过JVM参数-Dmethods=a,b,c指定一堆方法名称(例如),则只执行那些方法。