根据testng.XML中提供的参数调用不同的类

时间:2017-09-14 10:12:00

标签: selenium-webdriver testng testng-dataprovider

echartInstance.dispatchAction({
      type: 'dataZoom',
      start: 90,
      end: 100
});

1)在上面的代码片段中,如果我的测试类型是健全的,我想调用Sanity.java文件,就好像其他测试类型是回归一样,我想调用Regression.java

2)我们可以将参数值作为输入传递给testng.xml中的其他XML标签 示例:如果 那么我希望这个值基于参数值

进行动态变换

3)另外从这个参数输入如何调用并行浏览器测试?

1 个答案:

答案 0 :(得分:0)

  

1)在上面的代码片段中,如果我的测试类型是健全的,我想调用Sanity.java文件,就好像其他测试类型是回归一样,我想调用Regression.java

TestNG为您提供了一个名为 groups 的概念,可以为您解决此问题。对于每个@Test方法,请为其添加groups属性,然后在套件xml文件中,您可以选择要运行的组。有关详细信息,请参阅官方文档here

  

2)我们可以将参数值作为输入传递给testng.xml中的其他XML标签示例:如果那时我想根据参数值对该值进行dyanamically

在此之后不确定您的身份,但testng套件xml文件中的参数本质上始终是静态的。它们不能被更改,除非你改变套件xml文件(或),你使用了一个TestNG监听器,例如org.testng.IAlterSuiteListener,其中你基于其他东西捏造参数。这是一个展示我正在谈论的内容的样本

需要注入参数的测试类

package com.rationaleemotions.stackoverflow.qn46216357;

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

public class SampleTestClass {

    @Test
    @Parameters("name")
    public void testMethod(String name) {
        System.err.println("Hello " + name);
    }
}

此侦听器查找以jvm_开头的JVM参数,其名称与xml套件中的参数匹配,如果找到,则使用JVM参数中发送的内容更新参数值。因此,使用这种方式,您可以真正实现您的目标。

package com.rationaleemotions.stackoverflow.qn46216357;

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

import java.util.List;
import java.util.Map;

public class ParameterChangerListener implements IAlterSuiteListener {
    @Override
    public void alter(List<XmlSuite> suites) {
        XmlSuite suite = suites.get(0);

        for (Map.Entry<String, String> each : suite.getParameters().entrySet()) {
            //Check to see if we were given any JVM arguments with the prefix as "jvm_" followed
            //by the text of the parameter name.
            String sysValue = System.getProperty("jvm_" + each.getKey());
            if (sysValue != null && !sysValue.trim().isEmpty()) {
                each.setValue(sysValue);
            }
        }
    }
}

以下是xml套件的外观

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="46216357_Suite" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.stackoverflow.qn46216357.ParameterChangerListener"/>
    </listeners>
    <parameter name="name" value="Unknown"/>
    <test name="46216357_test">
        <classes>
            <class name="com.rationaleemotions.stackoverflow.qn46216357.SampleTestClass"/>
        </classes>
    </test>
</suite>

如您所见,我为参数名称

定义了未知的值

因此,如果您只是右键单击套件xml并从您喜欢的IDE运行它,输出将如下所示:

...
... TestNG 6.12 by Cédric Beust (cedric@beust.com)
...
Hello Unknown
PASSED: testMethod("Unknown")

===============================================
    46216357_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
46216357_Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

但是如果你运行相同的套件,通过传入JVM参数-Djvm_name,那么输出将是不同的。这是一个运行输出,其中我传递的值为 Rambo -Djvm_name=Rambo

...
... TestNG 6.12 by Cédric Beust (cedric@beust.com)
...
Hello Rambo
PASSED: testMethod("Rambo")

===============================================
    46216357_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
46216357_Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
  

3)另外从这个参数输入如何调用并行浏览器测试?

我会稍微改变这一点,而是建议您将并行模式作为JVM参数读取,并根据该更改并行执行策略。 您基本上采用了与我上面分享的相同类型的IAlterSuiteListener实现,它可能如下所示:

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

import java.util.List;

public class ParallelExecutorSetter implements IAlterSuiteListener {
    @Override
    public void alter(List<XmlSuite> suites) {
        XmlSuite suite = suites.get(0);
        String parallelMode = System.getProperty("parallelMode");
        XmlSuite.ParallelMode mode = XmlSuite.ParallelMode.getValidParallel(parallelMode);
        if (mode != null) {
            suite.setParallel(mode);
        }
    }
}

因此,您现在可以通过JVM参数传递并行模式。例如,-DparallelMode=methods可以在@Test

中运行您的所有parallel方法