如何让GoogleTest运行0测试时返回失败或获取测试运行数量?
解决GoogleTest二进制无测试用例时返回失败的方案
方案一:自定义main函数,提前检查注册测试数
GoogleTest允许自定义测试入口main函数,你可以在调用RUN_ALL_TESTS()前先检查已注册的测试总数,要是为0直接返回错误码,不让程序默认返回成功。
代码示例:
#include <gtest/gtest.h> #include <iostream> int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); // 获取已注册的所有测试用例总数 const int total_tests = testing::UnitTest::GetInstance()->total_test_count(); if (total_tests == 0) { std::cerr << "Error: This test binary has no registered tests!" << std::endl; return 1; // 返回非0值触发CMake测试失败 } return RUN_ALL_TESTS(); }
只要二进制里没定义任何TEST或TEST_F,total_test_count()就会返回0,进程直接报错,CMake测试运行器会识别为测试失败。
方案二:CMake层面做前置校验
不用改测试代码,直接在CMake里给每个测试二进制加前置检查:用--list-tests参数让测试二进制输出所有测试用例,统计输出行数,要是行数为0就标记该测试失败。
示例CMake代码:
# 封装一个带0测试检查的函数 function(add_gtest_with_zero_check test_target) # 注册正常的测试运行步骤 add_test(NAME ${test_target}_run COMMAND ${test_target}) # 注册检查测试用例是否存在的步骤 add_test(NAME ${test_target}_check_tests_exist COMMAND bash -c "$<TARGET_FILE:${test_target}> --list-tests | wc -l | grep -q '^[1-9]'") # 设置依赖:必须通过检查才运行实际测试 set_tests_properties(${test_target}_run PROPERTIES DEPENDS ${test_target}_check_tests_exist) endfunction() # 用这个函数替代普通的add_test add_gtest_with_zero_check(your_test_binary_name)
如果--list-tests输出为空,grep会返回非0值,${test_target}_check_tests_exist测试失败,后续的实际测试不会执行,CMake会把整个测试项标记为失败。
方案三:自定义测试监听器统计实际运行的测试数
要是你需要检查实际执行的测试数量(比如有些测试被--gtest_filter过滤掉的情况),可以自定义GoogleTest的测试监听器,在测试程序结束后统计运行数,为0就强制进程返回错误。
代码示例:
#include <gtest/gtest.h> #include <iostream> #include <cstdlib> class ZeroTestChecker : public testing::EmptyTestEventListener { public: void OnTestProgramEnd(const testing::TestProgramStats& stats) override { if (stats.total_test_count() == 0) { std::cerr << "Error: No tests were actually executed!" << std::endl; std::exit(1); // 直接退出并返回错误码 } } }; int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); // 添加自定义监听器到GoogleTest的事件链中 testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); listeners.Append(new ZeroTestChecker); return RUN_ALL_TESTS(); }
这个监听器会在所有测试执行完毕后触发,要是实际运行的测试数为0,直接让进程退出并返回错误,覆盖RUN_ALL_TESTS()的成功返回值。
内容的提问来源于stack exchange,提问作者JuniorIncanter
相关产品推荐
相关产品推荐

