c++ - 帮助开始使用 Boost.Test

标签 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 的经验?有人能帮忙详细点吗?非常感谢。

最佳答案

在你的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
)

基于您在包含之前定义的宏 <boost/test/unit_test.h> , Boost.Test 可能已经生成了 main 为您服务。[1]生成的 main简单地调用 unit_test_mainargcargvmain .建议 使用 unit_test_main因为它可以处理一些控制台参数, 喜欢run test by name .

unit_test_main 的第一个参数是一个钩子(Hook)。根据 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在钩子(Hook)里。在第二 形式,返回值是新的主测试套件。

[1] 如果BOOST_TEST_MAINBOOST_TEST_MAIN被定义,但是 BOOST_TEST_NO_MAIN不是。

关于c++ - 帮助开始使用 Boost.Test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/963158/

相关文章:

c++ - 更改编译器标志的顺序

c++ - 多次内存映射同一个文件?

c++ - "NUL"字符 ("\0") 字节是分开的还是分配给带有字符串的字符数组?

c++ - 如何计算预期的核心文件大小

c++ - 无法打开包含文件错误但能够找到文件

java - 在 Mockito 中重用模拟行为/最佳实践?

python - 根据输入参数调用unittest中的不同方法

C++ std::map 与动态数组

angular - 如何在 stackblitz 中使用 Angular 设置 Jest

c++ - boost 属性树 : How to delete the specified parameters of the node