【问题标题】:Distributing unit testing across virtual machines跨虚拟机分布单元测试
【发布时间】:2015-03-21 18:54:35
【问题描述】:

过去几天我一直在寻找功能测试问题的现有解决方案,但我没有想法,希望能得到一些帮助!

我有一套预先存在的功能网络测试套件,目前使用 Boost.Test 和 Google Test 用 C++ 编写,但可能很快会被重写为 Rust。这些通常采用以下形式:

unit test fixture { 1. Start a thread representing "the server" which goes and listens on some localhost port for incoming network connections. 2. Do client stuff representing "the client" to that localhost port. 3. Join the server thread, fetching an errors or problems. 4. Exit with success or failure. }

这很棒,而且效果很好。然而,它只测试环回,在现实世界中,服务器组件可能在它自己的进程中运行在 NAT 路由网络后面,所以它不是特别现实,因此没有真正测试代码。我想我正在寻找的是将服务器线程部分拆分为自己的进程的某种方法,然后是使服务器测试进程和客户端测试进程协同工作以运行功能测试的某种方法。理想情况下,服务器和客户端进程将在单独的“机器”中运行,这是我可以很容易地使用 OpenVZ 脚本自动执行的操作,因此请考虑超出范围的问题,尽管它使分叉进程不理想。

我一直在想,在这个 Web 2.0 等时代,这肯定是一个非常常见的功能测试场景,因此已经建立的模式和测试框架会比比皆是。我的意思是,作为一个老前辈,我认为“DCOM”是我对如何解决这个问题的第一个想法,尽管这是 1990 年代微软唯一的解决方案。也许有一些现代和便携的等价物,我没有在这里寻找合适的术语,所以这是我的第一个问题:

  1. 是否有任何标准功能测试库或框架扩展了 Google Test 或 Boost.Test 等,让您可以在运行时轻松选择每个功能测试的服务器和客户端部分是作为线程运行还是作为进程运行,还是最好的,作为拥有自己的网络堆栈的自己的虚拟机中的进程?

这个测试场景肯定很常见。但是让我们假设它不是,并且不存在这样的工具。如果没有,那么我们需要扩展 Boost.Test 或 Google Test 并提供一些额外的支持。首先,我们需要为每个测试夹具关联一个支持“服务器”部分的测试夹具,对于线程测试场景,我们需要始终同时运行服务器和客户端测试夹具。所以,我的第二个问题:

  1. 在任何流行的 C++ 或 Rust 单元测试框架中,是否有任何方法可以将两个测试夹具强关联,其中两个夹具被视为同一测试的两半,并且始终同时执行?

这就剩下第二部分:如何让单元测试框架在一个进程中只执行客户端部分,而在另一个进程中只执行服务器部分,并且始终同时执行并彼此同步,此外将两个部分的 junit XML 输出合并到一个测试结果中。所以:

  1. 是否有任何替代功能测试方法、方法或开源解决方案比 Google Test 或 Boost.Test 等单元测试框架更适合分布式网络功能测试?最好是 libvirt 感知的东西,以便它可以在测试设置和拆卸过程中编排虚拟机?例如,是否有一些 Jenkins 插件或可以在每个 OpenVZ 容器中使用 Jenkins slave 来协调每个功能测试的多个部分的并发执行?还是老式的 CORBA 仍然是这里最糟糕的解决方案?是否有某种方法可以将测试装置自动包装到 REST HTTP API 中?

我确实快速回顾了主要的集成测试框架,所以CitrusSTAFTwister。老实说,对于我想要的东西,它们似乎都太过分了,这是一种快速简便的方法,可以使现有的功能测试套件使用比环回更现实的网络路由。这就是我真正想要的本质,我不在乎它是如何完成的,只要检查和要求仍然出现在 Jenkins 中。 Stackoverflow 交给你了!

提前感谢您的帮助。

【问题讨论】:

    标签: c++ unit-testing jenkins integration-testing


    【解决方案1】:

    我有类似的要求,但我来自 Java 世界。您可以轻松地使用 jGroups 对节点/机器进行分布式管理。

    一旦您了解它的工作原理,您只需使用 100 行代码即可构建一个分布式节点系统。使用这个系统,您可以跨越和控制每个系统上的子进程,并自己检查输出和所有内容。应该只花费您一天的时间来获取 jGroup 示例并使其运行。

    一旦您拥有基础架构复制代码并将其作为独立进程执行,您的控制就很容易了。然后使用其中一些节点并启动 Selenium 并使用多个浏览器窗口并执行脚本(或使用 Sikuli)并进行测试。由于 Selenium 进程又是 Java,因此您可以生成所有类型的报告,您可以打印到控制台或直接发送到集群,因为这些进程也可以使用 jGroups 加入集群。

    这样的系统可以在一周内实施,并且完全在您的控制之下。做起来非常简单,而且非常可扩展。

    您还可以为 Jenkins、Jira 或 Quality Center 提供插件以与之交互并触发测试执行和管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多