如何在androidTest测试中创建测试资产并授予运行时权限?

时间:2018-04-12 08:03:47

标签: android android-testing runtime-permissions

在将此标记为重复之前,请注意,这不是关于授予正在测试的应用程序的权限,而是测试apk本身。

在我的应用中,有一些功能可以从Download目录(/sdcard/download)获取文件,对其进行验证并将其复制到应用的私人商店(/data/data/com.package.myapp/files/),以便文件在需要时可用。

要测试此功能,我需要在Download目录中放置一些测试文件:一些已知有效,另一些已知无效文件。我已将这些文件放在assets组中的androidTest目录中。

在我的测试课程中,我有一个@BeforeClass public static void prepareAssets()方法,他的工作是从assets目录中获取这些文件,并在导入之前将它们复制到Download文件夹中。验证测试实际运行。

此准备步骤失败:

04-12 00:25:19.282 11231-11246/? E/TEST: Failed to prepare test assets
java.io.FileNotFoundException: /storage/emulated/0/Download/test1.jpg (Permission denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
    at ca.mahram.android.testextstorexfer.CopyUtil.copy(CopyUtil.java:20)
    at ca.mahram.android.testextstorexfer.ExampleInstrumentedTest.prepareAssets(ExampleInstrumentedTest.java:54)
    at java.lang.reflect.Method.invoke(Native Method)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)

现在我的应用只需要android.permission.READ_EXTERNAL_STORAGE权限即可复制这些文件,这就是我在清单中的内容。

但是,测试需要android.permission.WRITE_EXTERNAL_STORAGE权限,我已将其置于androidTest/AndroidManifest.xml

我已经尝试过每次尝试授予android.permission.WRITE_EXTERNAL_STORAGE测试无效的技巧。

我(尝试失败)尝试过:

  • adb shell pm grant ca.mahram.android.testextstorexfer android.permission.WRITE_EXTERNAL_STORAGE - &gt;操作不允许:java.lang.SecurityException:包ca.mahram.android.testextstorexfer没有请求权限android.permission.WRITE_EXTERNAL_STORAGE
  • adb shell pm grant ca.mahram.android.testextstorexfer.test android.permission.WRITE_EXTERNAL_STORAGE - &gt;失败FileNotFoundException(许可被拒绝)
  • @Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE); - &gt;失败FileNotFoundException(许可被拒绝)
  • InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("pm grant " + InstrumentationRegistry.getContext().getPackageName() + " " + Manifest.permission.WRITE_EXTERNAL_STORAGE); - &gt;失败FileNotFoundException(许可被拒绝)
  • InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("pm grant " + InstrumentationRegistry.getTargetContext().getPackageName() + " " + Manifest.permission.WRITE_EXTERNAL_STORAGE); - &gt;失败FileNotFoundException(许可被拒绝)

我需要的是在测试运行之前在Download文件夹中提供这些资源。我遇到的每个解决方案都是关于授予应用程序权限,而我没有找到任何关于授予测试apk权限的信息。

我完全没有想法。我如何准备这些资产?有没有更好的方法呢?

以下是Github上的示例代码:https://github.com/copolii/so49791104

0 个答案:

没有答案