如何管理用于测试的虚拟数据?让他们与他们各自的实体?在一个单独的测试项目中?使用Serializer从外部资源加载它们?或者只是在需要时重新创建它们?模块化应用堆栈中的虚拟数据和单元测试策略
我们有一个应用程序堆栈和几个模块,这取决于另一个模块,每个模块包含实体。每个模块都有自己的测试,需要运行虚拟数据。
现在,具有很多依赖性的模块将需要来自其他模块的大量虚拟数据。然而,那些不发布它们的虚拟对象,因为它们是测试资源的一部分,因此所有模块必须一次又一次地设置它们所需的所有虚拟对象。
另外:在我们的实体大多数领域不可为空所以即使运行针对对象层交易需要它们包含一些价值,最有相似的独特性,长度等
进一步限制的时候有没有最佳实践方式,还是所有的解决方案妥协?
更多详细
我们的堆栈看起来是这样的:
一个模块:
src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
我们使用Maven来处理依赖关系。
模块例如:
- 模块A有一些虚拟对象
- 模块B需要自己的对象和相同模块A
选项a )
测试模块T可以容纳所有虚拟对象,并将它们提供给测试范围(因此装入的依赖关系不会被戳穿)到所有模块中的所有测试。这会工作吗?含义:如果我加载牛逼在一个并运行安装在一个将它不含有牛逼尤其不能乙引入参考?然后A将知道约B的数据模型。
选项B)
模块A某提供了虚拟对象src/main/java../entities/dummy
允许乙,让他们同时一个不知道乙的虚拟数据
选项c)
每个模块都包含外部资源,这些资源是序列化的虚拟对象。它们可以被需要它们的测试环境反序列化,因为它依赖于它们所属的模块。这将需要每个模块创建并序列化它的虚拟对象,并且如何做到这一点?如果使用另一个单元测试,它会引入单元测试之间的依赖关系,这些依赖关系不应该发生,或者在脚本中会很难调试,而且不灵活。
选项d)
使用mock框架,并根据需要手动分配所需的字段为每个测试。这里的问题是我们实体中的大多数字段都是不可空的,因此需要调用setter或构造函数,这将在一开始就结束我们。
我们不想
我们不想建立与静态数据所需的对象的结构将不断改变静态数据库什么。现在很多,稍后。所以我们希望hibernate能够设置所有的表和列,并在单元测试时填入数据。另外一个静态数据库会引入很多潜在的错误和测试相关性。
我的想法是朝着正确的方向走吗?处理需要大量数据的测试的最佳做法是什么?我们将有几个相互依赖的模块,这些模块需要填充来自其他几个模块的某些数据的对象。
编辑
关于我们如何正确的做,现在响应第二个答案的一些详细信息:
所以为了简单起见,我们有三个模块:Person
, Product
,Order
。 Person
将使用MockPerson
对象测试经理的一些方法:
(在人/ src目录/ test/java下 :)
public class MockPerson {
public Person mockPerson(parameters...) {
return mockedPerson;
}
}
public class TestPerson() {
@Inject
private MockPerson mockPerson;
public testCreate() {
Person person = mockPerson.mockPerson(...);
// Asserts...
}
}
的MockPerson
类不会被打包。
这同样适用于该产品的测试:
(在产品/ src目录/ test/java下 :)需要
public class MockProduct() { ... }
public class TestProduct {
@Inject
private MockProduct mockProduct;
// ...
}
MockProduct
,但不会被打包。
现在订购测试需要MockPerson
和MockProduct
,所以现在我们目前需要同时创建以及MockOrder
来测试Order
。
(在顺序/ SRC /测试/ JAVA :)
这些是重复和将需要每Person
或Product
改变
public class MockProduct() { ... }
public class MockPerson() { ... }
这是唯一的类的时间将被改变应该在这里:
public class MockOrder() { ... }
public class TestOrder() {
@Inject
private order.MockPerson mockPerson;
@Inject
private order.MockProduct mockProduct;
@Inject
private order.MockOrder mockOrder;
public testCreate() {
Order order = mockOrder.mockOrder(mockPerson.mockPerson(), mockProduct.mockProduct());
// Asserts...
}
}
问题em是,现在我们必须更新person.MockPerson
和order.MockPerson
,只要Person
被更改。
用jar发布Mocks是不是更好,这样每一个有依赖关系的测试都可以调用Mock.mock并获得一个很好的安装对象?或者这是黑暗的一面 - 简单的方法?
嘿cwash!感谢您的工厂指针。我记得在rails教程中使用它);这可能是解决方案,我必须进一步检查它。 – Pete 2012-01-16 08:04:04
@Pete - 酷,你可以留下一个笔记/更新让我们知道你的决定? – cwash 2012-01-17 01:05:25
因此,看起来我们可以将它用作中央虚拟数据提供者。但最终它只是选项a),这意味着一些外部项目将包含所有必需的数据生成器。仍然想知道这是否是最好的选择。希望对此有更多的意见。 – Pete 2012-01-19 11:18:34