gradle 如何运行默认情况下未标记的kotest?

8i9zcol2  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(168)

在kotest框架中,有一种方法可以使用custom tags对测试进行分组,您可以通过选择通过Gradle参数(如gradle test -Dkotest.tags="TestGroupOne")来运行特定的组
我有两个测试用例,一个有标记,另一个没有标记

object Linux : Tag()

class MyTests : StringSpec({
    "without tag" {
        "hello".length shouldBe 5
    }
    "with tag".config(tags = setOf(Linux)) {
        "world" should startWith("wo2")
    }
})

现在,如果我运行gradle build,它将运行两个测试,但我希望运行默认情况下未标记的测试。
实现此行为的一种方法是在build.gradle.kts文件中添加一个任务

val test by tasks.getting(Test::class) {
    systemProperties = System.getProperties()
        .toList()
        .associate { it.first.toString() to it.second }
    if(!systemProperties.containsKey("kotest.tags"))
        systemProperties["kotest.tags"] = "!Linux"
}

正如您所看到的,当没有为-Dkotest.tags传递参数时,我手动将值!Linux添加到systemProperties,以便build脚本将运行默认情况下未标记的测试。

**问题:**是否有更好的方法来实现这一目标?

我甚至尝试在www.example.com文件中添加systemProp.gradle.kotest.tags="!Linux"gradle.properties,但没有效果。

7fhtutme

7fhtutme1#

你的解决方案不是很健壮,因为你依赖于所使用的具体标记。似乎没有更简单的解决方案,因为标记表达式的语法不允许写类似“!any”的东西。
但是,可以编写一个Kotest扩展来满足您的需求,看起来像这样:

import io.kotest.core.TagExpression
import io.kotest.core.config.ProjectConfiguration
import io.kotest.core.extensions.ProjectExtension
import io.kotest.core.extensions.TestCaseExtension
import io.kotest.core.project.ProjectContext
import io.kotest.core.test.TestCase
import io.kotest.core.test.TestResult
import io.kotest.engine.tags.runtimeTags

object NoTagsExtension : TestCaseExtension, ProjectExtension {
    private lateinit var config: ProjectConfiguration

    override suspend fun interceptProject(context: ProjectContext, callback: suspend (ProjectContext) -> Unit) {
        config = context.configuration
        callback(context)
    }

    override suspend fun intercept(testCase: TestCase, execute: suspend (TestCase) -> TestResult): TestResult {
        return if (config.runtimeTags().expression == TagExpression.Empty.expression) {
            if (testCase.spec.tags().isEmpty() && testCase.config.tags.isEmpty()) {
                execute(testCase)
            } else TestResult.Ignored("currently running only tests without tags")
        } else execute(testCase)
    }
}

第一个函数interceptProject用于获取项目配置,以便确定当前测试运行的指定标记集。
第二个函数intercept用于每个测试用例。在那里我们确定是否指定了任何标签。如果没有指定标签(即我们有一个空标签表达式),我们跳过所有在规范或测试用例中配置了任何标签的测试。否则,我们正常执行测试,然后它可能会被Kotlin的内置机制忽略,这取决于它的标签。
该扩展可以在ProjectConfig中在项目范围内激活:

class ProjectConfig : AbstractProjectConfig() {
    override fun extensions(): List<Extension> = super.extensions() + NoTagsExtension
}

现在,扩展就绪后,默认情况下只运行没有标记的测试,而不管您在项目中使用什么标记。

uhry853o

uhry853o2#

您可以在gradle配置中设置默认标签。例如:

tasks.withType<Test> {
  useJUnitPlatform()
  val tags = System.getProperty("kotest.tags")
  if (tags != null) systemProperties.put("kotest.tags", tags)
  else systemProperties.put("kotest.tags", "YourDefaultTags")
}

相关问题