单元测试作为构建的一部分
Unit testing as part of the build
我有一个分为三部分的 CMake 项目:
- 我的库的编译
- 许多单元测试程序的编译,测试这些库的每个精确子部分
- 使用这些库编译程序示例
我的问题是关于第 2nd 部分。我的单元测试可执行文件是带有 main
return 的短二进制程序,成功时为 0,失败时为 1。我想将他们的 运行ning 作为构建的一部分进行集成。
是否可以使用 CMake 来执行这两种解决方案之一:
- 运行 每个单元测试程序并检查 return 值并在任何失败时生成错误。
- 生成一个测试脚本 运行 并检查每个单元测试程序并检查 return 值以在任何失败时产生错误。
我不是在寻找完整的 CMake 脚本代码,通过 link 对相应文档的简单说明就足够了。
看到一个类似的问题和我的回答。
主要是我的建议是向运行 ctest
的单元测试目标添加一个 POST_BUILD
步骤。如果 POST_BUILD
步骤失败(return 代码不为 0),构建将失败。
类似于:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> -R "^${UNIT_TEST}$" --output-on-failures
)
这样做的好处是它的运行方式与您调用 ctest
.
的方式相同
没有 add_test()
/ ctest
的简短版本是:
set(UNIT_TEST MyLibUnitTestTargetName)
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
COMMAND ${UNIT_TEST}
)
参考文献:
add_test()
add_custom_command()
- How to run ctest after building my project with cmake
- CMake: Running unit test as part of the build
如果你想保留你的测试二进制文件,即使测试失败,你可以尝试这样的事情:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_target(run_unit_test ALL
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
DEPENDS ${UNIT_TEST})
这将创建一个始终运行单元测试的目标。但是,因为它是一个单独的目标,所以该命令的失败将导致构建失败,但不会删除原始 UNIT_TEST
目标生成的二进制文件。
我有一个分为三部分的 CMake 项目:
- 我的库的编译
- 许多单元测试程序的编译,测试这些库的每个精确子部分
- 使用这些库编译程序示例
我的问题是关于第 2nd 部分。我的单元测试可执行文件是带有 main
return 的短二进制程序,成功时为 0,失败时为 1。我想将他们的 运行ning 作为构建的一部分进行集成。
是否可以使用 CMake 来执行这两种解决方案之一:
- 运行 每个单元测试程序并检查 return 值并在任何失败时生成错误。
- 生成一个测试脚本 运行 并检查每个单元测试程序并检查 return 值以在任何失败时产生错误。
我不是在寻找完整的 CMake 脚本代码,通过 link 对相应文档的简单说明就足够了。
看到一个类似的问题和我的回答
主要是我的建议是向运行 ctest
的单元测试目标添加一个 POST_BUILD
步骤。如果 POST_BUILD
步骤失败(return 代码不为 0),构建将失败。
类似于:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> -R "^${UNIT_TEST}$" --output-on-failures
)
这样做的好处是它的运行方式与您调用 ctest
.
没有 add_test()
/ ctest
的简短版本是:
set(UNIT_TEST MyLibUnitTestTargetName)
add_custom_command(
TARGET ${UNIT_TEST}
COMMENT "Run tests"
POST_BUILD
COMMAND ${UNIT_TEST}
)
参考文献:
add_test()
add_custom_command()
- How to run ctest after building my project with cmake
- CMake: Running unit test as part of the build
如果你想保留你的测试二进制文件,即使测试失败,你可以尝试这样的事情:
set(UNIT_TEST MyLibUnitTestTargetName)
add_test(NAME ${UNIT_TEST} COMMAND ${UNIT_TEST})
add_custom_target(run_unit_test ALL
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
DEPENDS ${UNIT_TEST})
这将创建一个始终运行单元测试的目标。但是,因为它是一个单独的目标,所以该命令的失败将导致构建失败,但不会删除原始 UNIT_TEST
目标生成的二进制文件。