在运行时将Jenkins参数化构建的数据传递给testng.xml

时间:2016-11-16 09:33:38

标签: java maven jenkins automation testng

我有一个使用Java,Maven和TestNG的浏览器自动化框架。我使用testng.xml文件以下列方式将不同的参数传递给测试:

<parameter name="firstName" value="John"/> 

我希望能够向非技术人员公开数据输入,并建议使用参数化的Jenkins作业来完成此操作。

所有测试数据都是字符串。

我可以看到如何在Jenkins中创建参数化项目,并且可以在项目中创建String参数。

我不清楚在运行时传递数据的最佳方法。

我理解可以使用Ant脚本,但我已经在使用Maven,并且不想引入另一种冲突技术。

我听说过这可以在testng.xml中使用Beanshell脚本完成,但是从testng docs的示例中,我还不清楚如何最好地实现它。

2 个答案:

答案 0 :(得分:2)

以下是解决此问题的方法。

  • 将要通过Jenkins传递的所有参数添加到套件xml文件中,并为其定义一些默认值。
  • 在Jenkins作业中,您现在可以创建参数,但要确保作业配置中参数的名称与您在套件xml文件中添加的名称相匹配。
  • 然后使用如下所示的TestNG侦听器,然后使用我this blog post中详述的方法之一将其连接起来

之后,您应该能够轻松地完成您的需要。如果您的参数定义为<test>级别,那么您可以增强我在下面显示的监听器,并在实现org.testng.ITestListener监听器后添加类似的代码。

<强>监听

public class EnvReaderListener implements ISuiteListener {

    @Override
    public void onStart(ISuite suite) {
        Map<String, String> parameters = suite.getXmlSuite().getParameters();
        for (Map.Entry<String, String> parameter : parameters.entrySet()) {
            String env = System.getenv(parameter.getKey());
            if (env != null && ! env.trim().isEmpty()) {
                parameter.setValue(env);
            }
        }
    }

    @Override
    public void onFinish(ISuite suite) {

    }
}

TestNG套件xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="My Suite" parallel="methods" verbose="2">
    <listeners>
        <listener class-name="org.rationale.emotions.EnvReaderListener"/>
    </listeners>
    <parameter name="name" value="Sample name"/>
    <test name="My Test" verbose="2">
        <classes>
            <class name="org.rationale.emotions.SampleTest"/>
        </classes>
    </test>
</suite>

根据此示例,您需要确保您的作业具有名为name的参数。

示例测试类

package org.rationale.emotions;

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

public class SampleTest {
    @Test
    @Parameters ("name")
    public void testMethod(String name) {
        System.err.println("Name that was passed in via Jenkins job " + name);
    }
}

答案 1 :(得分:0)

您可以在项目中使用Maven Resources Plugin目标copy-resources并启用filters来替换模板文件中的变量。 例如:

         <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.1</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>path_to_output_folder/output</outputDirectory>
                        <resources>          
                            <resource>
                                <directory>path_to_resource_dir/res</directory> <!--source to your testng.xml-->
                                <filtering>true</filtering>
                            </resource>
                        </resources>              
                    </configuration>            
                </execution>
            </executions>
        </plugin>

在你的情况下使用jenkins:

  • 更改您的testng.xml - &gt; <parameter name="firstName" value="${firstname}"/>

  • 调用maven目标mvn resources:resources -DfirstName=$FIRSTNAME,其中($ FIRSTNAME)是Jenkins变量。

希望这会有所帮助。