您所看到的错误说明了一切:
我有一个关于将参数传递给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
问题出在您的代码中。
问题的症结在于您的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 Properties的Java文档
,则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
assertEquals
的有效参数类型。因此,assertEquals
失败并且您看到一个java.lang.AssertionError。您所看到的错误说明了一切: