c++ - 在不同进程上运行 Boost 单元测试

标签 c++ unit-testing boost boost-test systemc

我想在 SystemC 程序中进行单元测试。这个想法是有多个测试套件,每个套件中有几个测试。每一项测试都需要重置 SystemC 框架(例如,通过调用 sc_simcontext::reset()),但这实际上是不可能的,因为某些错误显然不会随时修复很快。因此,我决定想出一个解决方法。

我发现,如果我在不同的进程上运行每个测试,一切都会正常进行。以下代码片段概述了我用来使其工作的方案:

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 Unit Test来实现这样一个测试方案。

我一直在研究 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 并且输出被重定向到一个文件,一切正常。

关于c++ - 在不同进程上运行 Boost 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706294/

相关文章:

c++ - C++ 中的模拟和依赖注入(inject)

c++ - 从 C++ stringstream ostringstream 获取 char* 数组

react-native - 为什么我无法安装 React Native 测试库?

unit-testing - 如何为数学优化程序编写测试?

c++ - 模板化部分应用调用问题

c++ - OpenSceneGraph - 真实大小的对象

c++ - 如何使用getter函数将列表推回列表?

ios - NSInMemoryStoreType 类型的核心数据忽略实体的约束

c++ - boost/thread.hpp 失败并显示 'clang++ -std=c++11 -stdlib=libc++'

c++ - 通过 boost append 到现有文件