C语言含全局静态变量函数的GoogleTest用例编写(禁引myfile.c)
测试前置逻辑说明
首先明确约束边界:遵守“禁止在测试代码中直接#include "myfile.c"”的要求,正确的测试构建方式是将myfile.c作为独立编译单元,和GoogleTest测试代码分别编译后,链接到同一个测试可执行文件中。
由于global_static_value是myfile.c内部的static变量,作用域仅在当前编译单元内,外部测试代码无法直接访问和修改,只能通过myfile.c对外导出的公共接口set_value操作这个内部静态变量,进而控制check_it的分支走向。
注意:给出的示例代码存在语法缺陷,
myfile.c中return false语句缺分号、myfile.h中两个函数声明缺结束分号,实际编译测试前需要先修正这些语法问题。
具体测试实现
测试代码不需要引用C源文件,只需要对用到的两个公共接口做符号声明即可,完整测试代码示例:
// test_check_it.cpp #include <gtest/gtest.h> // 声明myfile.c导出的C语言接口,不需要引用任何C源码文件 extern "C" { bool check_it(int value); void set_value(int value); } // 测试返回true的场景:输入值和内部存储的静态值相等 TEST(CheckItTest, ReturnsTrueWhenInputMatchesStoredValue) { // 通过公共接口将内部静态变量设置为确定值,不依赖其他测试用例的状态 set_value(123); // 传入相同值,验证返回true EXPECT_TRUE(check_it(123)); } // 测试返回false的场景:输入值和内部存储的静态值不相等 TEST(CheckItTest, ReturnsFalseWhenInputDiffersFromStoredValue) { // 通过公共接口将内部静态变量设置为确定值,保证测试独立性 set_value(456); // 传入不同值,验证返回false EXPECT_FALSE(check_it(789)); }
等修正了头文件的语法错误,也可以直接在测试代码中#include "myfile.h"获取函数声明,和extern声明的效果完全一致,不违反约束要求。
构建验证方式
编译测试时,将myfile.c作为独立编译单元参与链接,完全满足“不直接include源文件”的约束,编译命令示例:
g++ test_check_it.cpp myfile.c -o check_it_test -lgtest -lgtest_main -pthread
覆盖逻辑说明
- 调用
set_value(x)后,内部static变量global_static_value会被修改为x,此时调用check_it(x),会触发if (global_static_value == value)的条件判断为真,执行返回true的分支 - 保持
set_value(x)的设置不变,调用check_it(y)(y不等于x),会触发条件判断为假,执行返回false的分支 - 两个测试用例完全覆盖
check_it函数的所有代码分支,且每个用例主动设置内部状态,不依赖测试执行顺序、不依赖其他用例的运行结果,保证测试可靠性
内容的提问来源于stack exchange,提问作者definename
相关产品推荐
相关产品推荐

