帮助开始使用Boost.Test

时间:2009-06-08 01:09:59

标签: c++ unit-testing boost

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

假设我有2个课程FooBar。我想为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);
}

我认为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()

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

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

5 个答案:

答案 0 :(得分:12)

test_foo.cpp中,宏添加了测试套件和测试用例 到全局列表:master_testsuite,这是所有测试的根 节点。你只需要编译所有的测试文件 test_foo.cpptest_boo.cpp和跑步者,然后将它们全部链接到 可执行文件。

函数unit_test_main用于在master_testsuite中运行测试。

boost::unit_test::unit_test_main(
    &init_unit_test,
    argc,
    argv
)

基于您之前定义的宏,包括 <boost/test/unit_test.h> Boost.Test 可能已生成main 适合你。[1]生成的main只是被调用 unit_test_main argc argvmain unit_test_main。这是推荐的 使用unit_test_main因为它可以处理一些控制台参数, 比如run test by name

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 ,它有不同的定义。

master_testsuite

您可以自定义挂钩中的BOOST_TEST_MAIN。在第二 表单,返回的值是新的主测试套件。

[1]如果定义了BOOST_TEST_MAINBOOST_TEST_NO_MAIN,但是 {{1}}不是。

答案 1 :(得分: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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

在NUnit中没有独立的测试运行器

您只需将测试用例构建为单个.exe应用程序(如果您使用的是Windows)并运行它

答案 4 :(得分:0)

尝试我写的这个脚本,给定一个程序名和类列表将为每个类/模块生成makefile,项目框架和测试套件框架。它还设置了所有内容,以便每个类的测试套件可以单独运行,也可以作为一体化全局套件的一部分运行。

这是致电makeSimple,可在sourceforge上找到。