我用Java编程,我的应用程序大量使用DB.因此,能够轻松测试我的数据库使用情况对我来说很重要.
数据库测试都是关于什么的?对我来说,它们应该提供两个简单的要求:
- 验证SQL语法.
- 更重要的是,根据给定情况判断数据是否正确 Select /更新/插入.
那好吧,看来我只需要一个数据库.
但实际上,我不喜欢这样,因为使用DB进行测试几乎没有什么困难:
- "只要给自己买个测试数据库,能有多难呢?"-嗯,在我的工作场所,拥有个人测试数据库几乎是不可能的.您必须使用"公共"数据库,每个人都可以访问它.
- "这些测试肯定不快……"-数据库测试往往比通常的测试慢.进行缓慢的测试真的不是很理想.
- "这个程序可以处理任何情况!"-在DB中try 和模拟每种情况变得有些烦人,甚至是不可能的.对于每种情况,都应该进行一定量的插入/更新查询,这很烦人,而且需要时间.
- "等一下,你怎么知道那张表有542行?"-测试的主要原则之一是能够以不同于测试代码的方式测试功能.当使用DB时,通常有一种方法来做某事,因此测试与核心代码完全相同.
因此,当涉及到测试时,您可以理解我不喜欢DB(当然,在某个时刻我必须谈到这一点,但我宁愿稍后在我的测试中谈到这一点,因为我使用测试方法中的睡觉发现了大多数bug).但我要找的是什么呢?
我正在寻找一种方法来模拟一个数据库,一个模拟数据库,使用文件系统或只是虚拟内存.我认为可能有一个Java工具/包,它允许(使用代码接口)简单地 for each 测试构造一个DB模拟,带有模拟的表和行,带有SQL验证,以及一个用于监视其状态的代码接口(而不是使用SQL).
你熟悉这种工具吗?
Edit:谢谢你的回答!虽然我想要一个工具,但你也给了我一些关于这个问题的提示:)我需要一些时间来判断你的报价,所以我现在不能说你的答案是否令人满意.
无论如何,下面是我正在寻找的更好的视图-想象一个名为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;
}
我希望这段代码足够清楚,能够理解我的 idea (请原谅语法错误,我没有使用亲爱的Eclipse:p来手动键入).
顺便说一句,我部分使用了ORM,而且我的原始SQL查询非常简单,不同的平台应该没有什么不同.