有人在运行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
答案 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
答案 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();
}
我在开始动画之前只是要求它。
就是这样,肯定不是最好的解决方案,因为我知道测试不应该影响实际代码,但对我来说已经足够了。