如何为Linux客户端、服务端两个独立进程运行各自独立的gtest实例
问题1 解答
你观察到的现象和跨进程完全无关,本质是客户端的可执行文件编译阶段就已经链接了服务端的测试用例代码,核心原因有两个:
- 你的CMake规则写错了:
target_link_libraries是用来指定链接依赖的指令,不能传入源文件搜索规则FILES_GLOB,源文件需要在add_executable/add_library中声明。你现在的错误写法导致CMake把服务端的源文件、测试代码都当成了链接依赖,最终全部编译进了客户端的二进制文件中。 - GTest的
TEST_F类宏会自动生成全局静态对象,程序启动的全局构造阶段就会自动把测试用例注册到GTest的全局单例中,这个过程和你是否调用InitGoogleTest、RUN_ALL_TESTS没有关系。只要代码被编译进二进制,测试用例就会完成注册,你在客户端调用RUN_ALL_TESTS自然会读到所有注册过的服务端用例。
问题2 解答
要实现客户端和服务端GTest完全隔离,按以下步骤改造即可:
第一步 拆分编译目标
把公共代码、业务代码、测试代码彻底拆成独立的编译目标,避免代码互相污染:
- 先把
src/common目录的公共代码编译成独立的common库,客户端、服务端直接链接该库即可,不需要重复扫描公共代码。 - 客户端业务代码(不含测试)编译成
client_core库,服务端业务代码(不含测试)编译成server_core库,测试代码和业务代码完全分离。 - 单独声明客户端测试目标
client_test,仅添加src/client下的测试用例源文件,链接client_core、common、gtest。 - 单独声明服务端测试目标
server_test,仅添加src/server下的测试用例源文件,链接server_core、common、gtest。
第二步 修正CMake规则
参考正确写法:
# 编译公共库 file(GLOB_RECURSE COMMON_SRCS CONFIGURE_DEPENDS src/common/*.cpp) add_library(common STATIC ${COMMON_SRCS}) target_link_libraries(common PUBLIC common_libaries) # 编译客户端核心业务(不含测试) file(GLOB_RECURSE CLIENT_SRCS CONFIGURE_DEPENDS src/client/*.cpp) # 过滤排除测试目录代码 list(FILTER CLIENT_SRCS EXCLUDE REGEX ".*test/.*") add_library(client_core STATIC ${CLIENT_SRCS}) target_link_libraries(client_core PUBLIC common) # 编译客户端独立测试目标 file(GLOB_RECURSE CLIENT_TEST_SRCS CONFIGURE_DEPENDS src/client/test/*.cpp) add_executable(client_test ${CLIENT_TEST_SRCS}) target_link_libraries(client_test PRIVATE client_core gtest gtest_main) # 服务端逻辑同理 file(GLOB_RECURSE SERVER_SRCS CONFIGURE_DEPENDS src/server/*.cpp) list(FILTER SERVER_SRCS EXCLUDE REGEX ".*test/.*") add_library(server_core STATIC ${SERVER_SRCS}) target_link_libraries(server_core PUBLIC common) file(GLOB_RECURSE SERVER_TEST_SRCS CONFIGURE_DEPENDS src/server/test/*.cpp) add_executable(server_test ${SERVER_TEST_SRCS}) target_link_libraries(server_test PRIVATE server_core gtest gtest_main)
第三步 运行时隔离
需要运行测试时,分别启动client_test和server_test两个独立的二进制即可,二者没有任何重叠代码,GTest实例完全独立,不会互相干扰。如果你需要在客户端测试运行过程中触发服务端逻辑,直接调用系统API启动server_test或者带测试开关的服务端二进制即可,进程天然隔离不会出现符号冲突。
内容的提问来源于stack exchange,提问作者venk
相关产品推荐
相关产品推荐

