在kotest框架中,有一种使用自定义标签对测试进行分组的方法,您可以通过选择gradle test -Dkotest.tags="TestGroupOne"之类的Gradle参数来运行特定的组
我有两个测试用例,一个带有标记,另一个没有标记。
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文件中添加任务
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,但是没有效果。
发布于 2022-09-14 17:55:25
从某种意义上讲,您的解决方案并不是非常健壮,因为您依赖于所使用的具体标记。似乎没有更简单的解决方案,因为标记表达式的语法不允许编写类似于“任何”的东西。
但是,可以为所需的内容编写一个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
}现在,在扩展到位之后,不管您在项目中使用了什么标记,默认情况下只运行没有标记的测试。
https://stackoverflow.com/questions/73716701
复制相似问题