您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。
本文还是读者群内的一个读者朋友,他提出想要了我写一篇文章介绍gtest,能有读者提需求,让我有机会写一些对大家有用的东西,我还是非常开心的。可以通过公众号获取我的微信,拉你进技术交流群
可惜的是,Gtest我只是了解过一点点,但是由于其需要依赖对应的库,对于项目来讲有些重,所以最终选择了CTest——CMake提供的测试工具。
CTest是CMake自带的测试工具,专门用于自动化测试。如果你的项目使用CMake构建,CTest几乎是零成本集成的最佳选择。。CTest具有如下特性:
虽然市面上有许多优秀的测试框架,如Google Test、Catch2、Boost Test,但如果你的项目已使用CMake,CTest更为便捷。
CTest的使用有两个前提,已经安装CMake且项目使用CMake构建。 在满足如上前提得前提下,可以使用如下得步骤使用CTest:
书写测试程序:测试程序可以是任何可执行文件,CTest会运行它并根据返回值判断测试是否通过(0为通过,其他为失败)。;
编写CMakeLists.txt文件:在CMakeLists.txt文件中,需要添加CTest相关得配置,如添加CTest得依赖、添加测试用例等;
#other cmake code
# 开启CTest
enable_testing()
add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME})
构建项目:如同普通得程序一样,可使用如下得命令构建项目:
mkdir build
cd build
cmake ..
cmake --build .
运行CTest:CTest的运行非常简单,只需要在构建目录下运行如下得命令即可:
ctest -C Debug
注意:-C 指定构建类型(Debug、Release等),需与cmake中指定的类型一致。
运行完后,便可以在控制台中看到测试结果,CTest也会在build/Testing文件夹下生成一个Test.xml文件,记录了测试结果。
CTest除了上述的基础使用外,还有许多高级功能,包括测试用例的参数、依赖管理、并行执行、超时设置、标签分组等,下面将详细介绍这些功能。
# 使用set_tests_properties设置命令行参数
add_test(NAME test_with_variable_args COMMAND ${PROJECT_NAME})
set_tests_properties(test_with_variable_args PROPERTIES COMMAND_ARGUMENTS "arg1;arg2")
# 注意:参数之间使用分号分隔,整个参数字符串需要用引号包围
add_test(NAME InitTest COMMAND init)
add_test(NAME MainTest COMMAND main)
set_tests_properties(MainTest PROPERTIES DEPENDS InitTest)
# 设置特定测试的并行级别
set_tests_properties(test_name PROPERTIES PROCESSORS 4)
# 运行时使用-j参数指定并行数
# ctest -j 4
# 设置测试超时时间(单位:秒)
set_tests_properties(test_name PROPERTIES TIMEOUT 30)
# 添加测试标签
set_tests_properties(test_name PROPERTIES LABELS "UnitTest;FastTest")
# 运行时可以使用标签筛选
# ctest -L UnitTest # 运行带有UnitTest标签的测试
# ctest -LE FastTest # 运行不带FastTest标签的测试
# 设置测试的环境变量
set_tests_properties(test_name PROPERTIES ENVIRONMENT "PATH=/custom/path;VAR=value")
# 添加带输出比较的测试
add_test(NAME output_test COMMAND ${PROJECT_NAME}_test)
set_tests_properties(output_test PROPERTIES
PASS_REGULAR_EXPRESSION "Test passed"
FAIL_REGULAR_EXPRESSION "Test failed"
)
在使用CTest时,需要注意以下几点:
如果你的项目使用CMake,CTest是理想的测试工具,具有以下优点:集成方便,开箱即用;支持并行、依赖、超时等高级特性;自动生成测试报告。对于追求简洁、轻量、与CMake深度结合的项目,推荐优先使用CTest。