0

我正在使用 TestNG 进行测试自动化以及使用 ReportNG 进行报告。我使用 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 -->
4

1 回答 1

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:com.rationaleemotions.stackoverflow.StudentTest@61dc03ce]" 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:com.rationaleemotions.stackoverflow.StudentTest@61dc03ce]" 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:com.rationaleemotions.stackoverflow.StudentTest@61dc03ce]" 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:com.rationaleemotions.stackoverflow.StudentTest@458ad742]" 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:com.rationaleemotions.stackoverflow.StudentTest@458ad742]" 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:com.rationaleemotions.stackoverflow.StudentTest@458ad742]" 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:com.rationaleemotions.stackoverflow.StudentTest@66d2e7d9]" 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:com.rationaleemotions.stackoverflow.StudentTest@66d2e7d9]" 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:com.rationaleemotions.stackoverflow.StudentTest@66d2e7d9]" 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>

这对你有用吗?

于 2017-05-27T07:56:08.197 回答