【问题标题】:Passing data from Jenkins parameterized build to testng.xml at runtime在运行时将数据从 Jenkins 参数化构建传递到 testng.xml
【发布时间】:2017-03-30 10:25:54
【问题描述】:

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

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

我希望能够向非技术人员公开数据输入,并建议通过使用参数化的 Jenkins 作业来做到这一点。

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

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

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

我知道可以使用 Ant 脚本,但我已经在使用 Maven,不想引入其他冲突技术。

我听说这可以使用 testng.xml 中的 Beanshell 脚本来完成,但是从 testng docs 上的示例来看,我仍然不清楚如何最好地实现这一点。

【问题讨论】:

    标签: java maven jenkins automation testng


    【解决方案1】:

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

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

    之后,您应该能够轻松地做您需要的事情。如果您有在&lt;test&gt; 级别定义的参数,那么您可以增强我在下面显示的侦听器,并在实现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);
        }
    }
    

    【讨论】:

    • 这个解决方案看起来很适合通过 jenkins 传递参数,但是如果我想通过 jenkins 传递套件名称怎么办--like - 。在这里,我如何从 Jenkins Job 传递这个 BUILD_NUMBER?
    【解决方案2】:

    您可以在项目中使用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 --> &lt;parameter name="firstName" value="${firstname}"/&gt;

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

    希望这会有所帮助。

    【讨论】:

    • 这有助于部分,但我仍然不清楚:- 1. 如何在 Jenkins 项目配置 2 中使用 Jenkins 参数传递数据。这似乎是一种不切实际的传递大数据的方法参数数量 - 我的一些 testng_xml 文件有超过 50 个参数 3. 组合的 maven 目标是什么,因为我已经使用 clean install -DsuiteFile=src/test/resources/testng_staging.xml 调用
    猜你喜欢
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2021-08-30
    相关资源
    最近更新 更多