跨虚拟机分发单元测试

时间:2015-03-21 18:54:35

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

过去几天我一直在寻找功能测试问题的现有解决方案,但我没有想法,也非常感谢SO的帮助!

我有一套预先存在的功能性网络测试套件,目前使用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脚本的问题,因此请考虑该问题超出范围,尽管这会使分析过程不理想。 / p>

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

  1. 是否有任何标准的功能测试库或框架可以扩展Google Test或Boost.Test等,使您可以在运行时轻松选择每个功能测试的服务器和客户端部分是作为线程还是作为进程运行,或者最重要的是,作为拥有自己的网络堆栈的虚拟机内的进程?
  2. 这个测试场景肯定很常见。但是,让我们假设它不是,并且不存在这样的工具。如果它没有,那么我们需要通过一些额外的支持来扩展Boost.Test或Google Test。首先,我们需要将每个测试夹具与支持服务器"部分测试夹具,对于线程测试场景,我们需要始终同时运行服务器和客户端测试夹具。所以,我的第二个问题:

    1. 有没有办法在任何流行的C ++或Rust单元测试框架中强烈关联两个测试装置,其中两个装置被视为同一测试的两半,并且总是同时执行?
    2. 这留下了第二部分:如何让一个单元测试框架在一个进程中只执行客户端部分而在另一个进程中只执行服务器部分,并且两者总是同时并且彼此同步,而且将两个部分的junit XML输出合并为一个测试结果。所以:

      1. 是否有任何替代功能测试方法,方法或开源解决方案比单独测试框架(如Google Test或Boost.Test)更适合分布式网络功能测试?最好是libvirt知道什么,以便它可以编排虚拟机作为测试设置和拆卸的一部分?例如,是否有一些Jenkins插件或者某些东西可以在每个OpenVZ容器中使用Jenkins从属来协调每个功能测试的多个部分的并发执行?或者老式的CORBA仍然是最差的解决方案吗?是否有某种方法可以自动将测试装置包装到REST HTTP API中?
      2. 我确实快速审查了主要的集成测试框架,因此CitrusSTAFTwister。我老实说,他们似乎对我想要的东西有点过分,这是一种快速简便的方法,使现有的功能测试套件使用比环回更真实的网络路由。这就是我真正想要的所有内容,只要检查和要求仍然出现在Jenkins中,我就不在乎它是如何完成的。给你Stackoverflow!

        我提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

这样的系统可以在一周内实施,它实际上在你的控制之下。非常简单,非常容易扩展。

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