1

我想使用底层内存数据库为我的测试创建测试数据。常见的方法是创建一些test_data.sql文件并使用插入创建测试对象。然后在java测试中引用这些对象。

我在《Growing Object-Oriented Software, Guided by Tests 》中读到,测试不需要深入细节。例如,如果测试想要现有用户具有新状态,那么他不需要创建用户并填写所有字段。但他应该只告诉他,他希望用户具有 NEW 状态,并且所有其他字段都应该填充默认值。

所以我想要辅助方法,比如这个:

User user = user(UserStatus.NEW); // inserts user in database
// ... use persistent user instance in test

但是我的数据库模式有很多表,我来到以下代码:

Domain domain = new DomainBuilder().user(UserStatus.NEW).agreement().account().account().build();

域类:

public class Domain {
    private User user;
    private Agreement agreement;
    private Account account;
    // getters/setters
}

此代码创建用户、协议(与 FK 到用户)、两个帐户(与 FK 到协议)并返回包含这些实体的域对象。

因此,使用此代码,我基本上可以在一行中为特定测试设置测试数据。

这种测试数据生成方法与 SQL 相比具有以下优点:

  • 我不坚持所有表列,如果添加/删除了某些列/约束,那么我不需要在测试中更改测试数据生成。

  • 更简洁的方式是 SQL:我可以在一行中设置测试数据,而 SQL 方法需要为每个对象编写 INSERT。

  • 它花费的时间更少。是的,首先你开始使用这种方法,你必须花一些时间来实现这样的域构建器,但是一旦你完成了,你就会节省很多时间。

  • 集中对象创建。如果您的数据库模式发生了变化,那么您只需在一处更改对象创建逻辑。

  • 你不需要坚持使用像 USER_WITH_NEW_STATUS_ID 这样的 java 常量。

我的问题是:

是否有人也采用这种方法以及您为此使用哪些库/工具/约定?

更新: 我在几种测试类型中使用这种方法:

  • 存储库测试(例如存储库正确过滤对象,或者它以正确的顺序返回对象列表)。

  • 业务逻辑+数据库集成测试(单元测试很好,但有时我需要100%确定我的业务逻辑和存储库逻辑是一致的

4

1 回答 1

0

你检查过 DBUnit 吗?

http://www.dbunit.org/

它是针对数据库驱动项目的 JUnit 扩展,除其他外,它使您的数据库在测试运行之间进入已知状态。

数据集是一个简单的 XML 文件。

于 2013-04-18T11:43:02.163 回答