在
上一篇文章中
https://meekrosoft.wordpress.com/2009/11/09/2009/10/04/testing-c-code-with-the-googletest-framework/
,我描述了如何开始使用 Google 测试框架测试 C++ 代码。在本文中,我将分享一些测试 C 代码的技巧和窍门。
那么有什么大不了的,不就是和C++一样吗?
是的,在某种程度上确实如此,但一如既往,魔鬼在细节中。以下是我们在尝试测试过程代码时面临的一些挑战:
-
我们无法创建被测代码的实例。这意味着我们不能轻易地为每个测试获取带有初始化数据的新对象。
-
依赖项是硬编码的。这意味着我们不能使用依赖注入技术来模拟/伪造模块依赖项。
-
我们不能使用多态来打破依赖关系
所以这只给我们留下了语言中可用的两个依赖破坏工具:预处理器和链接器。
需要注意的事项
静态初始化
:在运行每个测试用例之前,您需要能够将数据重置为已知状态。这是将测试彼此隔离的唯一方法。
全局变量
:您的模块是否访问全局变量?您需要为此提供一个虚假的实现。
硬件访问
:在嵌入式系统中,我们经常有内存映射的硬件寄存器访问。您绝对不想在测试中取消引用随机内存地址。一个很好的解决方法是定义一个通用函数来获取给定寄存器的地址。然后,您可以定义此函数的版本以用于测试目的。
那么在实践中看起来如何呢?假设我们有一个用于控制设备的虚构嵌入式软件应用程序:
-
更改我们取消引用的地址,
-
更改我们调用的函数(在链接时)
-
隐藏我们在测试期间使用#ifdefs 调用的函数并提供一个测试假(这是我在这里采取的方法)
不兼容的函数名称:
您不能链接两个主要函数。你需要隐藏一个…
静态内存
:这确实会损害测试的独立性。您确实应该为每个测试用例重新初始化所有静态数据,幸运的是,有一种简单的方法可以实现这一点。所有主要的测试框架都有一个测试夹具的概念,它允许您在执行每个测试用例之前调用 SetUp 函数。使用它来初始化您的静态数据。请记住:独立测试是很好的测试!
一般测试模式
1. 为您想要存根的依赖项定义假函数
2. 如果模块依赖于全局(喘气!),您需要定义您的假
函数 3. 包含您的模块实现(#include module.c)
4. 定义一个方法将所有静态数据重置为已知状态。
5. 定义你的测试
这一切都很好,但是<困难的事情>呢?
在谈论测试 C 代码(尤其是嵌入式)时,我经常听到“但是……”
-
时间问题。没错,单元测试不能神奇地模拟系统的运行时属性。
-
中断。这是最后一点的特例,但这是所有开发人员在使用多线程时遇到的相同问题。
-
位正确操作。如果您在 32 位架构上运行 24 位代码,您将不会看到各种溢出、下溢、位移和算术运算的完全相同的行为。
-
我不可能测试这个!好吧,有些类的代码根本无法使用单元测试方法进行测试。然而,根据我的经验,这适用于大多数代码库中的极少数。秘诀是尽可能多地排除不可能测试的代码,这样你就不会污染代码库的其余部分。
测试 C 代码很难。测试遗留的 C 代码更加困难。但是利用我们在 C 中有限的破坏依赖的语言特性(链接器和预处理器),我们可以完成很多工作。
您可以在 GitHub 上查看
原始源代码。
开源C++
单元测试
框架
Google
Test
介绍
Google
Test
Google
test
是针对c/c++的开源测试项目。采用的协议是BSD license,有很多著名的开源项目采用了它,包括Chromium(谷歌浏览器
开发
版)。
下载主页:
http://code.
google
.com/p/
googletest
/
官方资料文档:
http://code.
google
.com/p/
googletest
/wiki/
GoogleTest
Primer
http://code.
google
.com/
本次文章以一个真实业务中的`进程管理类`测试的过程中遇到的问题和解决办法,覆盖了`参数测试`、`Mock接口测试`、`接口耗时测试`这三个方面,会简单的提及`类型测试`。并且配合VSCode的CMake Tools插件,快捷而方便的
进行
`进程管理类`的测试。...
注意:调用有参数的函数,但没有给其传值,函数一样可以运行,或者调用没有参数的函数,给其传值,该函数
也一样运行。
说的简单点:只要写了函数名后面跟了一对小括号,该函数就会运行。那么传递的参数呢?
其实,在函数中有一个参数数组对象(arguments),该对象将传递的参数都封装在一个数组中。
function demo()/
C程序:
使用
googletest
测试
框架
googletest
C/C++ 测试
框架
非常好用,介绍及下载请看 http://code.
google
.com/p/
googletest
///============================================================================//
使用
googletest
测试
框架
//======...
我是一名C ++
开发
人员,在测试时,通过注入依赖项,覆盖成员函数等来测试类很容易,这样您就可以轻松地测试边缘案例。 但是,在C中,您无法
使用
这些精彩的功能。 我发现很难将
单元测试
添加到
代码
中,因为编写C
代码
的一些"标准"方法。 解决以下问题的最佳方法是:传递一个大的'context'结构指针:void some_func( global_context_t *ctx, .... ){/* lots...
#define MAXN 10
double f1(int n , double a[] , double x);
double f2(int n , double a[] , double x);
double f1(int n , double a[] , double x)
文章目录测试用例简介作用1. 指导测试的实施2. 规划测试数据的准备3. 编写测试脚本的"设计规格说明书"4. 评估测试结果的度量基准5. 分析缺陷的标准重要性编制测试用例测试用例文档测试用例的设置(按功能设置用例;按路径设置用例;按功能、路径混合模式设置用例)设计测试用例测试用例设计设计原则设计方法1、白盒法测试覆盖率3、黑盒法相关问题1 测试用例的评审2 测试用例的修改更新3 测试用例的管理软件
测试用例(
Test
Case)是指对一项特定的软件产品
进行
测试任务的描述,体现测试方案、方法、技术
Google
Test
需要编译,同时确保头文件可以被编译器找到。
使用
cmake编译:
git clone https://github.com/
google
/
googletest
.git -b release-1.10.0
cd
googletest
# Main directory of the cloned rep