Android每次测试开始时都会撤销权限

我使用Espresso和UIAutomator编写我的测试用例。 我在测试外部存储权限时会拒绝其允许的时间。 我有不同的测试用例,它们都需要在测试用例开始时被取消权限。 但是,某些测试用例应该并且确实会授予权限,因此我需要在执行下一个测试时撤销权限。 我搜索了四周,最接近的事情是使用pm管理器执行adb shell命令来撤消权限。 但是通过这样做,我会得到以下错误,由于'进程崩溃'导致Instrumentation运行失败。 有什么方法可以确保在每个测试用例开始时都会取消权限? 如果不是,这个问题怎么解决关于测试权限? 提前谢谢你的帮助!

这是我目前必须在每个测试用例(不起作用)之前撤销权限的代码片段:

@Before
public void setUp() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getInstrumentation().getUiAutomation().executeShellCommand(
                "pm revoke " + getTargetContext().getPackageName()
                        + " android.permission.WRITE_EXTERNAL_STORAGE");
    }
}

使用上述代码片段试图撤销权限时出现相应的错误消息:

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''.

我也遇到了这两个帖子:这个和这个。


我不确定在没有提示用户的情况下如何在运行时执行此操作。 但是,您在标题中说明它是用于测试目的。 所以我有一些选择我可以建议你

a)当测试需要在没有权限的情况下完成时,只需使用设备的设置手动撤销测试即可。

b)你可以检查并要求许可,然后拒绝给予许可。 我会给你一些我用来检查和询问相机许可的代码。 您只需更改权限名称,并可能需要检查的条件:

public static boolean checkCameraPermission(MainActivity thisActivity) {
    return ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.CAMERA)
            == PackageManager.PERMISSION_GRANTED;
}

public static void checkAndAskCameraPermission(final MainActivity thisActivity) {

    if (!checkCameraPermission(thisActivity)) {
        //No right is granted
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.CAMERA)) {

            //Open a dialog explaining why you are asking permission then when when positive button is triggered, call this line
            ActivityCompat.requestPermissions(thisActivity,
                            new String[]{Manifest.permission.CAMERA},
                            CHECK_FOR_CAMERA_PERMISSION);

        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.CAMERA},
                    CHECK_FOR_CAMERA_PERMISSION);
        }
    }
}

如果你需要的话,我可以给你更多关于b)的链接(如何提问权限)(只是评论它)。 但是,因为我不确定这个答案会令你感兴趣,所以我不会花时间记录这个选项。

但是接下来,也许有人能够解释你如何在运行时直接进行而不用提示,但是我尽管给你提供至少这些信息可能会很有趣。


你不能。 授予/撤销权限由用户控制。

但是,您可以通过adb授予/撤销权限,并且可以通过编程方式触发adb命令,但我不知道这是否可以组合使用?...

adb shell pm grant [app.package] [permission]
adb shell pm grant com.app.package.path android.permission.READ_CONTACTS

(看这里)

您可能将权限映射为布尔值以用于测试目的?


我已经实现了一个利用封装类的解决方案,覆盖并构建变体配置。 解决方案需要很长时间才能解释,并且可以在这里找到:https://github.com/ahasbini/AndroidTestMockPermissionUtils。

它尚未包装在sdk中,但主要想法是覆盖ContextWrapper.checkSelfPermission和ActivityCompat.requestPermissions的功能以进行操作,并将模拟应用程序的模拟结果返回到待测试的不同场景中,例如:权限被拒绝,因此应用程序请求并在授予许可的情况下结束。 即使应用程序一直都有权限,但这种情况也会发生,但它的想法是被重写实现的模拟结果所欺骗。

此外,实现还有一个称为PermissionRule类的TestRule,可以在测试类中使用该类来轻松模拟所有条件以无缝测试权限。 也可以断言,例如确保应用程序调用requestPermissions()。

链接地址: http://www.djcxy.com/p/96027.html

上一篇: Android revoke permission at start of each test

下一篇: delphi THashSHA2 return a wrong SHA256 on huge file