Android/Gradle espresso 测试未开始活动

Posted

技术标签:

【中文标题】Android/Gradle espresso 测试未开始活动【英文标题】:Android/Gradle espresso test not starting activity 【发布时间】:2014-06-27 11:47:49 【问题描述】:

我很难说服新的 android 构建系统运行测试。运行测试时会出现Unable to resolve activity for: Intent 错误,该错误已在其他问题中讨论过,但其中没有任何内容可以解决我的问题。

我已将其剥离,以便我的测试包完全不依赖我的主包 (com.wealdtech.app),但在启动活动时仍然存在问题。

我的测试活动:

package com.wealdtech.test;

import android.app.Activity;
import android.os.Bundle;

public class TileLayoutTestActivity extends Activity

  @Override
  public void onCreate(final Bundle savedInstanceState)
  
    super.onCreate(savedInstanceState);
  

还有我的测试课:

package com.wealdtech.test;

import android.test.ActivityInstrumentationTestCase2;

public class TileLayoutTest extends ActivityInstrumentationTestCase2<TileLayoutTestActivity>

  public TileLayoutTest()
  
    super(TileLayoutTestActivity.class);
  

  @Override
  protected void setUp() throws Exception
  
    super.setUp();
    setActivityInitialTouchMode(false);
  

  public void testNull()
  
    final TileLayoutTestActivity activity = getActivity();
    activity.finish();
  

build.gradle 的相关部分:

apply plugin: 'android-library'

android 
  compileSdkVersion 19
  buildToolsVersion "19.0.3"

  compileOptions 
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  

  defaultConfig 
    minSdkVersion 11
    targetSdkVersion 19

    testPackageName "com.wealdtech.test"
    testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
  

我获得的完整堆栈跟踪是:

java.lang.RuntimeException: Could not launch activity
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.startActivitySync(GoogleInstrumentation.java:286)
at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119)
at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97)
at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104)
at com.wealdtech.test.TileLayoutTest.testNull(TileLayoutTest.java:21)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent  act=android.intent.action.MAIN flg=0x14000000 cmp=com.wealdtech.test/.TileLayoutTestActivity 
at android.app.Instrumentation.startActivitySync(Instrumentation.java:379)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.access$101(GoogleInstrumentation.java:52)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:268)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

我没有包含我的AndroidManifest.xml,因为我读到的所有内容都表明我不需要为TileLayoutTestActivity 添加意图,但是无论如何我都尝试过这样做并最终得到了相同的结果。

我还尝试将 Gradle 插件从 android-library 更改为 android 以防万一导致问题,但结果还是一样。

我没有看到任何关于 Espresso 测试或使用 Gradle 构建系统进行测试的先决条件的文档,我还没有介绍过。关于我无法在测试中开始活动的任何想法?

【问题讨论】:

你能找到解决办法吗?在我的项目中遇到同样的问题。 有人有解决办法吗? 【参考方案1】:

对于使用android-library 插件的项目,说AndroidManifest.xml 没有真正使用是半准确的。事实上,一个库项目需要编译的清单是这样的:

<manifest package="com.package.yours"/>

创建 AAR 文件时,您尝试添加的任何权限或意图都将被忽略。它是一个库,据我所知,库项目清单中的任何内容都不会进入 AAR(或 JAR,如果你也在制作其中之一)。

但是! 在您构建一个推送到设备的测试项目时将使用的清单。您可以在 src/androidTest/AndroidManifest.xml 中直接转储乱码,而 gradle 不会在意,但您必须将您的测试活动添加到 src/main/AndroidManifest.xml,否则 ./gradlew connectedCheck 将引发运行时异常。

我的项目是这样的(确实如此,我只是改了名字):

src/
  androidTest/
    java/
      com.package.mine/
        TestActivity.java
        VariousTests.java
  main/
    java/
      com.package.mine/
        FancyLibrary.java
    AndroidManifest.xml

这是我的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.uie.uieanalytics">

    <uses-permission android:name="android.permission.PERM_I_NEED"/>

    <application>
        <activity android:name=".TestActivity" />
    </application>
</manifest>

否则,我使用的测试运行器和你一样,我的build.gradle 也足够相似。

【讨论】:

令人讨厌的是,AS 似乎没有注意到这些类存在并且它们显示为红色的事实。不过感谢您的回答!【参考方案2】:

其他人可以参考我来这个帖子,这样他们就不会浪费时间了。

    从旧的、废弃的、丑陋的 ActivityInstrumentationTestCase2 更改为 AndroidStudio、Gradle 和 Espresso 2 支持的注释。这将由 Google 进一步开发。

    永远忘记那个 ActivityInstrumentationTestCase2!

    开始使用 @RunWith@LargeTest@Test@Rule ...

【讨论】:

【参考方案3】:

对于仪器测试,Android 构建了两个 APK - 一个用于应用程序,一个用于测试。如果你把活动放到androidTest味,那么它属于测试APK。如果您稍后使用检测(直接或使用 ActivityTestRule)启动 Activity,则 Android 在您的应用 APK 中搜索它并失败,因为应用 APK 中没有此类 Activity。

要解决此问题,您可以在应用程序的 debug 风格中定义一个测试活动(类和清单)。然后它将与您的应用 APK 打包在一起,测试就可以正常工作了。

更新: 或者 - 正如 Austyn Mahoney 建议的那样 - 您应该使用 InstrumentationRegistry.getInstrumentation().getTargetContex‌​t() 来访问应用程序上下文,而不是仪器上下文。

【讨论】:

你不必在你的测试包中定义Activity,你只需要在创建你的Intent时使用正确的Context。使用 InstrumentationRegistry.getInstrumentation().getTargetContext() 这将返回应用程序 Context 而不是检测 apk 的 Context【参考方案4】:

请更改您可以运行的规则中的活动名称

ActivityTestRule mActivityRule = new ActivityTestRule( 更改活动名称)

【讨论】:

以上是关于Android/Gradle espresso 测试未开始活动的主要内容,如果未能解决你的问题,请参考以下文章

Espresso Test 2: Espresso_simple

Espresso Test 2: Espresso_simple

Android Gradle 插件Gradle 构建机制 ⑤ ( 在 Android Studio 中查看 Android Gradle 插件源码 )

android gradle 常见错误

Android Gradle 插件Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置与 Gradle 配置关联 ) ★

Android Gradle 插件Android Gradle 工程结构简介 ( Gradle 默认输出目录 | Gradle 配置目录 | gradlew 可执行文件 )