【问题标题】:Creating test data: domain builder创建测试数据:域构建器
【发布时间】:2013-04-11 04:46:13
【问题描述】:

我想使用底层内存数据库为我的测试创建测试数据。 常见的方法是创建一些 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 到协议)并返回包含这些实体的域对象。

所以有了这段代码,我基本上可以在一行中为特定测试设置测试数据。

这种测试数据生成方法相对于 SQL 有以下优点:

  • 我不坚持所有表列,如果某些列/约束是 added/removed ,那么我不需要在我的测试中更改测试数据生成。

  • 更简洁的方式是 SQL: I can setup test data in a line 而 SQL 方法需要为每个对象编写 INSERT。

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

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

  • 您无需坚持使用 USER_WITH_NEW_STATUS_ID 等 Java 常量。

我的问题是:

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

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

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

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

【问题讨论】:

  • 你要测试什么?你的架构?你的波霍斯?你的数据访问层?
  • 我以前没有见过这种方法。但它实际上看起来相当不错。但是,您应该小心创建有效的对象和对象图。否则,您的测试可能会导致关于您的应用程序正确性的错误陈述。但我想知道为什么在这种情况下你仍然需要数据库。这可能是业务逻辑和数据库紧密耦合的标志。业务逻辑测试应该能够在没有数据库的情况下运行,并且数据访问测试不应该使用任何业务逻辑。一个优点是您在创建实例和重构支持时进行编译时检查。
  • 是的,构建器可能会生成错误的对象图,但您可以为它编写测试(这将非常简单)并确保它工作正常。

标签: java hibernate testing tdd test-data


【解决方案1】:

你检查过 DBUnit 吗?

http://www.dbunit.org/

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

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

【讨论】:

  • 感谢您的建议,但这不是我想要的。这个想法是使用集中方法创建对象图,而不是深入挖掘对象属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多