我正在使用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.''.发布于 2018-08-30 10:43:53
在测试开始之前,您不应该撤消任何权限。这将重新启动整个测试应用程序过程,并且测试将被标记为失败。
相反,您可以在测试执行完成后撤消权限,即在@After方法中,如下所示:
@After
fun tearDown(){
InstrumentationRegistry.getInstrumentation().uiAutomation.
executeShellCommand("pm revoke ${getTargetContext().packageName} android.permission.WRITE_EXTERNAL_STORAGE")
}或者,您可以使用Android Test Orchestrator版本1.0.2并设置
testInstrumentationRunnerArguments clearPackageData: 'true'这将在每次测试后清除包数据。
注意: Android Test Orchestrator v1.0.2在通过Jacoco管理代码覆盖率报告时存在问题。
发布于 2018-03-29 06:03:06
ADB具有撤销权限的功能,但不能从指令插入测试中调用它,因为撤销权限将重新启动整个应用程序进程,并以失败结束测试。下面的Kotlin代码将执行撤销,但如果权限被撤销,则会使测试崩溃。
/**
* Will revoke, but also CRASH if called by a test
* Revocation requires a full process restart, which crashes your test process.
*/
fun revokePermissions(vararg permissions: String) {
permissions.forEach {
InstrumentationRegistry.getInstrumentation().uiAutomation.
executeShellCommand("pm revoke ${getTargetContext().packageName} $it")
}
}如果从shell脚本运行测试,则只需在启动每个测试之前使用以下shell命令之一即可。
adb shell pm revoke com.package.appname android.permission.CAMERA
adb shell pm reset-permissions com.package.appname
adb shell pm clear com.package.appname无论你是从一个自定义的AndroidJUnitRunner的onCreate()或onStart()中撤销权限,还是在测试过程中撤销权限,都会发生同样的崩溃。在检测测试期间,即使活动尚未打开,也无法在不崩溃的情况下撤消权限。
似乎最好的选择是在运行任何检测测试之前撤销Gradle中的所有权限,然后您可以在测试开始使用GrantPermissionRule之前重新启用您想要设置的任何权限。
Android Test Orchestrator计划在每次测试之间自动清除所有数据,但该功能至今仍不存在。I filed a bug you can vote up可以在测试之间进行自动清理。
发布于 2017-04-25 07:32:34
我不确定在运行时如何在不提示用户的情况下做到这一点。但是,您在标题中声明它是用于测试目的的。因此,我有一些选择可以建议你
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) (如何询问权限)的链接,如果你需要的话(只需评论它)。但是,由于我不确定您是否会对此答案感兴趣,因此我不会花费时间来记录此选项。
但是,也许有人能够在运行时直接向您解释如何在没有提示的情况下执行此操作,但我认为至少向您提供这些信息可能会很有趣。
https://stackoverflow.com/questions/43462172
复制相似问题