帮助开始使用Boost.Test

rlb*_*ond 11 c++ boost unit-testing

我正在尝试开始单元测试.我正在寻找一些C++框架,并想尝试Boost.Test.文档看起来非常彻底,而且有点压倒性,尤其是新的单元测试人员.所以这是我想要的情况:

假设我有2个课程,Foo并且Bar.我想编写一套测试Foo和一套测试Bar,最好是在不同的文件中.我只想在运行带有命令行参数的程序时才运行测试.所以我main()应该看起来像:

int main(int argc, const char* argv[])
{
    if (argc == 1 && strcmp(argv[0], "-test") == 0)
        run_all_tests();
    else
        return program_main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

我想test_foo.cpp应该是这样的:

#include "foo.hpp"
#define BOOST_TEST_MODULE Foo test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE( Foo_Test )

BOOST_AUTO_TEST_CASE( Foo1 )
{
    Foo f;
    BOOST_CHECK( f.isValid() );
}

BOOST_AUTO_TEST_CASE( Foo2 )
{
    Foo f;
    BOOST_CHECK( f.baz() == 5 );
}

BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

但是,我不知道(1)运行测试的实际命令是什么,以及(2)如何实际告诉库我想要运行每个测试.

那么,谁有Boost.Test的经验?有人可以详细帮助吗?非常感谢.

小智 12

在您test_foo.cpp的宏中,宏将测试套件和测试用例添加到全局列表中:master_testsuite这是所有测试节点的根.你只需要编译所有的测试文件一样 test_foo.cpp,test_boo.cpp和一个亚军,再把它们连接成上执行.

该函数unit_test_main用于运行测试master_testsuite.

boost::unit_test::unit_test_main(
    &init_unit_test,
    argc,
    argv
)
Run Code Online (Sandbox Code Playgroud)

根据您之前定义的宏 <boost/test/unit_test.h>,Boost.Test可能已经main 为您生成了函数.[1] 生成的main简单调用 unit_test_mainwith argcargvin main.建议使用unit_test_main它,因为它可以处理一些控制台参数,例如按名称运行测试.

第一个参数unit_test_main是一个钩子.根据不同 BOOST_TEST_ALTERNATIVE_INIT_API,它有不同的定义.

#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
typedef bool        (*init_unit_test_func)();
#else
typedef test_suite* (*init_unit_test_func)( int, char* [] );
#endif
Run Code Online (Sandbox Code Playgroud)

你可以自定义master_testsuite钩子.在第二种形式中,返回的值是新的主测试套件.

[1],如果BOOST_TEST_MAINBOOST_TEST_MAIN被定义,但 BOOST_TEST_NO_MAIN并非如此.


RED*_*AIR 5

您可以从菜单命令开始测试,但这并不是那么简单,遗憾的是没有详细记录.更难过 - 它无法通过创建日志文件的路径.我必须自己添加这样一个命令行选项.不幸的是我尚未提交.我的代码看起来像这样:

#ifdef DEBUG

#undef main
#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>

int DoUnitTests()

{
    char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"};

    bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args) / sizeof(char*), args);

    MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" :  "Goooood!");
    return result;
}

#else
int DoUnitTests()

{
}
#endif
Run Code Online (Sandbox Code Playgroud)


iai*_*ain 4

BOOST.Test 非常灵活,您可能可以做您想做的事情。但是,既然您说您是单元测试的新手,那么您可能应该遵循标准的单元测试结构。

这是为您正在单元测试的每个项目都有一个单独的测试项目。然后包含构建测试项目所需的源和库。

这更干净,因为主项目中没有可能意外运行的测试逻辑,并且很容易运行测试,因为它们有自己的可执行文件。这种方法也适用于测试库。如果您遵循此结构,您会发现大多数 BOOST.Test 默认值都是开箱即用的,您只需编写测试和代码即可。