我想为我的测试使用底层内存数据库创建测试数据。 通常的做法是创建一些test_data.sql文件并使用插入创建测试对象。然后在java测试中引用这些对象。创建测试数据:域构建器
我看过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常量。
我的问题是:
有谁也来到这个办法,什么库/工具/约定你使用这个?
UPDATE: 我使用一些测试类型,方法:
库测试(例如存储库过滤器对象正确,或者在正确的顺序返回 对象列表)。
业务逻辑+数据库的集成测试(单元测试是很好的,但有时我需要100%地肯定我的业务逻辑和存储库的逻辑是一致的
你要测试什么?你的模式?你的Pojos?你的数据访问层? – 2013-04-18 07:15:40
我以前没有见过这种方法。但它实际上看起来相当不错。但是,您应该小心创建有效的对象和对象图。否则,您的测试可能会导致您的应用程序的正确性错误陈述。但是我想知道为什么在这种情况下你仍然需要数据库。这可能是商业逻辑和数据库紧密结合的标志。业务逻辑测试应该能够在没有数据库的情况下运行,数据访问测试不应该使用任何业务逻辑。另外一个好处是,在创建实例和重构支持时,您有编译时检查。 – SpaceTrucker 2013-04-18 07:28:19
是的,构建器可能会产生错误的对象图,但是你可以为它编写测试(它会非常简单),并确保它能正常工作。 – 2013-04-18 07:33:26