使用gradle的Android仅测试权限

Den*_*hev 13 android gradle android-testing android-gradle-plugin

我跑了./gradlew connectedAndroidTest,我需要我的测试APK有一个权限,不应该在任何非测试APK(调试,发布).我已经创建了一个允许的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage">
    <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)

然后我将此清单复制到src/androidTest目录,因为gradle android插件的发布说明提示:

0.13.0(2014/09/18)需要Gradle 2.1现在可以为测试应用程序提供清单(src/androidTest/AndroidManifest.xml)

但是,在我的连接测试期间不会应用权限.

如果我创建一个src/debug目录并在那里移动该清单 - 在连接测试期间正确应用权限(但在常规调试版本中也是如此,这是不可取的).

我做错了什么或有错误吗?

Den*_*hev 11

问题源于我对connectedAndroidTestgradle任务的工作方式的误解.它创建并部署了2个Android应用程序 - 一个可测试的(您的项目)和一个测试程序(一个模拟与可测试应用程序交互的用户的应用程序).我的意图是将权限添加到testable应用程序.但是,添加清单会src/androidTest导致向测试人员应用添加权限.这是我如何计算出来的:

如果我执行

adb shell pm list packages -f -3
Run Code Online (Sandbox Code Playgroud)

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

package:/data/app/SmokeTestApp.apk=com.android.smoketest package:/data/app/GestureBuilder.apk=com.android.gesture.builder package:/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 包:/ data / app / com.mycompany.myapp.test-1.apk = com.mycompany.myapp.test

带有test-1后缀的应用程序是测试者应用程序,另一个是我的可测试应用程序.检查他们的许可给出:

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
Run Code Online (Sandbox Code Playgroud)

因此SET_ANIMATION_SCALE,我打算将我的可测试应用程序中的权限放入测试人员应用程序中.难怪将清单移动src/androidTestsrc/debug将把权限放入可测试的应用程序中(正确但过于宽泛).


以下是我解决原始问题的方法 - 在应用程序在connectedAndroidTest任务内部运行时才将权限放入应用程序.

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

    productFlavors {
        /**
         * This flavor is to be run only using connectedAndroidTestAnimcontrol
         */
        animcontrol {}
    
        regular {}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 移动src/androidTest/AndroidManifest.xml到单一权限进入src/animcontrol/AndroidManifest.xml

  3. 执行连接测试为

    ./gradlew connectedAnimcontrolDebugAndroidTest
    
    Run Code Online (Sandbox Code Playgroud)

这就是诀窍,现在我AndroidManifest.xml只有在作为connectedAndroidTest运行时才会与主应用程序的清单合并.

希望这有助于某人.