在不同进程上运行Boost单元测试
Running Boost unit tests on different processes
我想在SystemC程序中进行单元测试。这个想法是有多个测试套件,每个套件中有几个测试。每一个测试都需要重置SystemC框架(例如,通过调用sc_simcontext::reset()
),但实际上这是不可能的,因为一些bug显然不会很快修复。因此,我决定想出一个变通办法。
我发现,如果我在不同的流程上运行每个测试,一切都会很好。下面的代码片段概述了我用来使其工作的方案:
void test1() {
// ...
sc_start();
}
void test2() {
// ...
sc_start();
}
typedef std::function<void()> TestFunction;
void run_test(TestFunction test_function) {
pid_t pid = fork();
switch (pid) {
case -1:
throw std::runtime_error("Error forking process");
case 0:
test_function();
exit(0);
default:
waitpid(pid, nullptr, 0);
break;
}
}
int main() {
run_test(test1);
run_test(test2);
}
现在我想用Boost单元测试来实现这样一个测试方案。
我一直在研究Boost单元测试库的内部,我发现unit_test_main
似乎是触发所有测试执行的函数。但我无法设计一种非侵入性的方式来与Boost单元测试交互,以便在不同的进程上运行每个测试。
有人知道在不同的流程上运行每个测试的简单解决方案吗?
我对我提出的解决方案不是100%满意,但无论如何我都会发布它。为了方便起见,我将所有内容封装到一个名称空间中:
头文件:
namespace util {
typedef std::function<void()> TestFunction;
void run_test(TestFunction test_function);
} // namespace util
#define SYSTEMC_TEST_CASE(name)
void name##_impl();
BOOST_AUTO_TEST_CASE(name) {
util::run_test(name##_impl);
}
void name##_impl()
源文件:
namespace util {
void run_test(TestFunction test_function) {
pid_t pid = fork();
switch (pid) {
case -1:
throw std::runtime_error("Error forking process");
case 0:
try { test_function(); }
catch (const std::exception& e) {
std::cout << boost::format("Exception caught: %1%") % e.what() << std::endl;
exit(1);
}
catch (...) { exit(1); }
exit(0);
default:
waitpid(pid, nullptr, 0);
break;
}
}
} // namespace util
用法示例:
BOOST_AUTO_TEST_SUITE(suite)
SYSTEMC_TEST_CASE(test_case1) {
// ...
}
SYSTEMC_TEST_CASE(test_case2) {
// ...
}
BOOST_AUTO_TEST_SUITE_END()
main.cpp
包含:
#define BOOST_TEST_MODULE TestModule
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_NO_MAIN
#include <boost/test/unit_test.hpp>
#include <systemc.h>
boost::unit_test::test_suite* init_unit_test_suite(int, char*[]) {
using namespace ::boost::unit_test;
assign_op(framework::master_test_suite().p_name.value,
BOOST_TEST_STRINGIZE(BOOST_TEST_MODULE).trim("""), 0);
return 0;
}
int sc_main(int argc, char* argv[]) {
return boost::unit_test::unit_test_main(&init_unit_test, argc, argv);
}
现在,每个测试用例都将在不同的进程上执行。因此,SystemC在一次执行过程中可以多次运行而不会出现任何问题。
该解决方案的唯一实际问题是,由于某些原因,在输出XML结果时不可能使用文件接收器。但我发现,如果接收器是stderr
,并且输出被重定向到一个文件,那么一切都很好。
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 为什么 boost::asio::ip::tcp::basic_stream_socket::available 的运行
- 仅在 boost::hash_combine 中运行一个程序期间保证确定性
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- 如何使用 boost::asio io_service 运行函数异步
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 如何使用boost.thread运行多个接收器,每个线程应该分配给每个接收器?
- 在 boost::p ython 中的 python 对象中运行 python 代码
- 使用 boost::thread 运行函子,但析构函数被错误地调用
- boost SHA1 哈希与 md5sum/sha1sum 的运行时比较
- BOOST ::日志是每次运行应用程序时都可能旋转文件
- C 从类的构造函数运行Boost线程
- 运行 boost::asio 异步服务器以及命令循环
- 如何在QT Creator中运行Boost单元测试
- 从 Visual Studio 2010 运行 BOOST 单元测试
- 如何在端口 80 上运行 Boost.Asio 服务器
- 如何在许多处理器上运行 boost::threads
- 在不同进程上运行Boost单元测试
- 在boost线程中运行boost asio io_service