将参数传递给gradle

问题描述 投票:1回答:2

我有一个关于将参数传递给gradle构建脚本的问题。首先,我有一个硒测试课:

public class TestHH extends HHTest{

    @Parameters({ "platform", "browser", "version"})
    @BeforeTest(alwaysRun = true)
    public void setup(String platform, String browser, String url, String version) throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setPlatform(org.openqa.selenium.Platform.WIN10);
        System.setProperty("java.net.preferIPv4stack", "true");
        caps.setCapability("SeleniumTests", "redhat5 && amd64");

        assertEquals(System.getProperty(url), url);

        if (browser.equalsIgnoreCase("firefox")) {
            System.out.println("Executing on Firefox");
            String Hub = "http://localhost:4444/wd/hub";

            caps = DesiredCapabilities.firefox();
            caps.setBrowserName("firefox");

            System.setProperty("webdriver.gecko.driver", "/opt/geckodriver.exe");

            driver = new RemoteWebDriver(new URL(Hub), caps);

            driver.navigate().to(url);
            driver.manage().window().maximize();

        } else if (browser.equalsIgnoreCase("chrome")) {
            System.out.println("Executing on Chrome");
            String Hub = "http://localhost:4444/wd/hub";

            caps = DesiredCapabilities.chrome();
            caps.setBrowserName("chrome");
            ChromeOptions options = new ChromeOptions();
            System.setProperty("webdriver.chrome.driver", "/opt/chromedriver.exe");
            caps.setCapability(ChromeOptions.CAPABILITY, options);

            options.addArguments("--start-maximized");
            driver = new RemoteWebDriver(new URL(Hub), caps);
            driver.navigate().to(url);
        } else {
            throw new IllegalArgumentException("The Browser Type is undefined");
        }
    }

这是我的build.gradle脚本:

apply plugin: 'java'
apply plugin: 'eclipse'


jar {
    version  '1.0'
    baseName 'SeleniumStarter'
    extension '.jar'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8


description = ""

repositories {

    mavenCentral()
    mavenLocal() 
}

ext.seleniumVersion = '3.7.1'

dependencies {
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-server', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-edge-driver', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-firefox-driver', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-api', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version:seleniumVersion

    compile group: 'org.uncommons', name: 'reportng', version:'1.1.4'
    testCompile group: 'junit', name: 'junit', version:'4.12'
    testCompile group: 'org.testng', name: 'testng', version:'6.11'
}

test {

    systemProperties(System.getProperties())
     println 'test'
     println System.properties['url'] // print for testing purposes 

     systemProperty 'url', System.getProperty('url')
     useTestNG() {
       suites 'src/test/resources/TestHH.xml'

     }

 }

eclipse {
  classpath {
  containers 'org.springsource.ide.eclipse.gradle.classpathcontainer'}
}

// A custom task to show report on tests that have run
task viewResults(dependsOn: ['test'] , type:Exec) {
        workingDir './build/reports/tests'      
        commandLine 'cmd', '/c', 'start index.html' 
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.10' //we want gradle 2.10 to run this project
}

task logInfo (dependsOn: test){
    logging.captureStandardOutput LogLevel.INFO
    doLast {

        println 'test'
        println System.properties['url']
        println 'url'



    }

}

我正在尝试使用gradle命令传递的参数是一个url。我通过使用testng xml文件传递其他参数,例如平台,浏览器,版本。

我启动以下命令来传递必需的参数,但是它不起作用。

  gradle test -Durl="http://live-test1.hamburg.de"

它启动没有任何URL的Firefox和Chrome。

启动上述命令后,我得到的输出异常:

FAILURE:构建失败,出现异常。java.lang.AssertionError

selenium-webdriver parameter-passing testng build.gradle gradle-eclipse
2个回答
1
投票

问题出在您的代码中。

问题的症结在于您的setup()方法中的语句。

您有

assertEquals(System.getProperty(url), url);

此行的问题是System.getProperty()接受字符串常量作为要为其检索值的键。

所以理想情况下,因为您是通过命令行从命令行传递JVM值的,所以>

gradle test -Durl="http://live-test1.hamburg.de"

注意,您的JVM参数的名称为“ url”

您的Java代码应通过]读取此JVM参数的值>

System.getProperty("url")

而不是通过

System.getProperty(url)

前一条语句指示Java从传递的JVM参数列表中查询"url"的值。

后一条语句指示Java从JVM参数列表中查询键,该键可以是任何值[由于url是变量]。

所以请更改

assertEquals(System.getProperty(url), url);

assertEquals(System.getProperty("url"), url);

我还注意到您的setup()方法中的参数数量不匹配。

当前读为

@Parameters({ "platform", "browser", "version"})
@BeforeTest(alwaysRun = true)
public void setup(String platform, String browser, String url, String version) throws MalformedURLException {
...
}

因此,您指示TestNG从套件xml文件的<parameters>值中注入3个参数值,但是您的方法实际上包含4个参数。因此,TestNG不知道要为变量String url注入什么,并因此引发如下所示的异常

org.testng.TestNGException: 
Parameter 'url' is required by BeforeTest on method beforeTest but has not been marked @Optional or defined

您所看到的错误说明了一切:

java.lang.AssertionError

您已尝试在行中调用System.getProperty(url)

assertEquals(System.getProperty(url), url);

如果您查看System PropertiesJava文档

,则Properties对象支持以下系统属性
  • "file.separator"
  • "java.class.path"
  • "java.home"
  • "java.vendor"
  • "java.vendor.url"
  • "java.version"
  • "line.separator"
  • "os.arch"
  • "os.name"
  • "os.version"
  • "path.separator"
  • "user.dir"
  • "user.home"
  • ""user.name""
  • 很显然,System.getProperty(url)不是有效的expression,它返回意外结果(可能是NULL

NullPointerException),这不是assertEquals的有效参数类型。因此,assertEquals 失败并且您看到一个java.lang.AssertionError

1
投票

您所看到的错误说明了一切:

© www.soinside.com 2019 - 2024. All rights reserved.