构建失败,出现异常。 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 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) 不是有效的 表达式 ,returns 意外结果(可能是 NULLNullPointerException),这不是 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