簡體   English   中英

在運行時將數據從Jenkins參數化的版本傳遞到testng.xml

[英]Passing data from Jenkins parameterized build to testng.xml at runtime

我有一個使用Java,Maven和TestNG的瀏覽器自動化框架。 我正在使用testng.xml文件通過以下方式將不同的參數傳遞給測試:

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

我希望能夠向非技術人員公開數據輸入,並建議通過使用參數化的詹金斯工作來做到這一點。

所有測試數據都是字符串。

我可以看到如何在Jenkins中創建參數化項目以及如何在項目中創建String參數。

我不清楚在運行時傳遞數據的最佳方法。

我知道可以使用Ant腳本,但是我已經在使用Maven,並且不想引入另一種相互沖突的技術。

我聽說可以使用testng.xml中的Beanshell腳本來完成此操作,但是從testng docs上的示例中 ,我仍然不清楚如何最好地實現此目的。

解決問題的方法如下。

  • 將您要通過Jenkins傳遞的所有參數添加到套件xml文件中,並為其定義一些默認值。
  • 現在,您在Jenkins作業中創建參數,但要確保作業配置中的參數名稱與在套件xml文件中添加的名稱匹配。
  • 然后,您可以使用如下所示的TestNG偵聽器,然后使用我的這篇博客文章中詳細介紹的方法之一將其連接

之后,您應該可以輕松地完成所需的工作。 如果您具有在<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);
    }
}

您可以在項目中啟用filters情況下使用Maven Resources Plugin目標copy-resources來替換模板文件中的變量。 例:

         <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-> <parameter name="firstName" value="${firstname}"/>

  • 調用maven目標mvn resources:resources -DfirstName=$FIRSTNAME ,其中($ FIRSTNAME)是Jenkins變量。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM