如何在运行Espresso测试时禁用代码中的动画

时间:2015-04-28 00:12:04

标签: android android-animation android-permissions android-espresso android-instrumentation

有人在运行Espresso测试时设法禁用动画通过代码吗?我一直在尝试按照此网页上的说明操作(链接到here):
https://code.google.com/p/android-test-kit/wiki/DisablingAnimations

不幸的是它似乎没有用,因为我一直看到这个权限错误:

04-27 15:48:28.694      303-342/system_process W/PackageManager﹕ Not granting permission android.permission.SET_ANIMATION_SCALE to package com.cookbrite.dev (protectionLevel=50 flags=0x18be46)

我真的希望避免重新配置我的设备/模拟器。我们经常在本地进行个别测试,如果我必须继续切换设置,它会让我烦恼。

我注意到其他一些开发者抱怨说这不起作用,所以我可能并不孤单:
https://groups.google.com/forum/#!msg/android-test-kit-discuss/TCil7kMQRTM/QK1qCjzM6KQJ

5 个答案:

答案 0 :(得分:16)

我为每种动画类型执行这三个命令,他们正在为我工​​作:

adb shell settings put global window_animation_scale 0.0
adb shell settings put global transition_animation_scale 0.0
adb shell settings put global animator_duration_scale 0.0

此处提供更多信息 - prepare android emulator for UI test automation.

答案 1 :(得分:10)

我终于开始工作了。这是一个列出所需步骤的要点:
https://gist.github.com/daj/7b48f1b8a92abf960e7b

我错过的关键步骤是运行adb以授予权限:

adb shell pm grant com.mypackage android.permission.SET_ANIMATION_SCALE    

向清单添加权限并运行反射步骤本身似乎不够。

答案 2 :(得分:1)

更好的方法是更新app/build.gradle如果您是从命令行运行测试的话

android {
    ...
    ...

    testOptions {
        animationsDisabled = true
    }
}

在重建之前,您可能必须执行./gradlew clean。如果您使用的是android studio,则它可能不会更新设备上的APK,前提是该APK中没有任何更改。请注意这些内容,以确保更改实际上在您的设备上生效。

还请阅读文档here

在从cammand行运行的仪器化测试期间禁用动画。

如果将此属性设置为true,则从命令行使用Gradle运行检测测试将使用--no-window-animation标志执行am instrument。默认情况下,此属性设置为false。

此属性不会影响您使用Android Studio运行的测试。

答案 3 :(得分:0)

使用这种方式:


1.你在 Gradle 中使用它

android {

  //...

  testOptions {
    animationsDisabled = true
  }

  // ...
}

2.在 ADB 中用于设备

adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &

3.使用规则

class DisableAnimationsRule : TestRule {
    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            @Throws(Throwable::class)
           override fun evaluate() {
                // disable animations for test run
                changeAnimationStatus(enable = false)
                try {
                    base.evaluate()
                } finally {
                    // enable after test run
                    changeAnimationStatus(enable = true)
                }
            }
        }
    }

    @Throws(IOException::class)
    private fun changeAnimationStatus(enable:Boolean = true) {
        with(UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())){
            executeShellCommand("settings put global transition_animation_scale ${if(enable) 1 else 0}")
            executeShellCommand("settings put global window_animation_scale ${if(enable) 1 else 0}")
            executeShellCommand("settings put global animator_duration_scale ${if(enable) 1 else 0}")
        }
    }
}

答案 4 :(得分:-1)

嗯,这是我进入的一种解决方法......我的应用只有一个动画只能停止一些测试。

所以我更喜欢设置SharedPreference,PREFS_ANIMATIONS_DISABLED_FOR_TESTING ......

我在方法开始之前将其设置为true,在结束之前将其设置为false。

@Test
public void startingAnimationTest() {
     mSettings.edit().putBoolean("PREFS_ANIMATIONS_DISABLED_FOR_TESTING", true).apply();

    //Actual testing

    mSettings.edit().putBoolean("PREFS_ANIMATIONS_DISABLED_FOR_TESTING", false).apply();
}

我在开始动画之前只是要求它。

就是这样,肯定不是最好的解决方案,因为我知道测试不应该影响实际代码,但对我来说已经足够了。