跨虚拟机分布单元测试

Distributing unit testing across virtual machines

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

我有一套预先存在的功能网络测试套件,目前使用 Boost.Test 和 Google 测试用 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 路由网络后面的自己的进程 运行ning 中,因此它不是特别现实,因此并没有真正测试代码。我想我正在寻找的是一些将服务器线程部分拆分成自己的进程的方法,然后是一些让服务器测试进程和客户端测试进程协同工作以 运行 功能测试的方法.理想情况下,服务器和客户端进程将 运行 分开 "machines",这是我可以相当容易地使用 OpenVZ 脚本自动执行的事情,因此请考虑该问题超出范围,尽管它使进程分叉不理想。

我一直在想,在这个 Web 2.0 等时代,这肯定是一个非常常见的功能测试场景,因此,已建立的模式和测试框架将会比比皆是。我的意思是,作为一个老计时器,我认为 "DCOM" 是我解决这个问题的第一个想法,尽管那是 1990 年代微软唯一的解决方案。也许有一些现代的和便携的等价物,我不是在这里搜索正确的术语,所以这是我的第一个问题:

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

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

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

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

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

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

非常感谢您的帮助。

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

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

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

这样的系统一周就可以实现,真正在你的掌控之中。做起来非常简单,而且非常可扩展。

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