簡體   English   中英

運行Boost單元測試不同的進程

[英]Running Boost unit tests on different processes

我想在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單元測試來實現這樣的測試方案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM