猿问

如何在 Jenkins 上的 Gradle 构建中过滤测试而无需提交?

我有一个 Gradle 构建,可以在 Jenkins 上运行一套 Java Selenium 测试。由于计时可能会导致 Selenium 测试失败,因此我会重新运行一两次失败。


为此,我使用 Gradle 的测试过滤机制,例如:


test {

    [...]

    filter {

        includeTestsMatching "*AccountTest.canWithdrawMoney*"

    }

    [...]

}

但这意味着我必须使用过滤器进行 Git 提交。


理论上我也可以使用这样的命令行过滤器:


gradle test --tests "*AccountTest.canWithdrawMoney*"

问题是我不打电话gradle test来运行测试。我调用我自己的任务gradle testLocal或gradle testServer,具体取决于我是在本地 PC 还是 Jenkins 服务器上运行测试,以及相应的任务调用test。


(Jenkins 服务器必须执行额外的操作,例如下载并启动我们的产品;我已经在本地运行它了。)


如果我尝试...


gradle testLocal --tests "*AccountTest.canWithdrawMoney*"

...然后失败了...


未知的命令行选项“--tests”。


...大概是因为testLocal和testServer不是(类型:测试)任务(我也不希望它们成为)。


我很高兴让测试过滤器成为 Jenkins 构建参数,因为构建已经参数化,但我无法找到将过滤器获取到 Gradle 的方法。


那么:鉴于此设置,是否有一种更简单的方法可以将测试过滤器传递到 Gradle,而不需要我将过滤器添加为 Git 提交?


德玛西亚99
浏览 71回答 2
2回答

qq_花开花谢_0

你可以做test {    [...]        def testFilter = findProperty('testFilter')        if (testFilter) {            filter {               includePatterns = testFilter.split(',')            }         }     [...]}并运行使用gradle testLocal -PtestFilter=*AccountTest.canWithdrawMoney*

慕慕森

感谢 lance-java 帮助我实现这一目标,但直到我将其放入任务doFirst中的块中后,我才能使他的解决方案发挥作用test。我还修改了它以适用于多个课程和测试。对我有用的最终版本是:test {    [...]    doFirst {        def testFilter = System.getProperty('testFilter')        if (testFilter) {            def testFilterParts = testFilter.split(',')            testFilterParts.each {                item ->                    filter {                        includeTestsMatching item                    }            }        }    }    [...]}我在 Jenkins testFilter 参数中使用了与此过滤器等效的内容:*TestClassA.methodA*,*TestClassB.methodB*,*TestClassC.methodC*
随时随地看视频慕课网APP

相关分类

Java
我要回答