如何将 Android 项目中的 Cucumber 特性 运行 作为本地单元测试?

How to make Cucumber features run in an Android project as local unit tests?

我有一个用 Java 编写的 Android 项目,我正在 Android Studio 中进行。

我想使用 Cucumber 对一些内部组件进行集成测试(注意:我知道这不是 BDD 方式,但对我来说还是有用的)。我希望使用 gradlew test 将测试 运行 作为 local unit tests(没有 Instrumentation),因为被测组件不与 Android SDK 交互。

我的问题是 Gradle 无法识别 Cucumber 功能,当我 运行 gradlew test.

到目前为止我是这样设置的:

  1. 将这些依赖项添加到我的应用程序 build.gradle:

    testImplementation 'io.cucumber:cucumber-java:3.0.2'
    testImplementation 'io.cucumber:cucumber-junit:3.0.2'
    testImplementation 'io.cucumber:cucumber-jvm:3.0.2'
    
  2. 另外,我添加了我放置特征文件的路径:

    android {
        ...
        sourceSets {
            test {
                assets.srcDirs = ['src/test/java/integrationTest/assets']
            }
        }
    }
    

    这是基于以下文件夹结构:

  3. 如上所示为步骤 (Steps1.java) 添加了 class。

我在这里错过了什么?

您的功能文件可能没有被选取,因为您没有包含跑步者。您可以创建 JUnit Runner or use the Gradle cucumber plugin。不过,我不确定两者是否都适用于 Android。

此外,您不需要 io.cucumber:cucumber-jvm:3.0.2 作为依赖项。这只是一个pom。

当我从命令 运行 gradlew test 时,我发现了如何将我的 Android 应用程序配置为 运行 我的 Cucumber 测试为 "local unit tests"线。这是基于我的 and I've written a "HOWTO" blog post about it here: Android: Run Cucumber tests without a device or an emulator.

完成它的关键在应用程序的 build.gradle 文件中。通过锁定 testOptions 部分中的 unitTests.all 挂钩,我可以使用 javaexec 运行 黄瓜,如下所示:

android {
    ...
    testOptions {
        unitTests.all {
            def classpath2 = getClasspath()
            javaexec {
                main = "cucumber.api.cli.Main"
                classpath = classpath2
                args = ['--plugin', 'pretty', '--glue', 'gradle.cucumber', 'src/test/java/cucumber/assets']
            }
        }
    }
)