我在Java编程,我的应用程序正在做很多使用DB。因此,重要的是我能够轻松地测试我的数据库使用。
什么是数据库测试?对我来说,他们应该提供两个简单的要求:
>验证SQL语法。
>更重要的是,根据给定的情况检查数据是否被正确选择/更新/插入。
那么,看来我需要的是一个DB。
但实际上,我不喜欢,因为使用DB进行测试有几个困难:
>“只是给自己一个测试DB,它有多难? – 好吧,在我的工作地点,有一个个人测试DB是很不可能的。你必须使用一个“公共”数据库,所有人都可以访问。
>“这些测试肯定不是很快…” – DB测试往往比通常的测试慢。慢慢测试真的不理想。
>“这个程序应该处理任何情况! – 它变得有点恼人,甚至不可能尝试和模拟每个案例在一个数据库。对于每种情况,应该进行一定量的插入/更新查询,这是烦人的,需要时间。
>“等一下,你怎么知道那个表中有542行?” – 测试的主要原则之一是能够以不同于测试代码的方式测试功能。当使用DB时,通常有一种方法来做某事,因此测试与核心代码完全相同。
所以,你可以弄清楚,我不喜欢DBs,当谈到测试(当然,我必须得到这一点,但我宁愿到那里我的测试,后我发现大多数错误使用其余的测试方法)。但我正在寻找什么?
我正在寻找一种方法来模拟一个数据库,一个模拟DB,使用文件系统或只是虚拟内存。我认为也许有一个Java工具/包允许简单地构建(使用代码接口)DB模拟每个测试,模拟表和行,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 fields = new HashMap();
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查询是相当简单,不应该从一个平台到另一个不同。