Kotlin下使用karate-junit-5运行提示no features or scenarios found问题问询
你遇到的报错本质是Karate运行时在指定classpath路径下没有扫描到合法的.feature文件,核心原因是构建工具默认不会处理kotlin源代码目录下的非代码后缀文件:
org.opentest4j.AssertionFailedError: no features or scenarios found: [classpath:sncf/karate]
常规JVM项目(Maven/Gradle)的默认配置中,kotlin源码目录仅会编译.kt后缀的源码文件,.feature、.js等其余后缀文件会被直接忽略,不会拷贝到构建输出的classpath目录。哪怕你把ThreatController.feature和ThreatControllerIT.kt放在同一个源码目录,运行时classpath里只有编译后的.class文件,没有对应的feature文件,因此Karate扫描失败。
另外你当前放在kotlin目录下的karate-config.js也存在相同问题,后续会触发配置找不到的报错,需要同步处理。
方案1:调整文件存放路径(最推荐,符合JVM项目规范)
将.feature文件和karate-config.js移到resources目录下的对应包路径,调整后目录结构如下:
kotlin │ └── sncf │ └── karate │ └── ThreatControllerIT.kt └── resources ├── karate-config.js └── sncf └── karate └── ThreatController.feature
构建工具会自动将resources目录下的所有文件原样拷贝到classpath根目录,Karate通过relativeTo(javaClass)就能匹配到对应路径下的feature文件。
方案2:修改构建配置,保留代码与feature同目录的结构
如果你希望把feature文件和测试代码放在同一个目录,可以修改构建工具的资源拷贝规则,将源码目录下的.feature文件纳入资源处理:
Gradle(Kotlin DSL配置)
sourceSets { test { resources { srcDir("src/test/kotlin") include("**/*.feature", "**/*.js") } } // 如果是单独的集成测试sourceSet,将test替换为对应sourceSet名称即可 }
Maven配置
<build> <testResources> <testResource> <directory>src/test/kotlin</directory> <includes> <include>**/*.feature</include> <include>**/*.js</include> </includes> </testResource> <testResource> <directory>src/test/resources</directory> </testResource> </testResources> </build>
修改完成后执行构建,查看构建输出目录(Gradle对应build/resources/test,Maven对应target/test-classes)下是否存在sncf/karate/ThreatController.feature文件,存在的话重新运行测试即可正常执行。如果仍有异常,可以尝试显式指定feature名称运行:
@Karate.Test fun testThreat(): Karate { return Karate.run("ThreatController").relativeTo(javaClass) }
内容的提问来源于stack exchange,提问作者Robin Leclerc

