构建失败,出现异常。 java.lang.AssertionError 将参数传递给 Gradle
Build failed with an exception. java.lang.AssertionError while passing parameter to Gradle
我对向 gradle 构建脚本传递参数有疑问。
首先我有一个硒测试 class:
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"
它启动 Firefox 和 Chrome 没有任何 url。
在我启动上述命令后,我得到了这个异常输出:
FAILURE: Build failed with an exception.
java.lang.AssertionError
您看到的错误说明了一切:
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)
不是有效的 表达式 ,returns 意外结果(可能是 NULL或 NullPointerException),这不是 assertEquals
的有效参数类型。因此,assertEquals
失败,您会看到 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
我对向 gradle 构建脚本传递参数有疑问。 首先我有一个硒测试 class:
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"
它启动 Firefox 和 Chrome 没有任何 url。
在我启动上述命令后,我得到了这个异常输出:
FAILURE: Build failed with an exception.
java.lang.AssertionError
您看到的错误说明了一切:
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)
不是有效的 表达式 ,returns 意外结果(可能是 NULL或 NullPointerException),这不是 assertEquals
的有效参数类型。因此,assertEquals
失败,您会看到 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