首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何运行默认未标记的kotest?

如何运行默认未标记的kotest?
EN

Stack Overflow用户
提问于 2022-09-14 12:16:07
回答 1查看 124关注 0票数 1

在kotest框架中,有一种使用自定义标签对测试进行分组的方法,您可以通过选择gradle test -Dkotest.tags="TestGroupOne"之类的Gradle参数来运行特定的组

我有两个测试用例,一个带有标记,另一个没有标记。

代码语言:javascript
复制
object Linux : Tag()

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

现在,如果我运行gradle build,它会同时运行两个测试,但是我希望运行默认没有标记的测试。在上面的示例中,如果在without tag中没有传递参数,则测试gradle应该运行。

实现此行为的一种方法是在build.gradle.kts文件中添加任务

代码语言:javascript
复制
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脚本将运行默认情况下没有标记的测试。

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

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

EN

回答 1

Stack Overflow用户

发布于 2022-09-14 17:55:25

从某种意义上讲,您的解决方案并不是非常健壮,因为您依赖于所使用的具体标记。似乎没有更简单的解决方案,因为标记表达式的语法不允许编写类似于“任何”的东西。

但是,可以为所需的内容编写一个Kotest扩展,如下所示:

代码语言:javascript
复制
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中激活整个项目。

代码语言:javascript
复制
class ProjectConfig : AbstractProjectConfig() {
    override fun extensions(): List<Extension> = super.extensions() + NoTagsExtension
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73716701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档