为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2023-09-13 17:59:30
我有一个 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 提交?
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

你可以做


test {

    [...]

        def testFilter = findProperty('testFilter')

        if (testFilter) {

            filter {

               includePatterns = testFilter.split(',')

            } 

        } 

    [...]

}

并运行使用


gradle testLocal -PtestFilter=*AccountTest.canWithdrawMoney*


查看完整回答
反对 回复 2023-09-13
?
慕慕森

TA贡献1856条经验 获得超17个赞

感谢 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*


查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信