Android 仅测试权限与 gradle

标签 android gradle android-gradle-plugin android-testing

我运行 ./gradlew connectedAndroidTest 并且我需要我的测试 APK 具有不应在任何非测试 APK(调试、发布)中的权限。我已经获得许可创建 list :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage">
    <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
</manifest>

然后我将此 list 复制到 src/androidTest 目录,如 release notes来自 gradle android 插件建议:

0.13.0 (2014/09/18) Requires Gradle 2.1 It is now possible to provide a manifest for test apps (src/androidTest/AndroidManifest.xml)

但是,在我的连接测试期间没有应用该权限。

如果我创建一个 src/debug 目录并将此 list 移动到那里——在连接测试期间正确应用权限(但在常规调试构建期间也是如此,这是不希望的)。

我是做错了什么还是有错误?

最佳答案

问题源于我对 connectedAndroidTest gradle 任务工作原理的误解。它创建并部署了 2 个 android 应用程序——一个可测试的(你的项目)和一个测试器(一个模拟与可测试应用程序交互的用户的应用程序)。我的目的是将权限添加到可测试的应用程序。但是,向 src/androidTest 添加 list 会导致向测试应用程序添加权限。我是这样想的:

如果我执行

adb shell pm list packages -f -3

(-3 表示只列出第三方包)我可以看到这样的东西

包:/data/app/SmokeTestApp.apk=com.android.smoketest 包:/data/app/GestureBuilder.apk=com.android.gesture.builder 包:/data/app/com.mycompany.myapp-2.apk=com.mycompany.myapp 包:/data/app/SoftKeyboard.apk=com.example.android.softkeyboard 包:/data/app/org.libsdl.app-2.apk=org.libsdl.app 包:/data/app/SmokeTest.apk=com.android.smoketest.tests package:/data/app/com.mycompany.myapp.test-1.apk=com.mycompany.myapp.test

后缀为test-1的是tester app,另外一个是my testable app。检查他们的权限给出:

root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp-2.apk

package: com.spredfast.android
uses-permission: android.permission.INTERNET
uses-permission: android.permission.WRITE_EXTERNAL_STORAGE

root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp.test-1.apk

package: com.spredfast.android
uses-permission: android.permission.SET_ANIMATION_SCALE

因此,我打算放入可测试应用程序的权限 SET_ANIMATION_SCALE 已放入测试器应用程序。难怪将 list 从 src/androidTest 移动到 src/debug 会将权限放入可测试的应用程序(正确,但过于宽泛)。


这是我解决原始问题的方法 - 将权限放入应用程序,以防应用程序在 connectedAndroidTest 任务中运行。

  1. 我创建了一个用于集成测试的空构建风格:

    productFlavors {
        /**
         * This flavor is to be run only using connectedAndroidTestAnimcontrol
         */
        animcontrol {}
    
        regular {}
    }
    
  2. 将具有单一权限的 src/androidTest/AndroidManifest.xml 移动到 src/animcontrol/AndroidManifest.xml

  3. 执行连接测试为

    ./gradlew connectedAnimcontrolDebugAndroidTest
    

成功了,现在我有了 AndroidManifest.xml,只有当作为 connectedAndroidTest 运行时,它才会与主应用程序的 list 合并。

希望这对某人有帮助。

关于Android 仅测试权限与 gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27826935/

相关文章:

php - http post请求数据未通过

android - RuntimeException 使用 Camera.open()

android - 创建一个android项目不会为我创建R.java文件,并且似乎也存在gradle错误

shell - 通过gradle编写环境变量未显示在系统变量中

Android 注释找不到 AndroidManifest.xml

android - ?安卓 :attr/selectableItemBackground not visible enough on a dark background

android - 尝试构建时出现重复类错误

java - Dagger2在常规Java项目(IDEA IntelliJ)中不会生成Component类

android - Android资源编译失败(缓存文件错误)

android - 深度测试无法与模板测试一起正常工作