2017-05-25 48 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組和通過反射來實現相同,它的工作原理! –