2017-05-25 47 views
0

我正在使用TestNG进行测试自动化以及ReportNG进行报告。我使用TestNG工厂类为我的测试提供不同的输入。我在这里面临的问题是,工厂提供的所有测试实例在相同的测试下运行,生成的报告显示单个测试下的所有场景。TestNG - 将TestNG工厂的每个实例作为单独测试运行

我想运行工厂提供的每个测试实例作为单独的测试。有没有办法做到这一点? PFB我的xml配置

<suite name="Default suite" parallel="classes"> 
<listeners> 
     <listener class-name="org.uncommons.reportng.HTMLReporter" /> 
</listeners> 
<test verbose="2" name="Default test" group-by-instances="true"> 
    <classes> 
     <class name="com.test.factory.RAExcelFactory"/> 
    </classes> 
    </test> <!-- Default test --> 
</suite> <!-- Default suite --> 

回答

2

目前在TestNG中这是不可能的。

或者,您可以考虑执行以下操作而不是使用工厂。

  • 升级到最新TestNG的版本
  • 建设的org.testng.IAlterSuiteListener的实现,并在其中包含的逻辑使用你有你的工厂内任何逻辑构建多个<test>标签(猜它利用数据驱动机制)

类似下面

测试类

import org.testng.Assert; 
import org.testng.annotations.BeforeClass; 
import org.testng.annotations.Parameters; 
import org.testng.annotations.Test; 

public class StudentTest { 
    private int age; 
    @BeforeClass 
    @Parameters("age") 
    public void setup(int age) { 
     this.age = age; 
    } 

    @Test 
    public void firstTest() { 
     Assert.assertTrue(age >=0); 
    } 

    @Test(dependsOnMethods = "firstTest") 
    public void secondTest() { 
     Assert.assertTrue(age <= 125); 
    } 
} 

的IAlterSuiteListener实现

import org.testng.IAlterSuiteListener; 
import org.testng.xml.XmlClass; 
import org.testng.xml.XmlSuite; 
import org.testng.xml.XmlTest; 

import java.util.ArrayList; 
import java.util.List; 

public class SuiteAlteringListener implements IAlterSuiteListener { 
    @Override 
    public void alter(List<XmlSuite> suites) { 
     for (XmlSuite suite : suites) { 
      List<XmlTest> tests = new ArrayList<>(); 
      Integer[] datum = getData(); 
      for (Integer data : datum) { 
       XmlTest test = new XmlTest(suite); 
       test.setName("test_" + data); 
       test.addParameter("age", Integer.toString(data)); 
       test.getClasses().add(new XmlClass(StudentTest.class)); 
      } 
     } 
    } 

    private Integer[] getData() { 
     //Change this to your data provider implementation 
     return new Integer[]{ 
       1, 2, 3 
     }; 
    } 
} 

套房xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="my_suite" parallel="false" verbose="3"> 
    <listeners> 
     <listener class-name="com.rationaleemotions.stackoverflow.SuiteAlteringListener"/> 
    </listeners> 

</suite> 

和这里的testng-results.xml的样子(其他报告将有类似的细节,以及)。我只是选择附加最简单的代表。

<?xml version="1.0" encoding="UTF-8"?> 
<testng-results skipped="0" failed="0" ignored="0" total="6" passed="6"> 
    <reporter-output> 
    </reporter-output> 
    <suite name="my_suite" duration-ms="10077" started-at="2017-05-27T07:49:36Z" finished-at="2017-05-27T07:49:46Z"> 
    <groups> 
    </groups> 
    <test name="test_1" duration-ms="24" started-at="2017-05-27T07:49:36Z" finished-at="2017-05-27T07:49:36Z"> 
     <class name="com.rationaleemotions.stackoverflow.StudentTest"> 
     <test-method status="PASS" signature="setup(int)[pri:0, instance:[email protected]]" name="setup" is-config="true" duration-ms="8" started-at="2017-05-27T13:19:36Z" finished-at="2017-05-27T13:19:36Z"> 
      <params> 
      <param index="0"> 
       <value> 
       <![CDATA[1]]> 
       </value> 
      </param> 
      </params> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- setup --> 
     <test-method status="PASS" signature="firstTest()[pri:0, instance:[email protected]]" name="firstTest" duration-ms="2" started-at="2017-05-27T13:19:36Z" finished-at="2017-05-27T13:19:36Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- firstTest --> 
     <test-method status="PASS" signature="secondTest()[pri:0, instance:[email protected]]" name="secondTest" duration-ms="1" started-at="2017-05-27T13:19:36Z" depends-on-methods="com.rationaleemotions.stackoverflow.StudentTest.firstTest" finished-at="2017-05-27T13:19:36Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- secondTest --> 
     </class> <!-- com.rationaleemotions.stackoverflow.StudentTest --> 
    </test> <!-- test_1 --> 
    <test name="test_2" duration-ms="2" started-at="2017-05-27T07:49:41Z" finished-at="2017-05-27T07:49:41Z"> 
     <class name="com.rationaleemotions.stackoverflow.StudentTest"> 
     <test-method status="PASS" signature="setup(int)[pri:0, instance:[email protected]]" name="setup" is-config="true" duration-ms="0" started-at="2017-05-27T13:19:41Z" finished-at="2017-05-27T13:19:41Z"> 
      <params> 
      <param index="0"> 
       <value> 
       <![CDATA[2]]> 
       </value> 
      </param> 
      </params> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- setup --> 
     <test-method status="PASS" signature="firstTest()[pri:0, instance:[email protected]]" name="firstTest" duration-ms="0" started-at="2017-05-27T13:19:41Z" finished-at="2017-05-27T13:19:41Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- firstTest --> 
     <test-method status="PASS" signature="secondTest()[pri:0, instance:[email protected]]" name="secondTest" duration-ms="0" started-at="2017-05-27T13:19:41Z" depends-on-methods="com.rationaleemotions.stackoverflow.StudentTest.firstTest" finished-at="2017-05-27T13:19:41Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- secondTest --> 
     </class> <!-- com.rationaleemotions.stackoverflow.StudentTest --> 
    </test> <!-- test_2 --> 
    <test name="test_3" duration-ms="2" started-at="2017-05-27T07:49:46Z" finished-at="2017-05-27T07:49:46Z"> 
     <class name="com.rationaleemotions.stackoverflow.StudentTest"> 
     <test-method status="PASS" signature="setup(int)[pri:0, instance:[email protected]]" name="setup" is-config="true" duration-ms="0" started-at="2017-05-27T13:19:46Z" finished-at="2017-05-27T13:19:46Z"> 
      <params> 
      <param index="0"> 
       <value> 
       <![CDATA[3]]> 
       </value> 
      </param> 
      </params> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- setup --> 
     <test-method status="PASS" signature="firstTest()[pri:0, instance:[email protected]]" name="firstTest" duration-ms="0" started-at="2017-05-27T13:19:46Z" finished-at="2017-05-27T13:19:46Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- firstTest --> 
     <test-method status="PASS" signature="secondTest()[pri:0, instance:[email protected]]" name="secondTest" duration-ms="0" started-at="2017-05-27T13:19:46Z" depends-on-methods="com.rationaleemotions.stackoverflow.StudentTest.firstTest" finished-at="2017-05-27T13:19:46Z"> 
      <reporter-output> 
      </reporter-output> 
     </test-method> <!-- secondTest --> 
     </class> <!-- com.rationaleemotions.stackoverflow.StudentTest --> 
    </test> <!-- test_3 --> 
    </suite> <!-- my_suite --> 
</testng-results> 

这会适合您吗?

+0

感谢您的详细回复,我不知道IAlterSuiteListener,所以我通过修改ReportNG中的HTMLReporter为基于testname(来自ITest Interface的getTestName方法)的每个实例创建一个新的testresult并包括它作为测试套件的监听者。我用java8组和通过反射来实现相同,它的工作原理! –