Android功能测试:在测试之间清除数据库

时间:2017-01-03 16:43:14

标签: android android-espresso android-testing

我试图为我的Android应用程序编写功能测试来测试不同的登录流程。

我希望能够做的是从第一个活动开始并模拟某个用户的登录,然后再次从第一个活动开始,并模拟与不同用户的登录。

我遇到的问题是,当我登录用户时,我将某些用户信息写入本地数据库,当我尝试登录第二个用户时,数据库已经包含第一个用户'信息和测试失败。

我认为我想要的是一种在测试运行之间清除数据库的方法。

我找到了一种使用ActivityTestRule删除数据库的方法,但这实际上删除了database.db文件,而不仅仅是清除数据库。这导致第二次测试失败,因为数据库不存在。

在测试运行之间是否有清除数据库的方法?

现在我唯一能想到的是每个登录流程都有一个测试类,这样应用程序实际上必须在测试运行之间重新启动它的进程(以及在测试运行结束时删除数据库)将允许数据库每次启动一个新的数据库。

1 个答案:

答案 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()。这模拟了重新启动的过程,因此我的数据库再次被创建,我有一个新的数据库可以进行下一次功能测试。