创建测试数据:域构建器

时间:2013-04-18 07:13:10

标签: java hibernate testing tdd test-data

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

我在Growing Object-Oriented Software, Guided by Tests中读到,测试不需要深入细节。例如,如果测试希望现有用户具有NEW状态,那么他不需要创建用户并填写其所有字段。但他应该只说,他希望用户具有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到协议)并返回包含这些实体的Domain对象。

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

此测试数据生成方法优于SQL:

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

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

  • 耗时少。是的,首先你开始使用这种方法,你必须花一些时间来实现这样的域构建器,但是一旦完成,那么你可以节省很多时间。

  • 集中创建对象。如果数据库模式已更改,则必须仅在一个位置更改对象创建逻辑。

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

我的问题是:

是否还有人采用这种方法以及您使用的库/工具/约定?

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

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

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

1 个答案:

答案 0 :(得分:0)

你检查过DBUnit吗?

http://www.dbunit.org/

它是针对数据库驱动项目的JUnit的扩展,除其他外,它将数据库置于测试运行之间的已知状态。

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