orz 初衷很简单,本是想在写个自动化脚本用 intent 直接调用特定的 activity,因为权限问题,只能用 Robotium 这类的框架,但是后来发现用在 Android Studio 中用 Robotium 简直到处碰壁。求救。

测试类是:com.aabbcc.robtest.ExampleInstrumentedTest
测试目标 apk:com.aabbcc.client.stg
测试脚本所在的包名:com.aabbcc.robtest

工程的结构如下:

manifests 设置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.aabbcc.robtest">

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.aabbcc.client.stg">

    </instrumentation>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    </application>

</manifest>

gradle 设置:

apply plugin: 'com.android.application'

android {
    signingConfigs {
        config {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('/Users/zanghuizhi/Downloads/tttttt/android.keystore')
            storePassword 'android'
        }
    }
    compileSdkVersion 25
    buildToolsVersion '25.0.0'
    defaultConfig {
        applicationId "com.aabbcc.robtest"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            signingConfig signingConfigs.config
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.+'
    testCompile 'junit:junit:4.12'
    androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.3.1'
}

测试代码

package com.aabbcc.robtest;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;

import com.robotium.solo.Solo;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */

public class ExampleInstrumentedTest extends ActivityInstrumentationTestCase2 {
    private Solo solo;
    private static String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.aabbcc.client.module.mologin.activity.SplashActivity";
    private static String TARGET_PACKAGE_ID = "com.aabbcc.client.stg";
    public ExampleInstrumentedTest() throws ClassNotFoundException {
        super(TARGET_PACKAGE_ID, Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME));
    }

    @Before
    public void setUp() throws Exception {
        solo = new Solo(this.getInstrumentation(), this.getActivity());

    }

    @Test
    public void useAppContext() throws Exception {
        solo.sleep(5000);
        solo.clickLongOnText("生日问候");
        solo.sleep(5000);
    }

    @After
    public void tearDown() throws Exception {

        solo.finishOpenedActivities();
    }
}

直接在 AndroidStudio 中直接运行测试,会发现很诡异的用的是 AndroidJUnitRunner,然后找不到 instrumentation info

07/05 17:42:02: Launching ExampleInstrumentedT...
$ adb push /Users/zanghuizhi/AndroidStudioProjects/RobTest/app/build/outputs/apk/app-debug.apk /data/local/tmp/com.aabbcc.robtest
$ adb shell pm install -r "/data/local/tmp/com.aabbcc.robtest"
Success


$ adb push /Users/zanghuizhi/AndroidStudioProjects/RobTest/app/build/outputs/apk/app-debug-androidTest.apk /data/local/tmp/com.aabbcc.robtest.test
$ adb shell pm install -r "/data/local/tmp/com.aabbcc.robtest.test"
Success


Running tests

$ adb shell am instrument -w -r   -e debug false -e class com.aabbcc.robtest.ExampleInstrumentedTest com.aabbcc.robtest.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Test running failed: Unable to find instrumentation info for: ComponentInfo{com.aabbcc.robtest.test/android.support.test.runner.AndroidJUnitRunner}
Empty test suite.

用命令执行测试,出现 process crashed

 adb shell am instrument -w -r   -e debug false -e class com.aabbcc.robtest.ExampleInstrumentedTest com.aabbcc.robtest/android.test.InstrumentationTestRunner
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0

看 logcat 的日志发现是

07-05 17:05:24.139 16586 16586 E AndroidRuntime: FATAL EXCEPTION: main
07-05 17:05:24.139 16586 16586 E AndroidRuntime: Process: com.aabbcc.client.stg, PID: 16586
07-05 17:05:24.139 16586 16586 E AndroidRuntime: java.lang.RuntimeException: Exception thrown in onCreate() of ComponentInfo{com.aabbcc.robtest/android.test.InstrumentationTestRunner}: java.lang.RuntimeException: Could not find test class. Class: com.aabbcc.robtest.ExampleInstrumentedTest
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5427)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.app.ActivityThread.-wrap2(ActivityThread.java)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:160)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6200)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
07-05 17:05:24.139 16586 16586 E AndroidRuntime: Caused by: java.lang.RuntimeException: Could not find test class. Class: com.aabbcc.robtest.ExampleInstrumentedTest
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.AndroidTestRunner.runFailed(AndroidTestRunner.java:262)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.AndroidTestRunner.loadTestClass(AndroidTestRunner.java:96)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.AndroidTestRunner.setTestClassName(AndroidTestRunner.java:57)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.suitebuilder.TestSuiteBuilder.addTestClassByName(TestSuiteBuilder.java:78)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.InstrumentationTestRunner.parseTestClass(InstrumentationTestRunner.java:449)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.InstrumentationTestRunner.parseTestClasses(InstrumentationTestRunner.java:430)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:376)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5424)
07-05 17:05:24.139 16586 16586 E AndroidRuntime:    ... 8 more
07-05 17:05:24.164 16586 16586 I Process : Sending signal. PID: 16586 SIG: 9


↙↙↙阅读原文可查看相关链接,并与作者交流