首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android在每次测试开始时撤销权限

问Android在每次测试开始时撤销权限
EN

Stack Overflow用户
提问于 2017-04-18 09:37:21
回答 6查看 6.3K关注 0票数 16

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

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

代码语言:javascript
复制
@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");
    }
}

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

代码语言:javascript
复制
Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''.

我也读过这两篇文章:this和this。

EN

回答 6

Stack Overflow用户

发布于 2018-08-30 10:43:53

在测试开始之前,您不应该撤消任何权限。这将重新启动整个测试应用程序过程,并且测试将被标记为失败。

相反,您可以在测试执行完成后撤消权限,即在@After方法中,如下所示:

代码语言:javascript
复制
@After
fun tearDown(){
    InstrumentationRegistry.getInstrumentation().uiAutomation.
            executeShellCommand("pm revoke ${getTargetContext().packageName} android.permission.WRITE_EXTERNAL_STORAGE")
}

或者,您可以使用Android Test Orchestrator版本1.0.2并设置

代码语言:javascript
复制
 testInstrumentationRunnerArguments clearPackageData: 'true'

这将在每次测试后清除包数据。

注意: Android Test Orchestrator v1.0.2在通过Jacoco管理代码覆盖率报告时存在问题。

票数 9
EN

Stack Overflow用户

发布于 2018-03-29 06:03:06

ADB具有撤销权限的功能,但不能从指令插入测试中调用它,因为撤销权限将重新启动整个应用程序进程,并以失败结束测试。下面的Kotlin代码将执行撤销,但如果权限被撤销,则会使测试崩溃。

代码语言:javascript
复制
/**
 *  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命令之一即可。

代码语言:javascript
复制
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可以在测试之间进行自动清理。

票数 4
EN

Stack Overflow用户

发布于 2017-04-25 07:32:34

我不确定在运行时如何在不提示用户的情况下做到这一点。但是,您在标题中声明它是用于测试目的的。因此,我有一些选择可以建议你

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

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

代码语言:javascript
复制
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) (如何询问权限)的链接,如果你需要的话(只需评论它)。但是,由于我不确定您是否会对此答案感兴趣,因此我不会花费时间来记录此选项。

但是,也许有人能够在运行时直接向您解释如何在没有提示的情况下执行此操作,但我认为至少向您提供这些信息可能会很有趣。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43462172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档