groovy 如何使用不同的JVM参数重新运行JUnit测试?

72qzrwbm  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(159)

实际上,我有一些通常在运行时通过JVM参数设置的配置属性。

final props = [
    "-Dproject.debug=true",
    "-Dproject.legacy.function=true",
    "-Dproject.secure.impl=true"
]

以上是一些例子。根据属性的不同,我测试的一些类的操作方式会有所不同,如果启用了project.legacy.function,它将退回到遗留实现,而不是使用现代的实现。

test {
    final props = [
        "-Dproject.debug=true",
        "-Dproject.legacy.function=true",
        "-Dproject.secure.impl=true"
    ]

    jvmArgs props
    useJUnitPlatform()
    testLogging.showStandardStreams = true
}

这是我在gradle中的测试任务。我希望能够以某种方式重新运行它,例如,使用一组不同的jvmArgs,将上面的函数设置为false。我无法在我的任务中找到这样做的方法。我在StackOverflow和其他地方找到的唯一东西演示了如何通过@Repeat或在Test类本身中重新运行JUnit测试。但这对我不起作用,因为我的属性是通过一个最终化的类定义的,并且在内部使用。

class Properties {
    public static final boolean DEBUG = get("project.debug");
    public static final boolean LEGACY_FUNCTION = get("project.legacy.function");
}

在其他地方...

class SomeClass {
    SomeType someMethod(SomeOtherType var1) {
        if (Properties.LEGACY_FUNCTION) {
            // do one thing
        }
        else {
            // do other thing
        }
    }
}

是否有办法重新运行JUnit任务并使其具有不同的属性?
编辑:
为了清楚起见,我将尝试使用伪代码来演示我的意思。

test {
    final props = [
        "-Dproject.debug=true",
        "-Dproject.legacy.function=true",
        "-Dproject.secure.impl=true"
    ]

    jvmArgs props
    useJUnitPlatform()
    testLogging.showStandardStreams = true

    repeat {
        final props2 = [
            "-Dproject.debug=true",
            "-Dproject.legacy.function=false",
            "-Dproject.secure.impl=true"
        ]

        jvmArgs props2
        useJUnitPlatform()
        testLogging.showStandardStreams = true
    }
}

我不介意手动写出true/false(我可能会使用迭代随机数发生器),我真正需要的是知道我是否可以通过gradle脚本以某种形式重新运行测试任务,这样我就只需要执行./gradlew test并让它在我的所有迭代中运行。

qltillow

qltillow1#

您可以传入一个Gradle属性,该属性可用作开关,以确定project.legacy.function应为true还是false。例如:

tasks.named("test", Test::class) {
    val legacyFunction = project.hasProperty("legacyFunction")
    val args = listOf(
        "-Dproject.debug=true",
        "-Dproject.legacy.function=$legacyFunction",
        "-Dproject.secure.impl=true"
    )
    jvmArgs(args)
    useJUnitPlatform()
    testLogging.showStandardStreams = true
}

而以./gradlew -PlegacyFunction的身份执行会导致project.legacy.function变成true。省略属性会使它变成false。

相关问题