如何在testng.xml文件中查找正在执行的测试数量

时间:2018-07-25 10:04:31

标签: java xml selenium testng

我需要找到要执行的测试数量,这些测试已在testng.xml中进行了配置。 XML结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="User Login">
        <classes>
            <class name="UserLogin" />
        </classes>
    </test> 
    <test name="Registration">
        <classes>
            <class name="Registration" />
        </classes>
    </test> 
</suite>

我需要获得testng.xml的实际执行开始之前的测试数量。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分:1)

无法在实际运行开始之前明确获取要运行的测试数量,因为您会注意到,当您使用Eclipse运行测试时,随着TestNG发现它们,方法的总数一直在增加。 / p>

我已经创建了一个新的类TestNGRunner,它是从TestNG派生的,您可以尝试以下代码

public class TestNGRunner extends TestNG {
     public int getTestCount() {
        int count = 0;
        for(XmlSuite suite : m_suites) {
            count += suite.getTests().size();
        }
        return count;
     }
}

然后在我的框架中,我得到了以下

public void execute (boolean counting) {
    TestNGRunner testng = new TestNGRunner();
    //....addListeners
    //....setTestSuites

    if(counting) {
        testng.initializeSuitesAndJarFile();
        return testng.getTestCount();
    }

    testng.run();
    return 0;
 }

但这只会给您标签数量,而不是方法数量。

希望这会有所帮助!

答案 1 :(得分:1)

您必须像下面那样实现ISuiteLisnter:

public ISuiteListener implements ISuiteLisnter {

 private long testCount = 0 ; 
 private List<ITestNGMethod> testMethods = null;

 public void setTestCount(long testCount){
      this.testCount = testCount;
 }

 public long getTestCount(){
     return this.testCount;
 }

 @Override
 public void onStart( ISuite suite){
       testMethods  = suite.getAllMethods();
       this.testCount = testMethods.size();
 }

 @Override 
 public void onFinish( ISuite suite){

 }
}

这将为您提供当前正在运行的套件中所有测试方法的计数,您可以查看ITestNGMethod中要处理的实用程序方法。

答案 2 :(得分:0)

您可以将XSL转换应用于XML描述。为此,您需要一个XSLT处理器(例如xsltproc)。合适的XSLT如下所示。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/suite">
        <xsl:value-of select="count(test)"/>
    </xsl:template>
</xsl:stylesheet>

输出是标记<test>出现的次数。如果需要,可以对XSLT稍加修改以计算其他标签,例如select="count(descendant::class)"将计算嵌套标记<class>的出现次数。

更简单的方法是为<test name=进行grep并计算结果行数。例如

grep '<test name=' tests.xml | wc -l

答案 3 :(得分:0)

如果您只想在xml中获取测试标签的数量,则可以在@BeforeSuite中使用此代码:

@BeforeSuite
    public void setUpConfiguration() {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        Document doc = null;
        DocumentBuilder docBuilder;
        try {
            docBuilder = docFactory.newDocumentBuilder();
            doc = docBuilder.parse("D:\\PLAYGROUND\\demo\\src\\main\\resources\\testSuites\\testng.xml");  // path to your testng.xml
            NodeList parameterNodes = doc.getElementsByTagName("test");
            System.out.println("Total Number of tests to be executed are : " + parameterNodes.getLength());
        } catch (ParserConfigurationException |SAXException | IOException e) {
            System.out.println("Exception while reading counting tests in testng.xml");
        }

    }

请介意我的问题是否对不起。
让我知道这是否是您想要的。

答案 4 :(得分:0)

您可以使用testNG提供的侦听器

请使用方法onStart()实现ISuiteListener接口

从传递的ISuite参数中,您可以使用getAllMethods()获得已执行测试方法的列表。希望对您有帮助

答案 5 :(得分:0)

如果需要计数,则可以修改@Karthikeyan R的方法,如下所示:

public int getTestCount() {
  int count = 0;
  for (XmlSuite suite : m_suites) {
    List<XmlTest> xmlTests = suite.getTests();
    for (XmlTest test : xmlTests) {
      count += test.getClasses().size();
    }
}
return count;

}