我试图为我的Android应用程序编写功能测试来测试不同的登录流程。
我希望能够做的是从第一个活动开始并模拟某个用户的登录,然后再次从第一个活动开始,并模拟与不同用户的登录。
我遇到的问题是,当我登录用户时,我将某些用户信息写入本地数据库,当我尝试登录第二个用户时,数据库已经包含第一个用户'信息和测试失败。
我认为我想要的是一种在测试运行之间清除数据库的方法。
我找到了一种使用ActivityTestRule删除数据库的方法,但这实际上删除了database.db文件,而不仅仅是清除数据库。这导致第二次测试失败,因为数据库不存在。
在测试运行之间是否有清除数据库的方法?
现在我唯一能想到的是每个登录流程都有一个测试类,这样应用程序实际上必须在测试运行之间重新启动它的进程(以及在测试运行结束时删除数据库)将允许数据库每次启动一个新的数据库。
答案 0 :(得分:0)
问题似乎是在我的Application类onCreate()方法中,我让Dagger创建了我的数据库实例。在我的测试代码中,我删除了该数据库文件。因此,在test1运行之前,应用程序的onCreate()会运行并构建数据库。当test1完成时,数据库文件被删除。当test2启动时,应用程序的onCreate()不会运行,因为应用程序的进程不会在测试方法之间消失。因此,当test2尝试访问db时,会抛出错误。
要解决此问题,我在tearDown()方法中添加了以下代码:
@After
public void tearDown() throws Exception {
deleteAllAppData();
MyApplication application = ((MyApplication) activityActivityTestRule.getActivity().getApplicationContext());
InstrumentationRegistry.getInstrumentation().callApplicationOnCreate(application);
}
private void deleteAllAppData() {
activityActivityTestRule.getActivity().deleteDatabase(DbHelper.DATABASE_NAME);
PreferenceManager
.getDefaultSharedPreferences(activityActivityTestRule
.getActivity()
.getApplicationContext())
.edit()
.clear()
.apply();
}
现在发生的是test1运行,然后在拆解方法中删除数据库文件,然后我获得当前Application类的句柄,然后使用InstrumentationRegistry对象调用Application类上的onCreate()。这模拟了重新启动的过程,因此我的数据库再次被创建,我有一个新的数据库可以进行下一次功能测试。