How to pass java code a parameter from maven for testing

后端 未结 6 1425
故里飘歌
故里飘歌 2020-11-30 03:17

I need to pass on following values …

exeEvironment (Test environment) , testGroup (Group in testNG)

from Command-Line ->

相关标签:
6条回答
  • 2020-11-30 03:49

    This is the exact thing I was looking for my automation test and I got it working.

    Command Line argument

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

    My 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 test

    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);
        }
    }
    

    The above works well. Additionally, if you need to use testng.xml, you can specify the 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>
    

    Also, I prefer using @Parameters instead of parameters in @Test() as the later is deprecated.

    0 讨论(0)
  • 2020-11-30 03:51

    building on the accepted answer

    if maven surefire and the <systemPropertyVariables> are declared in a maven profile, they are not available and will return null unless the profile is also invoked.

    Command Line argument

    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>
    
    0 讨论(0)
  • 2020-11-30 03:52

    Passing parameter like browser and other can be done as below :

    <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>
    

    and to handle this in java code use this :

     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;   
        }
    
    0 讨论(0)
  • 2020-11-30 03:57

    You need not define anything for groups in testng xml or the pom, the support comes inbuilt. You can simply specify the groups on the cmd line http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#groups

    Hope it helps..

    Edit 2:

    Ok..so here's another option...Implement IMethodInterceptor

    Define your custom property. Use -Dcustomproperty=groupthatneedstoberun in your command line call.

    In the intercept call, scan through all methods ..something to the effect..

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

    Add this to the listeners list in your xml.

    0 讨论(0)
  • 2020-11-30 03:58

    You don't need to use environment variables or edit pom.xml to use them.

    The goals and options for Invoke Maven 3 under Build section takes the parameter. Try this (assuming you parameterized the build):

    Invoke Maven 3
      Goals and options = test -Denv=$PARAM_ENV -Dgroup=$PARAM_GROUP
    
    0 讨论(0)
  • 2020-11-30 04:03

    Perfect.

    The simplest way to pass the variable from POM.xml to ABC.java

    POM.xml

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

    And in the ABC.java we can call it from the system properties like this

    System.getProperty("hostName")
    
    0 讨论(0)
提交回复
热议问题