在代码中调用boost unit_test测试

时间:2016-04-26 15:59:48

标签: c++ unit-testing boost

我正试图从代码中调用boost :: unit_test。

我有很多文件

BOOST_AUTO_TEST_SUITE(DataAccessSuite)

BOOST_AUTO_TEST_CASE(DateAppender)
{
...
}
BOOST_AUTO_TEST_SUITE_END()

对于我的对话框,我有一个访问者来收集所有测试用例/套件的ID和名称

namespace {
    unit_test::test_suite* init_unit_test_suite(int argc, char** argv) {
        return 0;
    }
    using namespace std::string_literals;

    struct test_visitor : unit_test::test_tree_visitor {
        test_visitor(std::vector<std::tuple<std::string, unit_test::test_unit_id>>& tests) : m_tests(tests) {}
        void visit(unit_test::test_case const& test) {
            m_tests.emplace_back(std::make_tuple(suite + "/"s + static_cast<std::string>(test.p_name),test.p_id));
        }
        virtual bool    test_suite_start(unit_test::test_suite const& ts) { 
            suite = ts.p_name;
            return true;
        }
        virtual void    test_suite_finish(unit_test::test_suite const&) {
            suite = std::string();
        }

        std::string suite;
        std::vector<std::tuple<std::string, unit_test::test_unit_id>>& m_tests;
    };
}

TestDialogImpl::TestDialogImpl(wxWindow* parent) : TestDialog(parent)
{
    // Make a list of test cases to show in my dialog box
    unit_test::traverse_test_tree(unit_test::framework::master_test_suite(), test_visitor(m_tests), true);
    for (auto& test : m_tests) {
        m_listBox2->Append(wxString(std::get<0>(test)));
    }
}

这是我对测试用例的调用

void TestDialogImpl::OnClick_RunButton(wxCommandEvent & event)
{
    auto selection = m_listBox2->GetStringSelection();
    char* argv[] = { "OptionModeller.exe","--run_test=DataAccessSuite/DateAppender" };
    unit_test::framework::init(init_unit_test_suite, 2, argv);
    auto finder = std::find_if(std::begin(m_tests), std::end(m_tests), [&selection](auto& v) { return std::get<0>(v) == selection; });
     // This fails with setup_error(), but I don't know why?
    unit_test::framework::run(std::get<1>(*finder), true);
}

有没有办法可以调用测试并使用框架。我知道我可以选择调用自由函数,但这会使得使用BOOST_TEST

失败

更新

来自@A Fagrell的想法

我将测试执行程序的调用更改为

void TestDialogImpl::OnClick_RunButton(wxCommandEvent & event)
{
    wxString selection = "--run_test=" + m_listBox2->GetStringSelection();
    const char* option = static_cast<const char*>(selection);
    char* argv[] = { "OptionModeller.exe" , (char*)(option)};
    unit_test::unit_test_main(&init_unit_test_suite, 2, argv);
}

似乎工作正常,但似乎做错了做事。我希望能够通过id显式调用测试,而不是通过捏造命令行args。

有更好的方法吗?

0 个答案:

没有答案