【发布时间】: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 年代微软唯一的解决方案。也许有一些现代和便携的等价物,我没有在这里寻找合适的术语,所以这是我的第一个问题:
- 是否有任何标准功能测试库或框架扩展了 Google Test 或 Boost.Test 等,让您可以在运行时轻松选择每个功能测试的服务器和客户端部分是作为线程运行还是作为进程运行,还是最好的,作为拥有自己的网络堆栈的自己的虚拟机中的进程?
这个测试场景肯定很常见。但是让我们假设它不是,并且不存在这样的工具。如果没有,那么我们需要扩展 Boost.Test 或 Google Test 并提供一些额外的支持。首先,我们需要为每个测试夹具关联一个支持“服务器”部分的测试夹具,对于线程测试场景,我们需要始终同时运行服务器和客户端测试夹具。所以,我的第二个问题:
- 在任何流行的 C++ 或 Rust 单元测试框架中,是否有任何方法可以将两个测试夹具强关联,其中两个夹具被视为同一测试的两半,并且始终同时执行?
这就剩下第二部分:如何让单元测试框架在一个进程中只执行客户端部分,而在另一个进程中只执行服务器部分,并且始终同时执行并彼此同步,此外将两个部分的 junit XML 输出合并到一个测试结果中。所以:
- 是否有任何替代功能测试方法、方法或开源解决方案比 Google Test 或 Boost.Test 等单元测试框架更适合分布式网络功能测试?最好是 libvirt 感知的东西,以便它可以在测试设置和拆卸过程中编排虚拟机?例如,是否有一些 Jenkins 插件或可以在每个 OpenVZ 容器中使用 Jenkins slave 来协调每个功能测试的多个部分的并发执行?还是老式的 CORBA 仍然是这里最糟糕的解决方案?是否有某种方法可以将测试装置自动包装到 REST HTTP API 中?
我确实快速回顾了主要的集成测试框架,所以Citrus、STAF 和Twister。老实说,对于我想要的东西,它们似乎都太过分了,这是一种快速简便的方法,可以使现有的功能测试套件使用比环回更现实的网络路由。这就是我真正想要的本质,我不在乎它是如何完成的,只要检查和要求仍然出现在 Jenkins 中。 Stackoverflow 交给你了!
提前感谢您的帮助。
【问题讨论】:
标签: c++ unit-testing jenkins integration-testing