【问题标题】:How to only execute the first test in a Test class with TestNG如何使用 TestNG 只执行测试类中的第一个测试
【发布时间】:2017-11-10 20:47:52
【问题描述】:

我正在整理一个导航测试套件,以便在我公司内部使用 Java/Selenium/TestNG 的应用程序的每个页面上执行一些功能。

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

但是,由于时间关系,有没有办法让我只在每个测试类中运行第一个测试?

我尝试弄乱“(alwaysRun = false)”标签,但它似乎没有按我的预期工作。

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

【问题讨论】:

  • 这确实是一个 TestNG 问题,与 Selenium 无关。我会删除标签以免混淆其他人。你看过 TestNG 文档吗?我相信它至少会描述一种方法。

标签: java testng qa


【解决方案1】:

至少有两种动态的方法。

  1. 使用org.testng.IAnnotationTransformer 的实现。在这里,您基本上实现了接口org.testng.IAnnotationTransformer 并在其transform() 方法中,检查传入的testMethod java.lang.reflect.Method 对象以检查其名称是否与您要运行或不运行的名称匹配。您可以通过 JVM 参数指定运行/不运行一堆方法的意图。如果匹配,那么您基本上可以通过annotation.setEnabled(false) 禁用测试方法,这里annotationorg.testng.annotations.ITestAnnotation 类型。您需要通过服务加载器(或)使用套件 xml 文件中的 <listeners> 标记来连接此侦听器。有关一般听众的更多信息,您可以查看我的博客文章here
  2. 另一个选项是使用 beanshell。下面的示例向您展示了如何使用 beanshell。您可以从我的博文here 中了解有关如何使用 beanshells 的更多信息。
<?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(例如)指定一堆方法名称,则只有那些方法会被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多