在app中运行仪器测试并等待结果

Mao*_*dad 20 android android-testing appium android-instrumentation appium-android

我正在开发一种QA自动化解决方案,可以在Android上记录/回放QA测试.关键业务要求是在回放录制的测试时不依赖于连接的PC.为此,我试图在没有连接PC的情况下运行仪器测试.(具体来说,是Appium UiAutomator2测试).

我目前的方法是尝试从我的应用程序以编程方式运行测试.如果我通常从连接的PC运行测试,我会使用该命令adb shell am instrument -w.我尝试从我的应用程序访问ADB Shell并运行am instrument -w,但这会产生错误,我错过了INTERACT_ACROSS_USERS_FULL权限.

为了解决这个问题,我尝试使用startInstrumentation运行测试.这成功地开始了测试.但是,测试立即崩溃.经过进一步调查,我将崩溃追踪到NPE:测试试图检索InstrumentationRegistry.getInstrumentation.getUiAutomation(0),但是返回null.

如何以编程方式运行测试并授予其访问所需的UiAutomation实例的权限?

这就是我开始测试的方式:

public void runTest() {
    final String pm = getPackageName().replaceFirst(".test$", "");
    final InstrumentationInfo info = getInstrumentationInfo(pm);
    if (info != null) {

        final ComponentName cn = new ComponentName(info.packageName,
                info.name);

        Bundle arguments = new Bundle();
        arguments.putString("class", "io.testim.appiumwrapper.test.AppiumUiAutomator2Server");
        //cn = {io.extension.test/android.support.test.runner.AndroidJUnitRunner}
        startInstrumentation(cn, null, arguments);

    } 
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 1

请参阅签名保护级别 - 澄清...除非将软件包列入 Google 发布密钥的白名单,否则您将无法获得必要的权限。这是一项安全/完整性功能,目的是限制恶意软件能够执行的操作 - 以及您打算执行的操作是典型的恶意软件行为 - 无论其实际意图如何;违背体制是没有结果的。

我可以成像的唯一方法是直接从终端模拟器或测试应用程序运行命令 - 针对AOSP的自定义构建,以便您可以添加android:protectionLevel="signature"Manifest.xml然后 require android.permission.INTERACT_ACROSS_USERS_FULL。但对于普通ROM来说,绝对没有机会这样做。这并不是说“不可能”,但构建自定义 ROM 意味着需要付出相当大的努力才能实现这一目标。至少对于Nexus和设备,此处Pixel提供了所需的驱动程序;对于其他设备,您必须在设备供应商那里找到它们(如果有的话)。

诀窍是使用与应用程序相同的密钥来签署 ROM - 只有这样signature才能获得级别权限 - 而对于库存 ROM,您(理论上)需要 Google 的发布密钥来签署软件包。如此处所述,可以强制执行单用户,但这也仅适用于系统应用程序。