2013-04-18 98 views
1

我想为我的测试使用底层内存数据库创建测试数据。 通常的做法是创建一些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%地肯定我的业务逻辑和存储库的逻辑是一致的

+0

你要测试什么?你的模式?你的Pojos?你的数据访问层? – 2013-04-18 07:15:40

+1

我以前没有见过这种方法。但它实际上看起来相当不错。但是,您应该小心创建有效的对象和对象图。否则,您的测试可能会导致您的应用程序的正确性错误陈述。但是我想知道为什么在这种情况下你仍然需要数据库。这可能是商业逻辑和数据库紧密结合的标志。业务逻辑测试应该能够在没有数据库的情况下运行,数据访问测试不应该使用任何业务逻辑。另外一个好处是,在创建实例和重构支持时,您有编译时检查。 – SpaceTrucker 2013-04-18 07:28:19

+0

是的,构建器可能会产生错误的对象图,但是你可以为它编写测试(它会非常简单),并确保它能正常工作。 – 2013-04-18 07:33:26

回答

0

你检查DBUnit的?

http://www.dbunit.org/

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

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

+0

感谢您的建议,但这不是我要找的。这个想法是使用集中的方法创建对象图,并且不要在对象属性中深入挖掘。 – 2013-04-18 11:54:47