2012-07-06 49 views
3

我正在为消息传递系统编写集成测试。大多数测试在流程的各个阶段收集messgaes及其各种代码路径端到端的计数。我目前的测试已经变得非常干扰,因为我在这些消息传递组件中有许多public static AtomicInteger - 我在处理消息时增加它们 - 然后测试对这些计数作出断言。非侵入式集成测试

最糟糕的部分是,我将不得不在删除这些计数器时将其部署到易于增加错误的产品中。

我该如何设计自己的测试,以便通过这些组件传递消息的计数,而不需要在我的课程中实际填充计数器?我正在考虑对实际组件进行子分类并覆盖方法,并将子计数器移到子类方法中 - 并在我的测试中使用这些子类 - 关于更好设计的任何其他想法?

+0

整套集成测试真的是最好的解决方案吗?如果你想测试内部,请在单元测试中进行。集成测试只能用于测试外部公开的功能。 – 2012-07-06 17:31:23

+0

考虑到使用情况的数量,覆盖所有代码路径组合所需的单元测试数量变得过高 - 几乎会导致单元测试疲劳。端到端测试是强制性的。 – Bhaskar 2012-07-06 17:38:19

+0

我不会删除跟踪系统执行统计信息的代码。您可以使用JMX公开这些信息,并设置监控以关注生产中的系统。我会尝试使用他人已经提供的建议来设计它。 – 2012-07-06 17:46:22

回答

1

用静态散射代码AtomicInteger只用于测试当然是一个坏主意。这里有一些方法,我建议:可阅读信息的非侵入性的方式

  • 增加的可能性在所有组件安装听众数

    • 使用或其他监控机制的中间件。在生产环境中使用null或空对象模式,而在测试中安装一些简单的侦听器来计数调用/消息。 会帮助你。

    • 使用或其他仪器技术,类似于上述。

    • 测试副作用和输出!不要对流程中的确切消息做出假设,只是看整体结果是否正确。这样你的测试更加灵活,并且专注于正在测试的内容。不幸的是,当某些事情中断时,调试需要更多时间

  • 1

    我不得不在前一段时间处理完全相似的情况。我有几个组件处理一些消息,然后将它们传递给其他组件。我想出了这个设计:

    • 每个组件实现已使用notify方法来通知,并通过接收到的消息给其他组件
    • 每个组件都认为需要的其他组件列表的接口时通知一收到消息
    • 在您的测试中,您所要做的就是创建一个虚拟处理器,实现上述定义的接口并注册所有组件。这样,只要系统中有新消息流入,虚拟处理器就会收到通知。在生产过程中,不会有虚拟处理器,这应该使您的代码适用于测试和产品发布。
    +0

    不采用任何这样的接口的组件将被迫实现这个接口 - 这是同样侵入性的,虽然我认为这是一个比我目前使用的更清洁的方法。 – Bhaskar 2012-07-07 09:22:44