当前位置: 首页 > 知识库问答 >
问题:

如何在Android上运行cucumber测试

仉昱
2023-03-14
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 30
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.sampleapp.cucumber"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testApplicationId "com.sampleapp.cucumber.test"
        testInstrumentationRunner "io.cucumber.android.runner.CucumberAndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets {
        androidTest {
            assets.srcDirs = ['src/androidTest/assets']
        }
    }

    testOptions {
        execution 'ANDROIDX_TEST_ORCHESTRATOR'
    }
}


dependencies {
    implementation Kotlin.stdlib
    implementation Kotlin.ktxCore
    implementation AndroidSupport.appCompat
    implementation AndroidSupport.constraintLayout
    androidTestImplementation AndroidTest.rules
    androidTestImplementation AndroidTest.ext
    androidTestImplementation AndroidTest.runner
    androidTestImplementation AndroidTest.cucumber
    androidTestImplementation AndroidTest.espressoCore
    androidTestImplementation AndroidTest.orchestrator

}

class AndroidTest {
    public static rules = "androidx.test:rules:${Version.testCore}"
    public static runner = "androidx.test:runner:${Version.testCore}"
    public static ext = "androidx.test.ext:junit:${Version.testExt}"
    public static espressoCore = "androidx.test.espresso:espresso-core:${Version.espresso}"
    public static orchestrator = "androidx.test:orchestrator:${Version.orchestrator}"
    public static cucumber = "io.cucumber:cucumber-android:${Version.cucumber}"
}

class Kotlin {
    public static stdlib = "org.jetbrains.kotlin:kotlin-stdlib:${Version.kotlin}"
    public static ktxCore = "androidx.core:core-ktx:${Version.ktx}"
}

class AndroidSupport {
    public static appCompat = "androidx.appcompat:appcompat:${Version.appCompat}"
    public static constraintLayout = "androidx.constraintlayout:constraintlayout:${Version.constraintLayout}"
}


class Version {
    public static testCore = "1.3.0"
    public static testExt= "1.1.2"
    public static espresso = "3.3.0"
    public static cucumber = "4.3.0"
    public static orchestrator = "1.1.0"
    public static appCompat = "1.1.0"
    public static constraintLayout = "1.1.3"
    public static kotlin = "1.4.0"
    public static ktx = "1.3.0"

}
@Suppress("unused")
@CucumberOptions(
        features = [
            "features"
        ],
        glue = ["com.sampleapp.cucumber.test"],
        tags = ["@android", "~@manual"],
)
class CucumberOptionClass
Feature: Feature description

  @ios @android
  Scenario: Scenario description
    Given Something is true
    When Something happens
    Then Something is true and something happens

步骤的定义:

class SomeTestImplementation {

    private lateinit var context: Context

    @Before
    fun setUp() {
        context = InstrumentationRegistry.getInstrumentation().targetContext
    }

    @Given("Something is true")
    fun somethingIsTrue() {
    }

    @When("Something happens")
    fun somethingHappens() {
    }

    @Then("Something is true and something happens")
    fun somethingIsTrueAndSomethingHappens() {
        assertTrue(false)
    }
}

这是文件夹的结构

--main
    --java
        --app.package
            MainActivity
--androidTest
    --java
        --app.package.test 
            --steps
                --example
                    SomeTestImplementation
            CucumberOptionClass
    --assets
        --features
            Sample.features

当我运行./gradlew clean connectedcheck时,我得到错误:

context = InstrumentationRegistry.getInstrumentation().targetContext

在步骤的定义中,我仍然从命令行得到相同的错误,但是当我在AS中运行它时,测试成功地运行了(它显示了最后一步的失败,但这是意料之中的)。

如果我用AndroidJunitRunner替换Runner,并添加一个non-cucumber测试,那么一切都正常:我也可以获取上下文。

如果从命令行执行以下步骤:

./gradlew assemble
./gradlew assembleAndroidTest
adb install ./app/build/outputs/apk/debug/app-debug.apk  
adb install ./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
adb shell pm list instrumentation | grep sampleapp
adb shell am instrument -w com.sampleapp.cucumber.test/io.cucumber.android.runner.CucumberAndroidJUnitRunner

instrumentation_result:shortmsg=进程崩溃。Instrumentation_Code:0

我还试图删除标记,以减少在CLI上运行时查找测试的问题

共有1个答案

汪鸿志
2023-03-14

我设法让它起作用了,换了跑步者:

我定义了:

class SampleAppCucumberAndroidJUnitRunner : CucumberAndroidJUnitRunner()

然后我在构建中使用了它。gradle:

testInstrumentationRunner "com.sampleapp.cucumber.test.SampleAppCucumberAndroidJUnitRunner"
 类似资料:
  • 我正在尝试使用IntelliJ Community edition和Gradle5.5.1运行一个Cucumber/Selenium项目。 我的TestRunner类如下:

  • 如何使用Maven在以下位置运行cucumber测试。 源文件夹'src/main/java'和'src/main/resources'包括在每个源文件夹中创建的包'com.testing.testproject.login'中的步骤定义和功能文件。 这是我的POM文件: 提前道谢。

  • 我目前有一个cucumber的考试数量,它们都在一个特定的标签下,以便这些特定的可以再次运行,一旦我对我的更改感到满意,它们就会被更改为更通用的,它们作为CI套件的一部分运行等。 我当前用于运行该组测试的命令是: 我可以在这个命令中添加什么,以使这些特定的测试在循环中运行?i、 e.我想在这个标签下运行这些特定的测试,比如20次(而不是每次都要等待完成并手动输入命令)。 我试着四处寻找一些例子,但

  • 我正在使用cucumber测试和testng,我计划并行运行测试。我以前有使用testng框架和并行执行的经验,如果不使用mavensurfire插件(pom.xml),我如何实现相同的效果 我的配置, Cucumber JVM,TestNGCucumberRunner。用于触发特性文件的java文件

  • 我目前正在尝试使用Cucumber实现并行测试运行。我设法使用万无一失的插件同时运行了两个不同的运行程序。现在我想检查是否可以并行运行SingleRunner文件多次。 我有一个签名测试。所以我需要在几个平台上并行运行。有可能吗? 这是我的跑步者档案 无跑道进近 工厂级 `导入org . open QA . selenium . web driver; ` 阶梯班 导入org.openqa.sel

  • 有没有人能告诉我为什么我不能使用Maven运行任何测试。 已配置SureFire插件 在runner类下设置胶合代码 “测试”被追加到runner类 注意:如果我将文件作为Junit运行,那么它可以正确地运行所有场景。只有当我使用Maven运行它时,才不会运行任何测试。