我的一位QA工程师正在支持具有相当大的代码库和许多不同的SharedPreferences文件的应用程序。前几天他来找我,询问如何在测试运行之间重置应用程序状态,就像它已经卸载 - 重新安装一样。
它看起来不像Espresso(他正在使用)和Android测试框架本身支持,所以我不知道该告诉他什么。使用本机方法清除所有不同的SharedPreferences文件将是一个非常脆弱的解决方案。
如何在检测过程中重置应用程序状态?
答案 0 :(得分:26)
当前espresso不提供任何重置应用程序状态的机制。但是对于每个方面(pref,db,文件,权限)都存在一个解决方案。
首先,您必须避免浓缩咖啡自动启动您的活动,以便您有足够的时间重置。
@Rule
public ActivityTestRule<Activity> activityTestRule = new ActivityTestRule<>(Activity.class, false, false);
稍后以
开始您的活动activityTestRule.launchActivity(null)
对于重置首选项,您可以使用以下代码段(在开始活动之前)
File root = InstrumentationRegistry.getTargetContext().getFilesDir().getParentFile();
String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list();
for (String fileName : sharedPreferencesFileNames) {
InstrumentationRegistry.getTargetContext().getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
}
您也可以在开始活动后重置偏好设置。但随后活动可能已经阅读了偏好。
您的应用程序类只能启动一次并且已经开始,然后才能重置首选项。
我已经开始编写一个库,可以使用espresso和uiautomator使测试变得更简单。这包括用于重置应用程序数据的工具。 https://github.com/nenick/espresso-macchiato例如,参见EspAppDataTool,其中包含清除首选项,数据库,缓存文件和存储文件的方法。
答案 1 :(得分:3)
改进@nenick的解决方案,将状态清除行为封装在自定义ActivityTestRule
中。如果执行此操作,则可以允许测试继续自动启动活动,而无需您的干预。使用自定义ActivityTestRule
时,活动在启动测试时已处于所需状态。
以下是我实施的一项措施,以确保在每项测试活动启动时注销该应用。一些测试,当他们失败时,正在离开应用程序处于签名状态。这会导致以后的测试失败,因为后来的测试认为他们需要登录,但应用程序已经登录。
public class SignedOutActivityTestRule<T extends Activity> extends ActivityTestRule<T> {
public SignedOutActivityTestRule(Class<T> activityClass) {
super(activityClass);
}
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
InstrumentationRegistry.getTargetContext()
.getSharedPreferences(
Authentication.SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE)
.edit()
.remove(Authentication.KEY_SECRET)
.remove(Authentication.KEY_USER_ID)
.apply();
}
}
答案 2 :(得分:1)
您可以尝试将其添加到 gradle:
android {
...
defaultConfig {
...
testInstrumentationRunnerArguments clearPackageData: 'true'
}
}
参考https://developer.android.com/training/testing/junit-runner
要在每次测试后从设备的 CPU 和内存中删除所有共享状态,请使用 clearPackageData 标志。