“根据条件在testNG中执行测试”

时间:2019-06-05 05:25:55

标签: selenium testng beanshell testng.xml

我有一个testNG xml,它将执行(一个)测试用例2次。每次之间的差异是测试级别参数。所以我必须使用2个不同的参数(2个用户)执行测试用例。

现在,我将创建新的xml(xml套件),从中将调用现有xml。我将在套件xml中为用户定义一个新参数。

期望是,如果套件xml parameter =“ user2”,则子xml仅应将参数为user2的测试用例执行一次。

我尝试了beanshell脚本,发现它对方法选择器很有用。但是我想为测试级别而不是方法级别做出决定。

下面是testNG.xml,它使用不同的用户值两次调用测试用例。第一次用User =“ USER1”调用TestCase,第二次用User =“ USER2”调用。

<?xml version="1.0"?>
<suite name="TestLoad">
    <test verbose="10" name="TestForUser1" preserve-order="true">
        <parameter name="User" value="USER1"/>
        <classes>
            <class name="com.dummy.test.TestCase"/>
        </classes>
    </test>
    <test verbose="10" name="TestForUser2" preserve-order="true">
        <parameter name="User" value="USER2"/>
        <classes>
            <class name="com.dummy.test.TestCase"/>
        </classes>
    </test>
</suite>

下面是xml套件,我将重新创建它来调用许多上述的testng.xml。

<?xml version="1.0"?>
<suite name="suiteOfXml">
    <parameter name="User" value="USER1"/>
    <suite-files>
        <suite-file path="TestLoad.xml"/>
        <suite-file path="TestStage.xml"/>
    </suite-files>
</suite>

期望类似于:

  • 如果suiteOfXml具有User =“ USER1”,则每个testNG xml都应仅使用User = USER1运行一次TestCase。
  • 如果suiteOfXml具有User =“ USER2”,则每个testNG xml只能使用User = USER2运行一次TestCase。
  • 如果suiteOfXml具有User =“ ALL”,则每个testNG xml应运行两次TestCase。一次使用User = USER1,下一次使用User = USER2。

我无法对TestCase(Java类级别)进行任何更改。条件只能在xml上进行。

请提供可能的解决方案。预先感谢

1 个答案:

答案 0 :(得分:1)

这是您要解决此问题所需要做的事情(您不需要套件等),

  • 创建TestNG侦听器接口org.testng.IAlterSuiteListener的实现,在其中基本读取参数的值,然后基于该值,确定应创建哪个<test>以及其外观如何,等等。 。,
  • 您将创建一个套件xml文件,其中仅包含可帮助您确定应该在其中放置<test>的参数以及上一步中对新创建的侦听器的引用。

那应该做。使用这种方法,您基本上可以完成列出的所有事情。

这是示例侦听器的外观(在此示例中,我们通过JVM参数获取要执行的包,然后基于此参数构建<test>标签)

package com.rationaleemotions.wordpress;

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

import java.util.Collections;
import java.util.List;

public class SimpleSuiteAlterer implements IAlterSuiteListener {
    @Override
    public void alter(List suites) {
        XmlSuite suite = suites.get(0);
        XmlTest xmlTest = new XmlTest(suite);
        xmlTest.setName("CommandLine_Test");
        String packages = System.getProperty("package", suite.getParameter("package"));
        XmlPackage xmlPackage = new XmlPackage(packages);
        xmlTest.setXmlPackages(Collections.singletonList(xmlPackage));
    }
}

这是套件xml的外观

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Package-Suites" verbose="2">
    <parameter name="package" value="com.rationaleemotions"/>
    <listeners>
        <listener class-name="com.rationaleemotions.wordpress.SimpleSuiteAlterer"/>
    </listeners>
</suite>

有关更详细的说明和一些代码示例,请参阅我的博客文章https://rationaleemotions.com/building_dynamic_testng_suites/