【问题标题】:What physical layout for Unit-Tested projects?单元测试项目的物理布局是什么?
【发布时间】:2016-04-08 11:52:05
【问题描述】:

目前,我正在学习单元测试,我想将测试集成到我当前的(10 个 OpenGL 实验文件)项目中。为此,我下载了 Boost.Test,虽然我可以弄清楚它是如何在单个文件示例上工作的,但我不知道如何将它集成到我的项目中(我想使用静态链接版本)。

是否测试了与应用程序本身不同的二进制文件? (如果它是一个二进制文件,如何运行它?)我应该为每个测试类创建一个测试文件吗?我的 CMakeLists 应该改变多少来反映这种集成?是否可以将测试与应用程序解耦,以便我可以在没有安装 boost 的平台上构建我的应用程序?

我知道我有很多问题,但简单地说:Boost.Test 在现实生活中是如何使用的?

【问题讨论】:

    标签: c++ unit-testing structure boost-test


    【解决方案1】:

    如果您的项目构建了一个库或可执行文件,我建议您创建一个额外的测试运行程序可执行文件。在我的项目中,我通常有以下布局:

    /mylib
      CMakeLists.txt
      /inc
        ClassA.hpp
        ClassB.hpp
      /src
        ClassA.cpp
        ClassB.cpp
      /test
        ClassA_test.cpp
        ClassB_test.cpp
        main_test.cpp
    

    如您所见,每个班级都有一个测试文件。这具有减少编译依赖性的主要好处。然后在我的CMakeLists.txt 中创建我的库和相关的测试运行器

    # Get Boost
    find_package ( Boost COMPONENTS unit_test_framework )
    # Here you set library sources, use file ( GLOB ... ) if you have many
    set ( SOURCES ClassA.cpp ClassB.cpp )    
    add_library ( mylib ${SOURCES} )
    
    if (Boost_FOUND)
      # Here you set test sources, use file ( GLOB ... ) if you have many
      set ( TESTSOURCES ClassA_test.cpp ClassB_test.cpp )    
      # This creates the test runner
      add_executable (  mylib_test_runner ${TESTSOURCES} )
      # Here the tests of the runner are linked to the related library and Boost
      target_link_libraries ( mylib_test_runner mylib ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} )
    endif ( )
    

    文件 main_test.cpp 仅用于为测试运行程序自动生成主函数

    #define BOOST_TEST_MODULE MyTestSuite
    #define BOOST_TEST_DYN_LINK
    #include <boost/test/unit_test.hpp>
    

    那么,例如,ClassB_test.cpp 可能具有以下布局:

    #include "../inc/ClassB.hpp"
    #include <boost/test/unit_test.hpp>
    
    BOOST_AUTO_TEST_SUITE ( ClassBTest )
    
    BOOST_AUTO_TEST_CASE ( TestFoo )
    {
      BOOST_CHECK(true);
    }
    
    ...
    
    BOOST_AUTO_TEST_SUITE_END() // ClassBTest
    

    总结一下:

    • 是否测试与应用程序本身不同的二进制文件? - 对,就那个 是可能的,当然有帮助。
    • 如果是一个二进制文件,如何运行它? - 在这种情况下:./mylib_test_runner
    • 我应该为每个测试类创建一个测试文件吗? - 我建议你这样做。
    • 我的 CMakeLists 应该改变多少来反映这种集成? - 见例子。
    • 是否可以将测试与应用程序分离,以我 可以在我没有安装 boost 的平台上构建我的应用程序吗? - 这 检查 Boost_FOUND 可以解决这个问题,您还可以添加一个 选项到您的 CMakeLists.txt 并检查。我个人认为这样更好。

    【讨论】:

    • 我不应该也将“src”和“inc”文件添加到 mylib_test_runner 吗?
    • @bisthebis 您的测试文件当然会包含类头文件。但符号解析将由链接器处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多