非侵入式集成测试

时间:2012-07-06 17:17:44

标签: java integration-testing

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

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

如何设计我的测试,以便获得通过这些组件的消息计数,而不需要在我的类中实际填充计数器?我正在考虑对实际组件进行子类化并重写方法,并在子类方法中移动计数器 - 并在我的测试中使用这些子类 - 关于更好设计的任何其他想法?

2 个答案:

答案 0 :(得分:1)

使用仅在测试中使用的静态AtomicInteger来分散代码当然是个坏主意。我建议采用以下几种方法:

  • 使用或中间件中可用的其他监控机制以非侵入方式读取邮件计数

  • 增加在所有组件中安装侦听器的可能性。在生产环境中使用null或null对象模式,而在测试中安装一些简单的侦听器来计算调用/消息。 会对您有所帮助。

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

  • 测试副作用和输出!不要对流中的确切消息做出假设,只要看看整体结果是否正确。通过这种方式,您的测试更灵活,并专注于正在测试的内容。不幸的是,当某些事情发生时,调试会花费更多时间。

答案 1 :(得分:1)

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

  • 每个组件都实现了一个接口,该接口具有notify方法,用于通知并将收到的消息传递给其他组件
  • 每个组件都包含收到邮件时需要通知的其他组件的列表
  • 在您的测试中,您所要做的就是创建一个虚拟处理器,实现上面定义的接口并在所有组件中注册。这样,只要系统中出现新消息,就会通知虚拟处理器。在生产中,不会有虚拟处理器,这应该使您的代码适合测试和生产版本。