单元测试项目的物理布局是什么?

bis*_*bis 5 c++ unit-testing structure boost-test

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

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

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

Ton*_*Big 3

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

/mylib
  CMakeLists.txt
  /inc
    ClassA.hpp
    ClassB.hpp
  /src
    ClassA.cpp
    ClassB.cpp
  /test
    ClassA_test.cpp
    ClassB_test.cpp
    main_test.cpp
Run Code Online (Sandbox Code Playgroud)

如您所见,每个类都有一个测试文件。这样做的主要好处是减少编译依赖性。然后在我的库中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 ( )
Run Code Online (Sandbox Code Playgroud)

文件 main_test.cpp 仅用于自动生成测试运行器的 main 函数

#define BOOST_TEST_MODULE MyTestSuite
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
Run Code Online (Sandbox Code Playgroud)

然后,例如,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
Run Code Online (Sandbox Code Playgroud)

总结一下:

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