GTest测试间行为干扰:为何单个测试受其他测试影响?
遇到这种情况其实挺常见的——哪怕用gtest_filter精准指定只跑第一个简单测试,只要复杂测试的代码还在(哪怕没被执行)就触发段错误,核心原因往往是测试代码的副作用超出了单个测试案例的执行范围,以下是几个最可能的宏观方向:
全局/静态对象的初始化顺序或错误
GTest在程序启动阶段,会初始化所有与测试案例相关的全局对象、静态对象(包括那些属于未执行测试的对象)。如果复杂测试涉及的全局/静态对象在初始化时存在内存错误(比如空指针解引用、数组越界),或者依赖的其他对象还没初始化完成,就会直接触发段错误,和是否执行该测试无关。测试类的构造/析构逻辑隐患
你用了带成员变量和函数的测试类(应该是TEST_F的测试夹具吧?),GTest会为每个注册的测试案例创建夹具实例。哪怕复杂测试没被执行,只要它是注册过的测试案例,GTest可能在初始化阶段尝试创建夹具对象,或者在清理阶段处理相关资源。如果夹具的构造函数、析构函数里有内存操作错误,就会导致崩溃。测试注册宏的隐藏副作用
TEST/TEST_F这些宏本质上是在编译期生成测试注册代码,有些时候复杂测试的宏定义里可能隐含了全局范围内的代码执行(比如在宏里直接调用了某个初始化函数)。这些代码会在程序启动时就运行,不管测试是否被执行,一旦有问题就会触发段错误。内存空间被污染
复杂测试的代码可能定义了一些全局变量,或者静态对象持有了野指针、无效内存引用。这些错误会污染整个进程的内存空间,当第一个简单测试运行时,刚好访问到被污染的内存区域,就会触发段错误。全局环境被修改
如果复杂测试里修改了全局环境配置(比如自定义了信号处理函数、替换了内存分配器),或者引入了冲突的依赖库,这些变更会影响整个测试进程。哪怕只跑第一个测试,也会因为环境被修改而出现崩溃。
内容的提问来源于stack exchange,提问作者jj172

