Android Studio 如何使Cucumber功能在Android项目中作为本地单元测试运行?

eulz3vhy  于 2023-08-07  发布在  Android
关注(0)|答案(3)|浏览(151)

我有一个用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'

字符串
1.另外,我还添加了路径,我把我的功能文件:

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


这基于以下文件夹结构:


的数据
1.为步骤(Steps1.java)添加了一个类,如上所示。
我错过了什么?

von4xj4u

von4xj4u1#

您的功能文件可能不会被拾取,因为您没有包括跑步者。您可以创建JUnit Runner或使用Gradle cucumber plugin。我不确定这两种方式是否适用于Android。
你也不需要io.cucumber:cucumber-jvm:3.0.2作为依赖项。这只是一个pom。

djp7away

djp7away2#

我已经发现了如何配置我的Android应用程序,以便在从命令行运行gradlew test时将Cucumber测试作为“本地单元测试”运行。这是基于我的SO question here,我写了一篇关于它的“HOWTO”博客文章:Android: Run Cucumber tests without a device or an emulator
完成此操作的关键在应用程序的build.gradle文件中。通过锁定testOptions部分中的unitTests.all钩子,我可以使用javaexec运行Cucumber,如下所示:

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']
            }
        }
    }
)

字符串

mctunoxg

mctunoxg3#

或者还有另一种方法直接从自定义运行器运行android单元测试。这是KotlinAndroid项目最简单的方法。
在我的应用级build.gradle中

dependencies {
   //Cucumber
   testImplementation("io.cucumber:cucumber-java:7.13.0")
   testImplementation("io.cucumber:cucumber-junit:7.13.0")
   testImplementation("io.cucumber:cucumber-jvm:7.13.0")
}

字符串
然后,如下图所示,我设法通过CucumberTestRunner绿色运行箭头运行了一个 cucumber 场景。
x1c 0d1x的数据

源代码示例

对于任意实体数据类UserEntity.kt

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")
data class UserEntity(
    @PrimaryKey val id: Int,
    val name: String
)


我首先创建了一个名为UserEntityBdd.feature的特性文件,

Feature: UserEntity class behavior

  Scenario: Create a new UserEntity
    Given a user ID
    And a user name
    When a UserEntity is created
    Then the UserEntity should have the given ID and name


然后,对应的步骤定义文件名为UserEntityStepDefinitions.kt

import com.example.mvvm.datalayer.model.UserEntity
import io.cucumber.java.en.Given
import io.cucumber.java.en.Then
import io.cucumber.java.en.When
import org.junit.Assert.assertEquals
import kotlin.properties.Delegates

class UserEntityStepDefinitions {
    private var userId by Delegates.notNull<Int>()
    private lateinit var userName: String
    private lateinit var userEntity: UserEntity

    @Given("a user ID")
    fun givenUserId() {
        userId = 123
    }

    @Given("a user name")
    fun givenUserName() {
        userName = "John Doe"
    }

    @When("a UserEntity is created")
    fun createUserEntity() {
        userEntity = UserEntity(userId, userName)
    }

    @Then("the UserEntity should have the given ID and name")
    fun checkUserEntity() {
        assertEquals(userId, userEntity.id)
        assertEquals(userName, userEntity.name)
    }
}


最后是CuccumberCustomRunner,名为CucumberTestRunner.kt,作为

import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith

@RunWith(Cucumber::class)
@CucumberOptions(
    features = ["."], // The package where your feature files are located
    glue = ["."], // The package where your step definitions are located
    plugin = ["pretty", "html:reports/test-report"] // Report plugins
)
class CucumberTestRunner


这样做使我不需要将groovy snippet下面的/port转换为kts

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']
            }
        }
    }

相关问题