模块化应用程序堆栈中的虚拟数据和单元测试策略

Pet*_*ete 10 java testing unit-testing modular maven

如何管理用于测试的虚拟数据?将它们与各自的实体保持一致?在一个单独的测试项目中?使用外部资源的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
Run Code Online (Sandbox Code Playgroud)

我们使用Maven来处理依赖关系.

模块示例:

  • 模块A有一些虚拟对象
  • 模块B需要自己的对象,与模块A相同

选项a)

测试模块T可以容纳所有虚拟对象,并将它们提供给所有模块中的所有测试中的测试范围(因此加载的依赖关系不会受到影响).那会有用吗?含义:如果我加载牛逼一个并运行安装在一个将它不含有引入引用牛逼特别是没有B?然而A会知道B的数据模型.

选项b)

模块A在某处提供虚拟对象,src/main/java../entities/dummy允许B获取它们,而A不知道B的虚拟数据

选项c)

每个模块都包含外部资源,它们是序列化的虚拟对象.它们可以由需要它们的测试环境反序列化,因为它依赖于它们所属的模块.这将需要每个模块创建和序列化其虚拟对象,以及如何做到这一点?如果使用另一个单元测试,它会引入不应该发生的单元测试之间的依赖关系,或者使用脚本,它将很难调试而且不灵活.

选项d)

使用模拟框架并根据需要手动为每个测试分配必需的字段.这里的问题是我们实体中的大多数字段都不可为空,因此需要调用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...
    }
}
Run Code Online (Sandbox Code Playgroud)

MockPerson课程不会打包.

这同样适用于产品测试:

(在product/src/test/java :)中

public class MockProduct() { ... }
public class TestProduct {
    @Inject
    private MockProduct mockProduct;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

MockProduct 需要但不会打包.

现在订购测试将要求MockPersonMockProduct,所以现在我们目前需要同时创建和MockOrder测试Order.

(按顺序/ src/test/java :)

这些是重复的,需要每次更改PersonProduct更改

public class MockProduct() { ... }
public class MockPerson() { ... }
Run Code Online (Sandbox Code Playgroud)

这是唯一应该在这里的课程:

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,现在我们必须更新person.MockPersonorder.MockPerson随时Person发生变化.

使用jar发布Mocks是不是更好,这样每个其他具有依赖性的测试都可以调用Mock.mock并获得一个很好的安装对象?或者这是黑暗的一面 - 简单的方法?

cwa*_*ash 3

这可能适用,也可能不适用 - 我很想看看您的虚拟对象和相关设置代码的示例。(为了更好地了解它是否适​​用于您的情况。)但是我过去所做的甚至根本没有将这种代码引入测试中。正如您所描述的,它很难生产、调试,尤其是打包和维护。

我通常所做的(据我所知,在 Java 中这是最佳实践)是尝试使用测试数据生成器模式,如Nat Pryce在他的测试数据生成器帖子中所述。

如果您认为这有些相关,请查看以下内容: