Boost.Test:寻找一个有效的非平凡测试套件示例/教程

Rob*_*nes 33 c++ boost unit-testing tcp mocking

如Boost.Test文档和例子并不真的似乎包含我发现任何不平凡的例子,到目前为止,两个教程这里这里同时有帮助都是非常基本的.

我希望为整个项目提供一个主测试套件,同时保持每个模块套件的单元测试和可以独立运行的灯具.我还将使用模拟服务器来测试各种网络边缘情况.

我在使用Ubuntu 8.04,但我会采用Linux或Windows的任何示例,因为我正在编写自己的makefile.

编辑

作为测试,我做了以下事情:

// test1.cpp
#define BOOST_TEST_MODULE Regression
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test1_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(2 < 1);
}

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(1<2);
}

BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

然后我编译它: g++ test1.cpp test2.cpp -o tests

这给了我关于链接期间的大量"多重定义"错误.

当它在一个文件中时它工作正常.

Rob*_*nes 44

使用Boost.Test进行C++单元测试

以上是一篇精彩的文章,比实际的Boost文档更好.

编辑:

我还编写了一个Perl脚本,它将从类名列表中自动生成makefile和项目框架,包括"all-in-one"测试套件和每个类的独立测试套件.它叫做 makeSimple,可以从Sourceforge.net下载.

我发现的基本问题是,如果要将测试拆分为多个文件,则必须链接到预编译的测试运行时,而不是使用Boost.Test的"仅标题"版本.您必须添加#define BOOST_TEST_DYN_LINK到每个文件,并包含Boost标头,例如使用<boost/test/unit_test.hpp>而不是<boost/test/included/unit_test.hpp>.

所以要编译为单个测试:

g++ test_main.cpp test1.cpp test2.cpp -lboost_unit_test_framework -o tests
Run Code Online (Sandbox Code Playgroud)

或者编译一个单独的测试:

g++ test1.cpp -DSTAND_ALONE -lboost_unit_test_framework -o test1
Run Code Online (Sandbox Code Playgroud)

.

// test_main.cpp
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>

// test1.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test1_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(2<1);
}

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(1<2);
}

BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)


Edw*_*nge 8

我不知道你真正需要的是什么,而不是后面教程中的内容.我已经完成了我需要的所有事情.不确定我理解你的描述.

您可能要求的一件事是能够在您的测试程序中拥有多个.cpp文件.这就像在其中一个.cpp文件中定义BOOST_TEST_MODULE一样简单.我们在所有测试程序中都有一个"driver.cpp"文件,它只定义了它并包含单元测试头.所有其余的.cpp文件(由模块或概念确定)仅包含单元测试头,它们不定义该变量.

如果您希望能够将它们一起编译并单独编译,那么您可以使用自己的-D变量来定义BOOST_TEST_MODULE.

如果您正在寻找一种方法来在一次运行中运行一堆测试程序并获得报告,那么您可以查看执行测试的automake方法,或者更好的是CMake方法(CTest).如果你坚持的话,非常确定你可以使用你自己的makefile中的CTest.