所分析的run_tests.c文件位于 工程中的 cmockery/src/example/ 目录下,仅仅只有十几行代码,不过可以通过这十几行代码的分析达到管中窥豹的效果;

run_tests.c:
  1. #include <stdarg.h>
  2. #include <stddef.h>
  3. #include <setjmp.h>
  4. #include <cmockery.h>
  5. // A test case that does nothing and succeeds.
  6. void null_test_success(void **state) {
  7. }
  8. int main(int argc, char* argv[]) {
  9. const UnitTest tests[] = {
  10. unit_test(null_test_success),
  11. };
  12. return run_tests(tests);
  13. }
对于代码中出现的几个部件进行分解开来看,如下:
UnitTest结构体:
  1. // 函数原型用于setup, test and teardown functions.
  2. typedef void (*UnitTestFunction)(void **state);
  3. // 单元测试函数的类型
  4. typedef enum UnitTestFunctionType {
  5. UNIT_TEST_FUNCTION_TYPE_TEST = 0,
  6. UNIT_TEST_FUNCTION_TYPE_SETUP,
  7. UNIT_TEST_FUNCTION_TYPE_TEARDOWN,
  8. } UnitTestFunctionType;
  9. /*
  10. * 存储一个单元测试函数包括其函数名和类型
  11. * 注意:每设置一个函数必须有一个teardown函数对应,可以指定一个NULL函数指针
  12. */
  13. typedef struct UnitTest {
  14. const char* name;
  15. UnitTestFunction function;
  16. UnitTestFunctionType function_type;
  17. } UnitTest;
可以看到这个结构体中所包含的内容只有一个函数名,一个函数指针,一个函数的类型枚举;

unit_test:是一个宏体,定义如下:
  1. // 初始化一个单元测试结构体.
  2. #define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }
所有上面main.c中的代码行:unit_test(null_test_success),按照宏定义进行展开后表示如下:

{"null_test_success", null_test_success, UNIT_TEST_FUNCTION_TYPE_TEST},
所以正好填充了结构体数组的第一个元素的各个值;
run_tests:是一个宏体,定义如下:
  1. /*
  2. * 运行通过UnitTest结构体数组指定的测试,下面的样例
  3. * 以unit_test宏来描述了这个宏的用法
  4. *
  5. * void Test0();
  6. * void Test1();
  7. *
  8. * int main(int argc, char* argv[]) {
  9. * const UnitTest tests[] = {
  10. * unit_test(Test0);
  11. * unit_test(Test1);
  12. * };
  13. * return run_tests(tests);
  14. * }
  15. */
  16. run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
将代码中run_tests(tests);展开之后内容为:_run_tests(tests, 1);
先简要介绍该函数的功能:
    在_run_tests函数中根据tests中元素的赋值情况,即类型和函数指针,进行不同的分支并调用_run_test运行该元素的函数指针所指向的函数体。并将运行的结果进行返回。
在这个过程中还会将函数执行的状态进行记录,其中包括了链表,内存分配,信号等相关的操作。后续会进行这个功能详细的分析。

转载于:https://www.cnblogs.com/cfzhang/p/612f2868819ea56d10da291fbea1c4ae.html

(二)cmockery中run_tests.c分析相关推荐

  1. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  2. 数据分析中的分组分析法(二)

    我们在上面的内容中为大家解释了数据分析中的分组分析方法,我们根据属性指标分组分析法和数量指标分组分析法的定义给大家进行了详细的说明.但是对于数量指标分组分析法没有给大家详细地说明,今天我们给大家好好讲 ...

  3. 论电子计算机在审计中的应用,计算机技术在审计中的应用领域分析.doc

    计算机技术在审计中的应用领域分析.doc 计算机技术在审计中的应用 [ ]审计工作作为我WW民经济屮的重要的一个环节,由于有大量的数据需耍处理, 使得计算机技术在审计领域的大规模推广具有很强的实践意义 ...

  4. 20169205 2016-2017-2 实验二nmap的使用与分析

    20169205 2016-2017-2 实验二Nmap的使用与分析 实验所用知识总结 Nmap扫描基础 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以 ...

  5. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]

    摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd.logcat的初始化操作 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...

  6. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  7. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...

  8. C 语言中的内存分析

    C 语言中的内存分析 一.进制 我们需要了解的4中进制:二进制.八进制.十进制.十六进制 #include <stdio.h> int main() { //默认情况下是十进制 intnu ...

  9. qtabwidget切换tab事件_某超超临界机组初压/限压切换过程中扰动原因分析

    严寒夕  浙江浙能台州第二发电有限责任公司 [摘要]某火电厂汽轮机在初压/限压切换过程中出现负荷瞬时上升问题.从初压/限压切换的逻辑及切换过程中主要参数的变化分析,确定原因为压力控制器指令上升瞬间和转 ...

  10. 深入理解Java中的逃逸分析

    转载自  深入理解Java中的逃逸分析 在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译 ...

最新文章

  1. 【124】排球基本技术
  2. redis python zset
  3. windows10 mysql 5.5.36 安装
  4. 人工智能会被赋予人性么?
  5. excel三维地图数据源引用无效_Excel函数公式应用的基础,数据源的引用,动图解释...
  6. Reactive(2) 响应式流与制奶厂业务
  7. Script - MapSubString()使用
  8. 剑指Offer之不用加减乘除做加法
  9. SQL Server 2014新特性探秘(1):内存数据库
  10. can't find '__main__' module in '.'
  11. java使用RunTime调用windows命令行
  12. 笔记本vmware利用无线网卡上网设置
  13. 什么样的女人才是老婆(感动)
  14. OpenCV_03 Numpy库和Mat
  15. 软件测试之测试主流技能
  16. 数据的加载 - 清洗处理 - 分组分类 - 存储
  17. vivado生成mig_Xilinx-在Zynq上用MIG扩展内存(2)-Vivado篇
  18. SQL Server2000挂起 cd-key
  19. 关于Authorware的一些吐槽
  20. php抓包视频教程,POSTGET抓包及php数据请求提交教程

热门文章

  1. centos6.5 搭建时间服务器
  2. NodeJS 常用模块积累
  3. Android 自动化测试 常用的命令----随时更新
  4. 使用spring cloud,nacos,dubbo,gateway搭建微服务
  5. pcb天线设计和hfss仿真分析实例_5G天线与多天线系统设计
  6. Nginx+Tomcat+SSL 识别 https还是http
  7. 全局bigdecimal反序列化转String返回数据
  8. 管理学基础 形成性考核一
  9. 【Python实例第5讲】Pipeline与GridSearchCV降维法
  10. 操作系统原理(四)死锁和进程调度