如何仅通过TestNG执行Test类中的第一个测试

问题描述:

我正在组合一个导航测试套件,以在我公司的内部应用程序的每个页面上使用Java/Selenium/TestNG行使一点功能。如何仅通过TestNG执行Test类中的第一个测试

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

但是,为了时间的缘故,我有没有办法让每个测试班都只进行第一次测试?

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

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

+1

这实在是一个TestNG问题,与Selenium无关。我会删除标签,以免混淆他人。你看过TestNG文档吗?我相信它会描述至少有一种方法来做到这一点。 – JeffC

动态地做到这一点至少有两种方法。

  1. 使用org.testng.IAnnotationTransformer的实现。在这里,您基本上实现了接口org.testng.IAnnotationTransformer,并在其transform()方法中检查传入的对象,以检查其名称是否与要运行或未运行的对象匹配。您可以通过JVM参数指定运行/不运行一堆方法的意图。如果有匹配,那么你基本上通过annotation.setEnabled(false)在这里禁用测试方法annotationorg.testng.annotations.ITestAnnotation类型。您需要通过服务加载器(或)在套件xml文件中使用<listeners>标签连接此侦听器。有关一般听众的更多信息,你可以看看我的博客文章here
  2. 另一种选择是利用beanshell。下面的示例展示了如何使用beanshell。您可以从我的博客文章here中阅读更多关于如何使用豆壳的信息。
<?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.*.qn47230879.TestclassSample"/> 
     </classes> 
    </test> 
</suite> 

测试类看起来像下面

package com.rationaleemotions.*.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(例如),那么只有这些方法得到执行。