热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

功能不包含在标题中的单元测试C

如何解决《功能不包含在标题中的单元测试C》经验,为你挑选了1个好方法。

我开始进行单元测试,但在理解某些内容时遇到了麻烦。我的努力归结为如何测试仅在.c源代码中而不在.h标头中声明的函数。某些功能不需要在实现之外调用,因为它们仅与该特定文件有关。由于它们对程序的其他部分不可见,这意味着我的单元测试用例文件看不到那些内部功能,因此使我无法对其进行测试。我已经通过在测试用例文件中使用前向声明解决了这个问题,但是这似乎有点混乱,如果修改函数参数,更改和更改将很痛苦。

这些功能是否不打算包含在单元测试中?我已经读过OOP,您不应该测试私有功能,因为它们是通过公共功能隐式测试的,但是不覆盖这些功能(某些功能可能会变得非常复杂)感到不舒服。



1> ScottK..:

黑盒测试是关于测试您公开可见的界面和用户之间的软件合同。为了进行测试,通常使用工具或单独的测试程序创建一组测试用例,这#include就是定义外部接口的头文件.h。听起来您已经有了这个。大!

缺少的是白盒测试的概念。对于许多行业,例如电信,铁路,航空航天或任何其他需要高度确保高可用性和高质量的行业,这与黑匣子测试一样重要。

对于白盒测试,请创建一个单独的“专用”界面,该界面仅由白盒测试程序使用。注意,C您可以在其中为给定的C实现文件创建多个头文件。从编译器的角度来看,并没有真正强制执行标头或其名称的数量。最好遵守项目或团队所规定的约定。

对于我们的项目,我们为外部接口创建一个公共头(带有简单的.h后缀),为我们的私有接口创建一个私有头(_pi.h),供需要访问私有接口(如白盒测试)的少数用户使用,审核数据结构,内部配置和诊断以及调试工具。当然,_pi.h后缀只是一个约定,但在实践中效果很好。

白盒测试对于测试内部功能和数据结构非常有用,并且可以远远超出黑盒测试的范围。例如,我们使用White Box测试用例测试内部接口,并查看数据结构损坏时发生的情况,以及一些极端情况,例如测试内部传递意外参数值时代码的行为。

例如,假设我们有一个名为foo.c的文件,希望对其执行白盒测试。然后,我们将创建两个标头:foo.h和foo_pi.h分别用于外部和内部用户。

文件foo.h

#ifndef FOO_H
#define FOO_H

typedef int FooType;

// Public header for Foo
void Foo(FooType fooVal);
void Bar(void);

#endif

文件foo_pi.h

#ifndef FOO_PI_H
#define FOO_PI_H

// PI should also include the public interface
#include "foo.h"

// Private header for Foo
// Called by White Box test tool 
void FooBar_Test1(FooType fooVal);
void Foo_Internal(void);
void Bar_Internal(void);

#endif

文件foo.c

#include "foo.h"
#include "foo_pi.h"
// Notice you need to include both headers

// Define internal helpers here
static FooType myFooVal = 0; 
void FooBar_Test1(FooType fooVal) {myFooVal = fooVal;}

void Foo_Internal() {Bar_Internal();}
void Bar_Internal(void) {myFooVal++;}      


// Define external interfaces after the helpers
void Foo(FooType fooVal) {myFooVal = fooVal; Foo_Internal();}
void Bar(void)           {Bar_Internal();}

// Main() not typically included 
// if this is just one module of a bigger project!
int main(int argc, char** argv)
{
 Foo(argc);
}

如果你感到困惑什么那些#ifndef/ #define/ #endif东西,这些都是CPP宏,这种用法不是在C强制执行,但它是一种广泛使用的约定。有关更多详细信息,请参见/sf/ask/17360801/

尽管在上面的示例中没有显示它,但是Foobar_test()例程(以及其他任何内部测试方法)通常都放置在为内部测试功能保留的单独模块中,然后可以将它们包装到最终产品中。借助一些我在这里不会描述的高级CPP预处理,您可以有条件地编译出专用头文件和测试函数,并使接口对生产负载安全(在完成白盒测试后)。很多细节!


推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
author-avatar
灬猎丶豹灬_511
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有