代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

测试:寻找一个有效的非平凡的测试套件示例/教程[关闭]

  •  32
  • Robert S. Barnes Antoni  · 技术社区  · 15 年前

    这个 Boost.Test documentation 示例似乎并不包含任何不平凡的示例,到目前为止,我发现的两个教程 here here 虽然有用,但都是相当基本的。

    我希望整个项目都有一个主测试套件,同时维护每个模块的单元测试套件和可以独立运行的设备。我还将使用模拟服务器来测试各种网络边缘情况。

    我在Ubuntu8.04上,但我会以Linux或Windows为例,因为我无论如何都在写自己的makefiles。

    编辑

    作为测试,我做了以下工作:

    // 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 回复  |  直到 14 年前
        1
  •  43
  •   Robert S. Barnes Antoni    14 年前

    C++ Unit Testing With Boost.Test

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

    编辑:

    我还写了一个Perl脚本, 自动生成生成生成文件和项目 类名列表中的骨架, 包括“一体”测试 套件和独立测试套件 每堂课。它叫 makeSimple 可以下载 来自sourceforge.net。

    我发现的基本问题是,如果要将测试拆分为多个文件,则必须针对预编译的测试运行时链接,而不是使用boost.test的“headers only”版本。你必须增加 #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()
    
        2
  •  8
  •   Edward Strange    15 年前

    我不知道你真正需要什么,除了后面的教程。我已经用这种方式做了我需要做的一切。我也不太明白你的描述。

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

    如果您希望两者都能够一起编译并分别编译它们,那么您可以使用自己的-d变量来定义boost-test-u模块。

    如果您正在寻找一种方法,在一次运行中运行大量测试程序并获得报告,那么您可以查看进行测试的automake方法,或者更好的方法是cmake方法(ctest)。如果你坚持的话,你可以使用你自己制作的文件中的CTEST。

        3
  •  3
  •   Hindu    14 年前

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