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