【发布时间】: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