Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >C单元测试-从带短尾的优美退出例程返回

C单元测试-从带短尾的优美退出例程返回
EN

Stack Overflow用户
提问于 2011-08-01 13:37:24
回答 5查看 770关注 0票数 6

这是我想要的情景。我正在测试的函数有一个错误条件,如果命中,调用一个优雅的退出函数来释放任何全局内存、关闭句柄和退出程序。

显然,我想要编写一个测试,它勾起了这个条件,以确保它被正确地处理,但我不希望优雅的退出例程实际上退出程序,因为这将停止任何剩余的测试。这意味着坚持优雅的退出程序。顽固性和不调用exit的问题是,控制流返回到正在测试的函数(这是不好的,因为例程应该退出)。

下面是实际的问题:如何将控制从存根函数返回到测试,而不是返回到测试中的函数?

我可以做一个setjmp / longjmp,但是由于"gotos“总的来说是不好的,所以我喜欢其他的建议。(请记住,这是过程C,而不是C++,因此据我所知,异常不会起作用)

正如索伦和其他人所建议的那样,编辑,当测试是一个好主意时,让exit什么也不做。有几种方法可以做到这一点,无论是通过exit()例程的#define语句还是存根。

然而,这样做带来的问题是,我真正想要的是一个解决方案( setjmp /longjmp除外)。看一看这个场景:

代码语言:javascript
代码运行次数:0
复制
void gracefulExit() {
    // Clean Up
    exit();
}

void routineUnderTest() {
    // Do some calcs

    if (someBadCondition == TRUE)
        gracefulExit()

    // Do some more calcs
}

如果exit()在这个场景中什么也不做,gracefulExit()将把控制返回到测试中的例程,这是不应该发生的。因此,我需要一种使exit() (或gracefulExit()的短尾版本)返回到测试而不是测试中的函数的控制的方法。

setjmp / longjmp (又名goto)是这样做的一种方法,尽管并不是一种真正的优雅方式。对如何解决这个问题有什么想法吗?

编辑#2

正如fizzer所提到的,setjmp/longjmp是处理这种情况的有效方法。这可能是我将永久处理它的方式。

然而,我从一位同事那里得到了另一个可能的解决方案。不要将gracefulExit()例程定义为存根例程,而是执行以下操作:

代码语言:javascript
代码运行次数:0
复制
#define gracefulExit return NULL

测试中的特定函数可以很好地处理这一点,因为NULL是它的有效返回值。我还没有在所有可能的情况下测试这一点(例如,具有空返回值的函数)。正如前面提到的,我可能会使用setjmp/longjmp方法来解决这个问题,但是如果这个附加的解决方案激发了某个人的想法,那就太好了!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-01 14:27:54

我使用setjmp / longjmp (包装在一个方便的宏中)来处理这个和类似的场景(例如,测试断言失败)。

票数 1
EN

Stack Overflow用户

发布于 2011-08-01 14:39:26

我建议您的清理方法创建一个未发布的接口来执行退出操作。

所以

代码语言:javascript
代码运行次数:0
复制
   void (*exitfunc((int) = exit;
   void myCleanUp() {
      .... do the cleanup
      (*exitfunc)(-1); // this will in normal operation call exit
   }

在单元测试代码中,您“覆盖”退出函数,如

代码语言:javascript
代码运行次数:0
复制
   void donothing(int exitcode) {}
   unittest(){
      extern void (*exitfunc((int);
      exitfunc = donothing; // or use a longjump if clean exit cannot be made without
      ... do the test.....

这意味着,无论是在单元测试中还是在其他地方,代码都会编译成相同的代码,而且只有在执行单元测试时才会出现行为上的差异。为单元测试使用条件编译的替代方法意味着,您将得到.o文件,您不知道这些文件是用于测试还是用于生产,并且您的项目会发生一些不好的事情。

票数 3
EN

Stack Overflow用户

发布于 2011-08-01 18:20:17

如果您的平台支持弱符号,您可以通过使用弱符号来实现这一点。

您将编写两个版本的graceful_exit()函数,一个被定义为弱符号的普通应用程序使用,另一个在正常定义的单元测试框架下运行时使用。

这样做的意图是,如果您正在针对单元测试代码进行链接,则函数的强版本将被使用而不是弱版本。

这样做的好处是不需要有条件的编译来支持单元测试。

对于this问题中弱符号的使用进行了有益的讨论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6904769

复制
相关文章
MacOS 下如何安装 gnu 版本的 sed
原因是由于 MacOS 下默认的 sed 和 Linux 下是不一样的,导致 -i 无法正确识别,通常的做法是安装一个 gnu-sed 已替换原本的 sed 命令
LinkinStar
2024/09/03
1480
pycharm哪个版本_pycharm版本选择
社区版: 可以供广大python爱好者免费使用,具备常用的python库,可以实现基本的python用法,可以用于试验在工作中出现的错误
全栈程序员站长
2022/09/27
4.5K0
pycharm哪个版本_pycharm版本选择
pycharm选哪个版本_pycharm版本区别
在pycharm中点击file->setting->project->project Interpreter。
全栈程序员站长
2022/09/27
1.1K0
pycharm选哪个版本_pycharm版本区别
php用哪个版本_php什么版本好
1.1 autoload的使用;当在代码中使用一个未定义的类的时候,该函数就会被调用
全栈程序员站长
2022/09/20
4.3K0
办公软件有哪些版本,哪个版本office好用?
目前最新的版本就是office2021; 具体哪个版本好用主要看你的用途和系统匹配;
用户10307898
2023/02/07
8.2K0
ERP系统用的哪个版本?
声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。
齐天大圣
2022/11/28
2.6K0
ERP系统用的哪个版本?
学习 Java,使用哪个版本最好
工欲善其事,必先利其器。我们要学习和使用 Java 语言,就需要搭建好 Java 的开发环境,边学习知识,边实践编码,可以更好的体会 Java 这门语言的精髓。
蜗牛互联网
2021/03/01
2.1K0
学习 Java,使用哪个版本最好
office下载哪个版本比较好
哪个版本的office最好用?Office是我们经常使用的办公工具软件,到现在有很多版本。很多人都想知道哪个版本的office最好用。下面为大家推荐Office版。让我们看一看。
用户9693436
2022/07/03
4.1K0
MGR用哪个版本?5.7 vs 8.0
前几天有人问:“8.0的MGR与5.7相比较,有哪些不一样的地方?”,在这篇文章里,将通过增加的系统变量说明一下MySQL8.0在MGR上的变化。
MySQLSE
2020/09/28
1.4K0
MGR用哪个版本?5.7 vs 8.0
uniqueidentifier转换_unique函数哪个版本有
uniqueidentifier数据类型是16个字节的二进制值,应具有唯一性,必须与NEWID()函数配合使用。
全栈程序员站长
2022/10/04
5280
Python初学者应该选择哪个版本
目前,根据数据显示,使用Python2.xd 开发者站63.7%,而使用Python3.x的用户站36.3%,由此可见使用使用Python2.x的用户还是占多数。2014年,Python的创始人宣布将Python2.7支持时间延长到2020年,那么初学者应该选择什么版本呢?目前建议初学者选择Python3.x版本 1、目前,使用Python3.x是大势所趋 2、Python3.x在Python2.x的基础上做了功能升级 3、Python3.x和Python2.x思想基本是共通的 当然选择Python3.x也会有缺点,那就是很多扩展库的发行总是滞后于Python的发行版本,甚至目前还有很多库不支持Python3.x。因此,在选择Python时候,一定要先考虑清楚自己的学习目的,例如,打算做哪方面的开发、需要用到哪些扩展库,以及扩展库支持的最高Python版本等。明确这些问题后再做出适合自己的选择。 中文编程参考资料
py3study
2020/01/07
1.7K0
皕杰报表(关于怎么查看是哪个版本)
3)、在META-INF文件夹下MANIFEST.MF里查看Version和label值。
用户10133222
2022/11/11
6510
JDK 11都有了,你还在用哪个版本?
  JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境。(JVM+Java系统类库)和JAVA工具。   没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
程序员云帆哥
2022/05/12
9470
JDK 11都有了,你还在用哪个版本?
哪个版本的gcc才支持c11
(而我此处的eglibc 2.17,和那人的glibc-2.16.0,都是需要支持c11的gcc的)
bear_fish
2018/09/19
7.9K0
哪个版本的gcc才支持c11
查询mysql版本号命令_怎么看自己mysql是哪个版本
+————+ | version() | +————+ | 5.7.23-log | +————+ 1 row in set (0.12 sec)
全栈程序员站长
2022/11/08
3K0
微软史上最成功的操作系统是哪个版本?
到现在为止个人还是觉得微软最成功的的操作系统还是XP系统,现在很多人还在使用着这个版本,只不过由于软件的支持力度问题,很多软件已经运行不起来了,说到微软的操作系统的演化史其实就是科技技术的进步史,最初的微软dos系统基本上纯正命令行的时代,后来有了图形界面,然后是飞速的体验时代。
程序员互动联盟
2019/07/04
3.5K0
微软史上最成功的操作系统是哪个版本?
做开发环境用哪个版本的win服务器?
做开发环境的服务器,那么就选择win2008,在win2008当中,整理了一下的版本:
习惯说一说
2019/08/01
5.1K0
做开发环境用哪个版本的win服务器?
python3 软连接_python3哪个版本好用
在ubuntu下面发现pip的默认版本指向的是python3.6,而因项目需要利用Python2.7.
全栈程序员站长
2022/09/27
9250
GNU风格的版本号管理
项目初版本时,版本号可以为 0.1 或 0.1.0, 也可以为 1.0 或 1.0.0,如果你为人很低调,我想你会选择那个主版本号为 0 的方式; 当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0,因而可以被忽略掉 当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1 另外,编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人
随心助手
2019/12/19
1.2K0
​【译】哪个版本的java性能最佳?结论可能超出你想像……
众所周知,Java在不同软件版本中的性能可能存在差异,并且这种差异会受到许多因素的影响。
Masutaa大师
2023/08/21
4260
​【译】哪个版本的java性能最佳?结论可能超出你想像……

相似问题

哪个版本的X引入了特征Y?

40

如何确定要安装哪个内核版本?

10

如何确定我正在构建的RHEL的哪个版本?

20

libvirt支持哪个版本的VBOX?

10

哪个版本的unix来自shell?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文