首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助开始使用Boost.Test

帮助开始使用Boost.Test
EN

Stack Overflow用户
提问于 2009-06-08 01:09:59
回答 5查看 11.6K关注 0票数 11

我正在尝试开始单元测试。我正在研究一些C++框架,并想尝试一下Boost.Test。文档看起来非常详尽,而且有点让人不知所措,特别是那些刚接触单元测试的人。所以这是我想要的情形:

假设我有两个类,FooBar。我想为FooBar编写一套测试,最好是在不同的文件中。我只想在使用命令行参数运行程序的情况下运行测试。所以我的main()应该看起来像这样:

代码语言:javascript
复制
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应该是这样的:

代码语言:javascript
复制
#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的经验呢?有人能以详细的方式提供帮助吗?非常感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-08 09:20:46

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

这就是说,对于您正在进行单元测试的每个项目,都要有一个单独的测试项目。然后包含构建测试项目所需的源代码和库。

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

票数 4
EN

Stack Overflow用户

发布于 2009-06-08 08:26:28

在您的test_foo.cpp中,宏将测试套件和测试用例添加到全局列表中:master_testsuite,它是所有测试节点的根。你只需要编译所有的测试文件,如test_foo.cpptest_boo.cpp和一个运行器,然后将它们链接到可执行文件中。

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

代码语言:javascript
复制
boost::unit_test::unit_test_main(
    &init_unit_test,
    argc,
    argv
)

基于您在包含<boost/test/unit_test.h>之前定义的宏,Boost.Test可能已经为您生成了main函数。1生成的main只需在main中使用argcargv调用unit_test_main。推荐使用unit_test_main,因为它可以处理一些控制台参数,比如run test by name

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

代码语言:javascript
复制
#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_MAINBOOST_TEST_MAIN,但未定义BOOST_TEST_NO_MAIN,则为1。

票数 12
EN

Stack Overflow用户

发布于 2009-06-08 11:07:49

你可以从一个菜单命令开始测试,但它并不是那么简单,遗憾的是没有很好的文档。更可悲的是,不可能传递要创建日志文件的路径。我不得不自己添加这样一个命令行选项。不幸的是,我还没有提交它。我的代码如下所示:

代码语言:javascript
复制
#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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/963158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档