单元测试项目的物理布局是什么?
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 并检查它。我个人认为这样更好。
目前,我正在学习单元测试,我想将测试集成到我当前的(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 并检查它。我个人认为这样更好。