2014-09-07 5 views
4

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); 
} 

지금 내가 부스트 단위 테스트와 같은 테스트 방식을 구현하려면 다음 코드는 나는 그것이 작동되도록하는 데 사용되는 방식의 개요를 제공합니다.

부스트 유닛 테스트 라이브러리의 내부를 연구 해본 결과 unit_test_main이 모든 테스트의 실행을 트리거하는 것으로 나타났습니다. 하지만 Boost Unit Test와 상호 작용할 수있는 비 간섭 식 방식을 고안하여 각 테스트를 다른 프로세스에서 실행하는 것은 불가능했습니다.

누구나 다른 프로세스에서 각 테스트를 실행하기위한 간단한 해결책을 알고 있습니까?

답변

0

내가 나온 해결책에 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가 포함

,536,
#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이고 출력이 파일로 리디렉션되면 모든 것이 잘 작동하는 것으로 나타났습니다.