如何模拟用于测试的数据库(Java)?
我用Java编程,我的应用程序正在大量使用DB。因此,对我来说,能够轻松测试我的数据库使用情况非常重要。
数据库测试是关于什么的?对我来说,他们应该提供两个简单的要求:
- 验证 SQL 语法。
- 更重要的是,根据给定的情况,检查数据是否正确选择/更新/插入。
那么,似乎我所需要的只是一个数据库。
但实际上,我不喜欢,因为使用数据库进行测试几乎没有困难:
- “只要给自己找一个测试数据库,这有多难?”——好吧,在我的工作场所,有一个个人测试数据库是不可能的。您必须使用“公共”数据库,每个人都可以访问该数据库。
- “这些测试肯定不快......” - DB测试往往比通常的测试慢。进行缓慢的测试确实不理想。
- “这个程序应该处理任何案例!” - 尝试在数据库中模拟每个案例变得有些烦人,甚至是不可能的。对于每种情况下,都应该进行一定量的插入/更新查询,这很烦人并且需要时间。
- “等一下,你怎么知道该表中有 542 行?”- 测试的主要原则之一是能够以与测试代码不同的方式测试功能。使用数据库时,通常有一种方法可以做某事,因此测试与核心代码完全相同。
所以,你可以发现我不喜欢DB在测试方面(当然,我必须在某个时候做到这一点,但我宁愿在以后的测试中到达那里,因为我使用其余的测试方法发现了大多数错误)。但是我在寻找什么呢?
我正在寻找一种方法来模拟数据库,模拟数据库,使用文件系统或仅虚拟内存。我想也许有一个Java工具/包,它允许简单地构造(使用代码接口)每个测试的数据库模拟,模拟表和行,SQL验证,以及用于监视其状态的代码接口(而不是使用SQL)。
你熟悉这种工具吗?
编辑:感谢您的回答!虽然我要求一个工具,但你也为我提供了一些关于问题的提示:)我需要一些时间来检查您的报价,所以我现在不能说您的答案是否令人满意。
无论如何,这里有一个更好的视图来了解我正在寻找的东西 - 想象一个名为DBMonitor的类,它的功能之一是查找表中的行数。以下是我想如何使用JUnit测试该功能的虚构代码:
public class TestDBMonitor extends TestCase {
@Override
public void setUp() throws Exception {
MockConnection connection = new MockConnection();
this.tableName = "table1";
MockTable table = new MockTable(tableName);
String columnName = "column1";
ColumnType columnType = ColumnType.NUMBER;
int columnSize = 50;
MockColumn column = new MockColumn(columnName, columnType, columnSize);
table.addColumn(column);
for (int i = 0; i < 20; i++) {
HashMap<MockColumn, Object> fields = new HashMap<MockColumn, Object>();
fields.put(column, i);
table.addRow(fields);
}
this.connection = connection;
}
@Test
public void testGatherStatistics() throws Exception {
DBMonitor monitor = new DBMonitor(connection);
monitor.gatherStatistics();
assertEquals(((MockConnection) connection).getNumberOfRows(tableName),
monitor.getNumberOfRows(tableName));
}
String tableName;
Connection connection;
}
我希望这段代码足够清晰,可以理解我的想法(请原谅我的语法错误,我是在没有我亲爱的Eclipse:P的情况下手动打字的)。
顺便说一句,我部分使用ORM,我的原始SQL查询非常简单,不应该因平台而异。