从应用程序中运行仪器测试并等待结果

时间:2018-08-19 11:29:18

标签: android appium android-testing appium-android android-instrumentation

我正在开发质量检查自动化解决方案,该解决方案可以在Android上记录/回放质量检查测试。一个关键的业务要求是在回放记录的测试时不依赖于连接的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);

    } 
}

1 个答案:

答案 0 :(得分:1)

请参见signature protection level - clarifying ...除非该软件包已被Google的发行密钥列入白名单,否则您将无法获得必要的许可。这是一项安全/完整性功能,旨在限制恶意软件的行为-您打算在此处进行的操作是典型的恶意软件行为-无论其实际意图是什么;对系统进行工作无济于事。

唯一可以想象的方法是直接从终端仿真器或测试应用程序运行命令-针对AOSP的自定义版本,以便可以将android:protectionLevel="signature"添加到{{1 }},然后要求Manifest.xml。但是使用库存ROM,绝对没有机会这样做。不是,这“不可能”,但是构建自定义ROM意味着要付出很多努力才能到达那里。至少对于android.permission.INTERACT_ACROSS_USERS_FULLNexus设备,所需的驱动程序可用here;对于其他设备,您甚至必须在设备的供应商处找到它们。

诀窍是使用与应用程序相同的密钥来注销ROM-只有获得Pixel级权限-而对于普通ROM,您(理论上)则需要Google的发行密钥来进行签名打开包装。如here所述,一个人可以强制执行一个用户,而这也仅适用于系统应用程序。