在InstrumentationTestCase运行之间重置应用程序状态

Tur*_*ole 15 android-testing android-espresso android-instrumentation

我的一位QA工程师正在支持具有相当大的代码库和许多不同的SharedPreferences文件的应用程序.前几天他来找我,询问如何在测试运行之间重置应用程序状态,就像它已经卸载 - 重新安装一样.

Espresso(他正在使用)和Android测试框架本身都不支持它,所以我不知道该告诉他什么.使用本机方法清除所有不同的SharedPreferences文件将是一个非常脆弱的解决方案.

如何在仪表期间重置应用程序状态?

nen*_*ick 29

当前的浓咖啡不提供任何重置应用程序状态的机制.但是对于每个方面(pref,db,文件,权限)都存在一个解决方案.

初始你必须避免浓咖啡自动开始你的活动,这样你有足够的时间重置.

@Rule
public ActivityTestRule<Activity> activityTestRule = new ActivityTestRule<>(Activity.class, false, false);
Run Code Online (Sandbox Code Playgroud)

然后开始你的活动

activityTestRule.launchActivity(null)
Run Code Online (Sandbox Code Playgroud)

要重置首选项,您可以使用以下代码段(在开始活动之前)

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

您也可以在开始活动后重置首选项.但随后活动可能已经阅读了偏好.

您的应用程序类只能启动一次并且已经启动,然后才能重置首选项.

我已经开始编写一个库,应该使用espresso和uiautomator使测试更加简单.这包括用于重置应用程序数据的工具.https://github.com/nenick/espresso-macchiato请参阅EspAppDataTool,其中包含清除首选项,数据库,缓存文件和存储文件的方法.


Jul*_* A. 5

改进@nenick的解决方案,将状态清除行为封装在custom中ActivityTestRule。如果执行此操作,则可以允许测试继续自动启动活动,而无需您的干预。使用custom 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();
    }

}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ana 5

你可以尝试将其添加到 gradle 中:

android {
...
defaultConfig {
...
    testInstrumentationRunnerArguments clearPackageData: 'true'
   }
}
Run Code Online (Sandbox Code Playgroud)

参考https://developer.android.com/training/testing/junit-runner

要在每次测试后从设备的 CPU 和内存中删除所有共享状态,请使用clearPackageData 标志。