代码之家  ›  专栏  ›  技术社区  ›  MRalwasser

是否有多进程单元测试框架/JUnit插件?

  •  6
  • MRalwasser  · 技术社区  · 14 年前

    想象 两个服务器(每个服务器在一个单独的JVM进程中) 使用某种形式的消息进行通信(例如简单的生产者/消费者)

    我想编写单元测试来测试这两个服务器的行为。
    我的问题是:

    1. 这个问题有一些框架(或JUnit插件)吗?
      我想在不同的过程中运行JUnit测试类(甚至是单个测试)? 如果一个单元测试可以使用某种进程间通信轻松访问另一个测试的变量(在另一个进程中),那就太酷了。
      例如,我想 检查生产商是否真的生产了这些东西 我期望,然后,如果消费者消费了它们。(也许做一些模糊检测一些与比赛条件相关的问题)

    2. 有一些吗? 最佳实践 对于这种测试?

    3. 如果没有类似于单元的测试方法,您将如何 在持续集成过程中测试这些东西?

    注:
    我不想使用线程,因为这可能会改变行为(如果考虑到线程安全问题)

    5 回复  |  直到 8 年前
        1
  •  6
  •   Yishai    14 年前

    我将描述作为一个集成测试,您要做的是什么,并且超出了JUnit作为一个框架的范围(JUnit现在只是将其脚趾伸入多线程测试,多进程当然不在特性集中)。

    当然,您可以使用JUnit来运行这样的测试,但它们实际上只限于一个运行者,其余的测试您必须自己完成。

    其他人已经指出了这样一个事实,即您通常会模仿或以其他方式将人工构建的方法发送给消费者,并在“单元测试”级别测试生产者独立生产的产品。

    就实际测试生产者和消费者之间的交互而言,一种方法是忘记进程间测试,并通过某种依赖注入在一个线程上测试它的进程内测试,在这种注入中,生产者通过某种伪造的方式发送消息,这种方式只将消息传递给消费者,而不在h下再进行任何操作。在线程方法调用中。

    然而,您似乎想要测试一些可以在它上面使用实际的进程间内容(竞争条件等)发生的事情,这使得这更像是一个集成测试。

    为了解决这个问题,您需要启动这个过程并等待它接受消息,然后您的测试将告诉生产者要创建什么消息,它将把它发送给消费者。然后你的测试会询问消费者它得到了什么(适当的延迟)。

    这里的需要对我来说是非常迫切的。我将进行全面的自动化验收测试,并让它包含这一级别的集成。

        2
  •  3
  •   Martin Woolstenhulme Brian Kelly    8 年前

    你应该看看 XHarness 我相信这能满足你的需要。我在最近的一段时间里使用过它,当时它对我们的项目非常有用。

    从它的页面:

    “xharness是用于 阿帕奇蚂蚁。它允许开发人员 描述他们的产品/系统测试 作为Ant一部分的XML形式 生成文件,描述任务和 构成测试用例的过程 他们的预期行为是什么。 它有强大的力量 过程管理 能力, 扩展现有的 Ant进程任务(Excel,Java) 允许 Java的异步执行 和本机进程 (例如) 客户机-服务器测试),同步 在多个过程和复杂的 关于过程和任务输出的断言 (stdout/stderr,文件输出,耦合 超时等)。

        3
  •  1
  •   Jon Freedman    14 年前

    我建议使用模拟对象,然后您可以测试生产者和消费者独立模拟其他对象。所以你要测试生产者的产品,消费者的消费。

    您也可以测试这两种通信机制,但我希望这是由第三方提供的?

    Mockito , jMock , EasyMock

        4
  •  1
  •   Teja Kantamneni    14 年前

    您在第1点中所说的并不是真正的单元测试场景。在一个完美的单元测试中,您不会担心谁在生成消息,谁在消费消息。您的一个测试用例将集中于想象(或模拟)您从一个有效的生产者收到了不同的消息,并且您的测试用例将测试这些消息是如何被正确使用的。您所看到的更像是集成测试。不管怎样,我所作的一些陈述可能是主观的。您可以使用jmock、easymock框架来满足您的模拟需求。

        5
  •  1
  •   Peter Tillemans    14 年前

    这远远超出了单元测试,而且牢牢地包含在集成测试中。

    我建议通过模拟每一块单独的comms层来测试您可以做什么。

    在这种情况下,我过去所做的就是在测试中启动一个单独的线程,它启动一个模拟的接收器/发送器。然后在主测试中,我执行发送方/接收方部分。在实践中,这意味着要确保事情以正确的顺序开始会有很多延迟,而这会变得非常缓慢,所以您只需要这样做来测试拼图的各个部分是否合适,并尽可能少地对其进行功能测试。

    在离开测试之前,我验证所需的行为并终止助手线程。

    这可以测试很多。使用单独的进程(和主机)测试是一种真正的痛苦。这需要很长时间,我会把它限制在手动测试上。