如何从maven传递java代码一个参数进行测试

Posted

技术标签:

【中文标题】如何从maven传递java代码一个参数进行测试【英文标题】:How to pass java code a parameter from maven for testing 【发布时间】:2012-10-26 01:46:44 【问题描述】:

我需要传递以下值……

exeEvironment(测试环境), testGroup(testNG 中的组)

从命令行 -> POM -> TestNG -> 测试用例。

基于这两个帖子....

pass a java parameter from maven

How to pass parameters to guicified TestNG test from Surefire Maven plugin?

我做了如下配置..

surefire 插件 中,我尝试了以下两个选项,但似乎都不起作用。

=====

(1)

  <execution>
<id>default-test</id>
    <goals>
        <goal>test</goal>
    </goals>
    <configuration>
        <properties>
            <exeEnvironment>$exeEnvironment</exeEnvironment>
            <testGroup>$testGroup</testGroup>
        </properties>
        <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
        </suiteXmlFiles>
    </configuration>
</execution>

(2)

<execution>
<id>default-test</id>
<goals>
    <goal>test</goal>
</goals>
<configuration>
    <systemPropertyVariables> <exeEnvironment>$exeEnvironment</exeEnvironment> 
        <testGroup>$testGroup</testGroup> </systemPropertyVariables> 
    <suiteXmlFiles>
        <suiteXmlFile>testng.xml</suiteXmlFile>
    </suiteXmlFiles>
</configuration>
</execution>

testNG.xml 中,我可以使用变量testGroup 像...

<test name="Web Build Acceptance">
    <groups>
        <run>
            <include name="$testGroup />
        </run>
    </groups>
    <classes>
        <class name="com.abc.pqr" />
    </classes>
</test>

这个好像也不行,是不是需要定义一个参数。


测试用例中,我尝试通过以下两种方式获取变量……。 (1)

testEnv = testContext.getSuite().getParameter("exeEnvironment");
testGroup = testContext.getSuite().getParameter("testGroup");

(2)

testEnv = System.getProperty("exeEnvironment");
testGroup = System.getProperty("testGroup");

【问题讨论】:

【参考方案1】:

这正是我正在寻找自动化测试的东西,并且我得到了它的工作。

命令行参数

mvn clean test -Denv.USER=UAT -Dgroups=Sniff

我的 Pom Xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>TestNg</groupId>
    <artifactId>TestNg</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <systemPropertyVariables>
                        <environment>$env.USER</environment>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

TestNG 测试

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


public class TestAuthentication 

    @Test (groups =  "Sniff", "Regression" )
    public void validAuthenticationTest()
        System.out.println(" Sniff + Regression" + System.getProperty("environment"));
    

    @Test (groups =  "Regression" ,parameters = "environment")
    public void failedAuthenticationTest(String environment)
        System.out.println("Regression-"+environment);
    

    @Parameters("environment")
    @Test (groups =  "Sniff")
    public void newUserAuthenticationTest(String environment)
        System.out.println("Sniff-"+environment);
    


上面的效果很好。另外,如果需要使用testng.xml,可以指定suiteXmlFile like ...

      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <systemPropertyVariables>
                    <environment>$env.USER</environment>
                </systemPropertyVariables>
                <suiteXmlFiles> 
                    <suiteXmlFile>testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>

另外,我更喜欢在 @Test() 中使用 @Parameters 而不是 parameters,因为后者已被弃用。

【讨论】:

看起来很有希望,让我试试再回来。感谢分享。 对了,你在这里用testng.xml吃了吗? 我没有使用testng.xml,顺便说一下你不需要在POM文件中添加参数。 mvn clean test -Denvironment=QA -Dgroups=Regression if you use this 1. 只有回归组会被执行 (@Test(groups = "Sniff", "Regression" ) 2. @Parameters("environment") - value “QA”将直接传递给您的测试 运行顺利,顺便说一句,您需要使用 mvn clean test "-D..​​." 执行 如果您想传递多个参数,可以用逗号分隔它们,例如@Parameters("param1","param2")【参考方案2】:

您不需要在 testng xml 或 pom 中为组定义任何内容,支持是内置的。您可以简单地在 cmd 行上指定组 http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#groups

希望对你有帮助..

编辑 2:

好的..所以这是另一个选项...实现IMethodInterceptor

定义您的自定义属性。 在命令行调用中使用 -Dcustomproperty=groupthatneedstoberun。

在拦截调用中,扫描所有方法..有什么效果..

System.getProperty("customproperty");
for(IMethodInstance ins : methods) 
    if(ins.getMethod().getGroups()) contains group)
        Add to returnedVal;
    
return returnedVal;

将此添加到您的 xml 中的侦听器列表中。

【讨论】:

感谢您的回答,您是正确的,组是在surefire pom 插件中内置的,但如果我指定我指定的suiteXMLFile,它将被忽略。所以基本上我想在命令行上动态地向 POM 提供组,它应该能够使用 testNG 运行这些测试。请问还有其他的想法吗?【参考方案3】:

完美。

将变量从 POM.xml 传递到 ABC.java 的最简单方法

POM.xml

<properties>
   <hostName>myhostname.com</hostName>
</properties>

ABC.java 中,我们可以像这样从系统属性中调用它

System.getProperty("hostName")

【讨论】:

16:20:15,676 DEBUG TestApp:21 - hostname: null 这对我来说也失败了一个“null”【参考方案4】:

传递浏览器等参数可以如下完成:

<properties>    
    <BrowserName></BrowserName>
    <TestRunID></TestRunID>
</properties>



        <!-- Below plug-in is used to execute tests -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/$testXml</suiteXmlFile>
                </suiteXmlFiles>
                <systemPropertyVariables>
                  <browserName>$BrowserName</browserName>
                    <testRunID>$TestRunID</testRunID> 
                </systemPropertyVariables>
            </configuration>
            <executions>
                <execution>
                    <id>surefire-it</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skip>false</skip>
                        <testFailureIgnore>true</testFailureIgnore>
                    </configuration>
                </execution>
            </executions>
        </plugin>

并在 java 代码中处理这个使用这个:

 public static final String Browser_Jenkin=System.getProperty("BrowserName");
    public static final String TestRunID=System.getProperty("TestRunID");

  public static String browser_Setter()
    
        String value=null;
        try 
            if(!Browser_Jenkin.isEmpty())
            
                value = Browser_Jenkin;
            
         catch (Exception e) 
            value =propObj.getProperty("BROWSER");
        
        return value;   
    

    public static String testRunID_Setter()
    
        String value=null;
        try 
            if(!TestRunID.isEmpty())
            
                value = TestRunID;
            
         catch (Exception e) 
            value =propObj.getProperty("TEST_RUN_ID");
        
        return value;   
    

【讨论】:

【参考方案5】:

您无需使用环境变量或编辑 pom.xml 即可使用它们。

Build 部分下 Invoke Maven 3 的目标和选项采用参数。试试这个(假设你参数化了构建):

Invoke Maven 3
  Goals and options = test -Denv=$PARAM_ENV -Dgroup=$PARAM_GROUP

【讨论】:

【参考方案6】:

基于accepted answer

如果 maven surefire 和 &lt;systemPropertyVariables&gt; 在 maven 配置文件中声明,则它们不可用并且将返回 null,除非还调用了配置文件。

命令行参数

mvn clean test -PmyTestProfile -Denv.USER=UAT -Dgroups=Sniff 

pom.xml

<profiles>
    <profile>
        <id>myTestProfile</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>$surefire.version</version>
                    <configuration>
                        <systemPropertyVariables>
                            <environment>$env.USER</environment>
                        </systemPropertyVariables>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

【讨论】:

以上是关于如何从maven传递java代码一个参数进行测试的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Maven 将“-J”选项传递给 javac?

如何在 IDE 之外运行/执行 java 代码(maven 项目)

通过 Gradle 运行 Java 类时传递系统属性和参数的问题

通过 Gradle 运行 Java 类时传递系统属性和参数的问题

maven中运行java程序

React 组件上调用方法如何传递参数,除了匿名函数用更好的方法吗