gpt4 book ai didi

sqlite - Android 测试 - 从每个测试的干净数据库开始

转载 作者:IT王子 更新时间:2023-10-29 06:24:56 24 4
gpt4 key购买 nike

我正在使用 Android Instrumentation 测试来测试我的应用程序。

所以我有一个扩展 ActivityInstrumentationTestCase2 的测试类,其中包含多个测试。代码如下所示:

public class ManageProjectsActivityTestextends ActivityInstrumentationTestCase2<ManageProjectsActivity> {
public ManageProjectsActivityTest() {
super("eu.vranckaert.worktime", ManageProjectsActivity.class);
}

@Override
protected void setUp() throws Exception {
getInstrumentation().getTargetContext().deleteDatabase(DaoConstants.DATABASE);
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}

@Override
protected void runTest() throws Throwable {
super.runTest();
getActivity().finish();
}

public void testDefaults() {
// My test stuff
}

public void testAddProject() {
// My test stuff
}
}

所以正在测试的事件有一个项目列表。从数据库中检索项目列表。当没有可用的数据库时,在创建数据库时,我会插入一个默认项目。

所以这意味着当测试运行时,这就是我所期望的:

  1. 数据库(如果可用)从设备上删除
  2. 第一个测试开始(因此启动了使用一个项目创建我的数据库的事件)
  3. 测试使用新创建的数据库,因此意味着只有一个项目,在测试期间会创建第二个项目
  4. 第一次测试结束,再次调用setUp()方法
  5. 现在应该存在的数据库再次被删除
  6. 第二个测试开始(因此启动了使用一个项目创建我的数据库的事件)
  7. 第二个测试也结束了

但这并不是这个测试套件所做的......这是我的测试套件的结果:

  1. 数据库(如果可用)从设备上删除
  2. 第一个测试开始(因此启动了使用一个项目创建我的数据库的事件)
  3. 测试使用新创建的数据库,因此意味着只有一个项目,在测试期间会创建第二个项目
  4. 第一次测试结束,再次调用setUp()方法
  5. 现在应该存在的数据库再次被删除
  6. 它来了:第二个测试开始了(但我的数据库没有再次创建!!!我也看不到设备上的文件......)并且测试应该只显示一个项目开始但它确实显示了两个!!!
  7. 第二个测试也完成了但失败了,因为我有两个项目在开始...

一开始我没有覆盖 runTest() 方法,但我认为也许我应该自己结束事件以强制重新创建,但这没有任何区别。

所以看起来 DB 保存在内存中(因为当我明确删除它时,甚至没有在设备上创建新的 DB 文件)。甚至是 Activity,因为在 Activity 的 onCreate 中放置断点 a 时,我只在两个测试中进入一次。

为了维护数据库,我使用 ORMLite。你可以在这里看到我的助手类:http://code.google.com/p/worktime/source/browse/trunk/android-app/src/eu/vranckaert/worktime/dao/utils/DatabaseHelper.java

所以我的问题是如何强制测试始终使用不同的数据库...?

最佳答案

这个问题有点离题,但我在寻求帮助时来到了这里。可能对某些人有帮助。如果您使用 RenamingDelegatingContext 初始化数据库,它会在运行之间清理数据库。

public class DataManagerTest extends InstrumentationTestCase {

private DataManager subject;

@Before
public void setUp() {
super.setUp();

RenamingDelegatingContext newContext = new RenamingDelegatingContext(getInstrumentation().getContext(), "test_");
subject = new DataManager(newContext);
}

// tests...
}

以及关联的 DataManagerClass。

public class DataManager {

private SQLiteDatabase mDatabase;
private SQLiteOpenHelper mHelper;
private final String mDatabaseName = "table";
private final int mDatabaseVersion = 1;

protected DataManager(Context context) {
this.mContext = context;
createHelper();
}

private void createHelper() {
mHelper = new SQLiteOpenHelper(mContext, mDatabaseName, null, mDatabaseVersion) {
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// createTable...
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
// upgrade table
}
};
}
...
}

关于sqlite - Android 测试 - 从每个测试的干净数据库开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9804917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com