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

What physical layout for Unit-Tested projects?

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

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

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

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

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

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

# 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只是为了自动生成测试用的main函数运行ner

#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
  • 我应该为每个测试的文件创建一个测试文件吗class? - 我建议你这样做。
  • 我的 CMakeLists 应该改变多少才能反映这种集成? - 请参阅示例。
  • 是否有可能以我认为的方式将测试与应用程序分离 可以在我没有安装 boost 的平台上构建我的应用程序吗? - 这 检查 Boost_FOUND 会解决这个问题,您还可以添加一个 选择你的 CMakeLists.txt 并检查它。我个人认为这样更好。