You need to enable JavaScript to run this app. C语言含全局静态变量函数的GoogleTest用例编写(禁引myfile.c)
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 03:54:06