在Android 4.4上运行Espresso测试?

时间:2017-05-11 15:50:33

标签: android gradle junit4 android-espresso ui-testing

我正在尝试将我们的应用程序迁移到使用Espresso进行UI测试,但我无法让Gradle使用运行Android 4.4的设备(API 19,我们的最低部署目标)找到我的测试。 Android 6.0(API 23)上的测试运行正常。我根据thisthis将JUnit运行器和依赖项添加到app/build.gradle(由于模块之间的版本冲突,我排除了注释):

android {
...
    defaultConfig {
...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
...
    androidTestCompile("com.android.support.test.espresso:espresso-core:2.2.2") {
        exclude module: 'support-annotations'
    }
    androidTestCompile("com.android.support.test:runner:0.5") {
        exclude module: 'support-annotations'
    }
    androidTestCompile("com.android.support.test:rules:0.5") {
        exclude module: 'support-annotations'
    }
}

然后我用一些模拟测试代码创建了所需的目录结构app/src/androidTest/java/和包com.companyname.appname以及java类EspressoTest.java

@RunWith(AndroidJUnit4.class)
public class EspressoTest {

    @Rule
    public ActivityTestRule<TermsOfUse> termsOfUseActivityTestRule = new ActivityTestRule<>(TermsOfUse.class);

    @Test
    public void iAmAtTouView() {
        onView(withId(R.id.terms_of_use_content)).check(matches(isDisplayed()));
    }
}

如果我右键点击测试类EspressoTest并选择“运行'EspressoTest'”,我会收到错误消息:

$ adb shell am instrument -w -r   -e package com.companyname.appname -e debug false com.companyname.appname.qa.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Test running failed: Instrumentation run failed due to 'Process crashed.'
Empty test suite.

此外,如果我在命令行中输入./gradlew connectedAndroidTest,我会得到:

Starting 0 tests on GT-I9305 - 4.4.4
Tests on GT-I9305 - 4.4.4 failed: Instrumentation run failed due to 'Process crashed.'

com.android.builder.testing.ConnectedDevice > No tests found.[GT-I9305 - 4.4.4] FAILED 
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).
:app:connectedAuditDebugAndroidTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:connectedAuditDebugAndroidTest'.
> There were failing tests. See the report at: 
...

所以对我而言,在尝试使用Android设备执行测试任务时,Gradle似乎无法识别我的测试类。我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:0)

首先检查哪些任务可供gradle运行:

gradle <app-module>:tasks

gradle --gui

查看您正在运行的任务是否在任务列表中。您还试图运行哪台机器:MacOS还是Windows?如果不是至少从android工作室同步你的项目总是一个好主意,在运行测试之前总是使用'​​sudo'运行gradle

答案 1 :(得分:0)

由于您的*-androidTest.apk包含64k以上的方法,是否有必要启用multidex?

如果是这样,则需要确保第一个dex文件(classes.dex)包含要运行的所有*Test类。您可以这样配置:

android {
    defaultConfig {
        multiDexEnabled true
        multiDexKeepProguard file('multidex-config.pro')
    }
}

,然后在multidex-config.pro中为测试类添加常规-keep规则,例如

-keep path.to.my.package.**.*Test { *; }

如果您的测试类在您自己的程序包路径之外具有依赖项,请确保在单独的-keep语句中也包括这些依赖项。在java.lang.ClassNotFoundException中寻找adb logcat,以识别丢失的类。

答案 2 :(得分:0)

为 Thomas Keller 的回答添加了附加信息:

-keep path.to.my.package.**.*Test { *; }

有语法错误,应该是:

-keep class path.to.my.package.**.*Test { *; }

根据安卓指南:

https://developer.android.com/studio/build/multidex?#multidexkeepproguard-property

它对我有用。我在 Android 4.4 上运行仪器测试。

当我在 logcat 中发现测试运行程序只在主 DEX 路径中搜索 classpath 的关键信息时,即使辅助 dex 已经被 androidx.multidex 处理。

D/dalvikvm( 7758): DexOpt: --- END 'com.byted.bytexx.test-1.apk.classes2.zip' (success) ---
D/dalvikvm( 7758): DEX prep '/data/data/com.byted.bytexx.test/code_cache/secondary-dexes/com.byted.bytexx.test-1.apk.classes2.zip': unzip in 109ms, rewrite 1745ms
I/MultiDex( 7758): install done
I/MonitoringInstr( 7758): Instrumentation started!
I/MultiDex( 7758): Installing instrumentation
I/MultiDex( 7758): Installation done

...

I/TestRequestBuilder( 7758): Scanning classpath to find tests in paths [/data/app/com.byted.bytexx.test-1.apk]

...

D/TestExecutor( 7758): Adding listener androidx.test.internal.runner.listener.ActivityFinisherRunListener
I/TestRunner( 7758): run started: 1 tests
I/TestRunner( 7758): run finished: 0 tests, 0 failed, 0 ignored
I/MonitoringInstr( 7758): waitForActivitiesToComplete() took: 0ms
D/AndroidRuntime( 7741): Shutting down VM

我发现我的测试代码不在主 DEX 中。