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

时间:2010-05-25 15:29:51

标签: c++ unit-testing boost tcp mocking

Boost.Test documentation和示例似乎并不包含任何非常重要的示例,到目前为止,我发现herehere这两个教程虽然有用,但它们都非常基本

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

我使用的是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()

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

这给了我关于链接期间错误的“多重定义”的信息。

当它全部在一个文件中时,它可以正常工作。

3 个答案:

答案 0 :(得分:43)

C++ Unit Testing With Boost.Test

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

修改:

  

我还写了一个Perl脚本   自动生成makefile和项目   类名列表中的骨架,   包括“一体化”测试   套件和独立的测试套件   每节课。它被称为   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

或编译单独的测试:

g++ test1.cpp -DSTAND_ALONE -lboost_unit_test_framework -o test1

// 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()

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:3)

当我只从Boost.Test开始时,以下带有源代码的文章非常有用: Boost test setup and usage