c++ - 在虚拟机之间分布单元测试

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

最近几天,我一直在寻找功能测试问题的现有解决方案,但是我没有主意,不胜感激。

我有一个预先存在的功能网络测试套件,当前使用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年代唯一的Microsoft解决方案。也许有一些现代且可移植的等效项,而我在这里不是在寻找正确的术语,所以这是我的第一个问题:

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

  • 这种测试场景肯定是很普遍的。但让我们假设不是,并且不存在这样的工具。如果没有,那么我们需要扩展Boost.Test或Google Test,并提供一些额外的支持。首先,我们需要与每个测试夹具关联一个支持的“服务器”部分测试夹具,对于线程测试方案,我们需要始终同时运行服务器和客户端测试夹具。所以,我的第二个问题是:
  • 在任何流行的C++或Rust单元测试框架中,是否有任何方法可以将两个测试夹具牢固地关联在一起,而这两个夹具被视为同一测试的两半,并且总是同时执行?

  • 剩下的第二部分是:如何获得一个单元测试框架,以便仅在一个进程中执行客户端部分,而在另一进程中仅执行服务器部分,以及始终同时并相互同步地进行操作,以及如何合并单元测试框架。将两部分的junit XML输出转换为单个测试结果。所以:
  • 是否有其他替代功能测试方法,方法或开源解决方案,比诸如Google Test或Boost.Test之类的单元测试框架更适合于分布式网络功能测试?最好是一些libvirt知道的东西,以便它可以将虚拟机编排为测试设置和拆卸的一部分?例如,在每个OpenVZ容器中是否有一些Jenkins插件或某种可以使用Jenkins从站来协调每个功能测试的多个部分的并发执行?还是老式CORBA仍然是这里最差的解决方案?是否有某种方法可以自动将测试装置包装到REST HTTP API中?

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

    在此先感谢您的帮助。

    最佳答案

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

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

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

    这样的系统可以在一周内实现,并且真正由您控制。做起来很简单而且很扩展。

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

    关于c++ - 在虚拟机之间分布单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29186717/

    相关文章:

    unit-testing - 单元测试是否应该依赖于应用程序定义的常量?

    java - 在 WebSphere 6.1 上使用 ant/jenkins 生成 EAR 的类转换异常

    c++ - 在 C++ 中将 Apache Arrow Table 转换为 RecordBatch

    c++ - 在 Thrift 中取消阻塞读操作

    unit-testing - polymer 单元测试模拟依赖项

    PHPUnit:使用来自父类的测试来测试依赖关系

    java - 也许您正在 JRE 而不是 JDK 上运行

    concurrency - 如何在并行执行中启动具有不同参数的相同作业?

    c++ - 如何从函数地址或类中找到 CFBundleRef

    c++ - 是否可以用 CMake 将某些符号替换为不同的符号?