【问题标题】:Is there a multi-process unit testing framework / junit addon?是否有多进程单元测试框架/junit 插件?
【发布时间】:2010-08-18 14:28:22
【问题描述】:
想象两台服务器(每个都在自己的 jvm 进程中),它们使用某种形式的消息(例如简单的生产者/消费者)进行通信
我想编写单元测试来测试这两个服务器的行为。
我的问题是:
是否有一些框架(或 junit 插件)可以解决这个问题?
我想在不同的进程中运行一个 junit 测试类(甚至是一个测试)?
如果一个单元测试可以使用某种进程间通信轻松访问另一个测试的变量(在不同的进程中),那就太酷了。
例如。我想检查生产者是否真的生产了我期望的东西,然后再检查消费者是否消费了它们。 (也许做一些模糊测试来检测一些与比赛条件相关的问题)
这种测试是否有一些最佳实践?
如果没有类似单元的测试方法,您将如何在持续集成期间测试此类内容?
注意:
我不想使用线程,因为这可能会改变行为(如果您想到线程安全问题)
【问题讨论】:
标签:
java
unit-testing
junit
automated-tests
multiprocessing
【解决方案1】:
我会将您希望做的事情描述为集成测试,并且超出了 JUnit 作为框架的范围(JUnit 只是现在才涉足多线程测试,多进程肯定不在功能集中)。
您当然可以使用 JUnit 来运行此类测试,但它们实际上仅限于运行器,其余的您必须自己完成。
其他人已经指出,您通常会模拟或以其他方式向消费者发送人工构造的方法,并在“单元测试”级别测试生产者独立生成的内容。
就实际测试生产者和消费者之间的交互而言,一种方法是忘记进程间测试,并通过生产者发送消息的某种依赖注入在一个线程上进行进程内测试通过某种虚假的方式将其传递给消费者,而不是线程内方法调用。
但是,您似乎想要测试可能发生的事情,以及实际的进程间事情(竞争条件等),这使得这更加成为一个集成测试。
要解决这个问题,您需要启动进程并等待它接受消息,然后您的测试会告诉生产者要创建什么消息并将其发送给消费者。然后你的测试会询问消费者它得到了什么(有适当的延迟)。
这里的需求对我来说必须是令人信服的。我会进行全面的自动化验收测试,并让它包含这种级别的集成。
【解决方案2】:
你应该看看XHarness,我相信它可以满足你的需求。我最近使用过它,它对我们当时的项目非常有用。
从它的页面:
"XHarness 是一个系统测试工具,用于
阿帕奇蚂蚁。它允许开发人员
描述他们的产品/系统测试
作为 ant 一部分的 XML 形式
构建文件,描述任务和
包含测试用例的过程
以及他们的预期行为是什么。
它具有强大的流程管理
功能, 扩展现有的
Ant 进程任务 (exec, java) 到
允许异步执行java
和本机进程(例如
客户端-服务器测试),同步
多进程和复杂之间
关于流程和任务输出的断言
(stdout/stderr,文件输出,耦合
超时等)。 "
【解决方案3】:
我建议使用模拟对象,然后您可以测试生产者和消费者独立地模拟另一个。所以你测试生产者生产,消费者消费。
您还可以测试两者的通信机制,但我希望那是由第 3 方提供的?
见Mockito、jMock、EasyMock
【解决方案4】:
您在第 1 点中所说的不是真正的单元测试场景。在完美的单元测试中,您不必担心谁在产生消息以及谁在使用消息。您的一个测试用例将专注于想象(或模拟)您从有效的生产者那里收到不同的消息,并且您的测试用例将测试这些消息是如何被正确使用的。您正在寻找的更像是集成测试。无论如何,我所做的一些陈述可能是主观的。您可以使用 jMock、easymock 框架来满足您的模拟需求。
【解决方案5】:
这远远超出了单元测试,并且牢牢地包含在集成测试中。
我建议您通过单独模拟您的通信层来测试您的能力。
我过去在这种情况下所做的是在测试中启动一个单独的线程,该线程启动一个 Mock Receiver/Sender。在主要测试中,我然后执行发送者/接收者部分。在实践中,这意味着这充满了延迟,以确保事情以正确的顺序开始,这变得非常缓慢,所以你只想这样做来测试拼图的各个部分是否合适,并尽可能少地进行功能测试它。
我验证了期望的行为并在离开测试之前终止了辅助线程。
这可以测试很多。使用单独的进程(和主机!)进行测试真的很痛苦。需要很长时间,我会将其限制为手动测试。