独望枫

人在尘世间,有缘自相见,变化千千万,未开窍,已迷恋
posts - 45, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

学习笔记

共勉:孜孜不倦学不止·源源不断习无尽
     摘要: 本文将生成覆盖率脚本化处理过程。

设计思路:通过脚本对qt工程进行编译并运行,然后再通过脚本收集必要的受关注的覆盖率信息进行生成覆盖率报告,最后查看报告。
  阅读全文

posted @ 2022-03-29 23:21 小菜枫 阅读(414) | 评论 (0)  编辑 |

     摘要: 前文提到添加了编译参数 -fprofile-arcs 、 -ftest-coverage 已经生成了gcno文件,单元测试运行后也产生了gcda文件。

并且我们已经安装好lcov,那么该如何使用lcov来生成覆盖率报告呢?
  阅读全文

posted @ 2022-03-29 23:16 小菜枫 阅读(1399) | 评论 (0)  编辑 |

     摘要: lcov是GCC覆盖率测试工具gcov的前端图形工具。

有些Linux版本的源提供了包直接安装,可以尝试使用对应包管理命令行直接安装
  阅读全文

posted @ 2022-03-29 23:11 小菜枫 阅读(4500) | 评论 (0)  编辑 |

     摘要: gcov是一个代码覆盖率统计的工具。不用单独下载,伴随GCC一起发布(即你安装有GCC,也就有了gcov这个工具)。与GCC协同使用、分析被测代码,有助于创建更稳健的代码,并能发现程序中未经测试的部分。

基于gcov是隶属于GCC,所以其仅适用于使用GCC编译的代码……
  阅读全文

posted @ 2022-03-29 23:07 小菜枫 阅读(1319) | 评论 (0)  编辑 |

     摘要: 随着事物的接触越来越多,了解的越来越深入,我们总会发现一些新的问题或者不足。
就像前文提到的一样,我们在面对有对象的虚函数依赖的时候,可以使用gmock框架来为我们提供方便的模拟期望值,以便我们能撇除外界的影响(依赖)从逻辑上设计单元测试并持续的进行,但是并非所有对象的函数都设计成了虚函数,那么我们在面对依赖对象的非虚函数这个问题时,又该如何解决?
这个问题,已经有先行者遇到并且提出了解决方案:手动打桩、使用hook技术。
  阅读全文

posted @ 2022-03-27 22:47 小菜枫 阅读(3070) | 评论 (0)  编辑 |

     摘要: 在面向对象的开发过程中,由于需要将各种属性或者事物按一定的规律抽象为独立的一个对象,然后按需进行调用,如此一来,对象之间的依赖便无可避免,设计不好更会产生双向依赖、交叉依赖等困境,那么我们在面对这种对象间依赖的情况下,该如何进行单元测试呢?  阅读全文

posted @ 2022-03-27 22:37 小菜枫 阅读(895) | 评论 (0)  编辑 |

     摘要: 类的private函数相比public函数,测试套件定义的对象无法直接访问;相比protected函数,亦无法通过前文提到的FRIENT_TEST来使用,那么我们要怎么才能解决这个问题呢?  阅读全文

posted @ 2022-03-27 22:31 小菜枫 阅读(1731) | 评论 (0)  编辑 |

     摘要: 类的protected函数相比public函数,测试套件定义的对象无法直接访问,gtest提供了一个宏FRIENT_TEST,这个宏定义如下:

#define FRIEND_TEST(test_case_name, test_name) \
friend class test_case_name##_##test_name##_Test  阅读全文

posted @ 2022-03-27 22:04 小菜枫 阅读(770) | 评论 (0)  编辑 |

     摘要: 类的public函数在面向对象编程中是最常见亦是最常规的函数,但是其单元测试的展开跟普通函数并无二致[这里指的是没有其他对象依赖的情况,有依赖的场景请参考本系列的有依赖对象的场景文章],下面来看看具体如何实施。  阅读全文

posted @ 2022-03-27 21:36 小菜枫 阅读(334) | 评论 (0)  编辑 |

     摘要: 普通函数在该 [gtest场景案例] 系列中,指的是普通的全局函数,既没有public等权限关键字,也没有static/const等关键字.  阅读全文

posted @ 2022-03-27 21:17 小菜枫 阅读(506) | 评论 (0)  编辑 |

     摘要: 新的单位有推进单元测试的项目,计划选中的框架刚好是以前有用到的gtest。

于是将以前零碎记录的文章整理一下,按单元测试中常见的、典型的场景进行分类,针对不同场景下如何使用gtest进行展开,如有纰漏,欢迎各位交流及指出。
  阅读全文

posted @ 2022-03-27 20:34 小菜枫 阅读(298) | 评论 (0)  编辑 |

posted @ 2021-07-14 02:41 小菜枫 阅读(1330) | 评论 (0)  编辑 |

     摘要: 主要是FreeRTOS的定时器使用示例,及过程中的一些错误解决。
定时器实现方式包含动态、静态。  阅读全文

posted @ 2021-07-14 02:29 小菜枫 阅读(524) | 评论 (0)  编辑 |

     摘要: 任务通知
> 每个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0。RTOS任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知值。
可以通过下列方法向接收任务更新通知:
○ 不覆盖接收任务的通知值
○ 覆盖接收任务的通知值
○ 设置接收任务通知值的某些位
○ 增加接收任务的通知值  阅读全文

posted @ 2021-07-14 02:24 小菜枫 阅读(689) | 评论 (0)  编辑 |

     摘要: FreeRTOS线程间通信的方式之一,事件。
事件依赖于动态申请内存,只要开启了该宏,事件相关的功能同时被开启,但如果要使用事件相关的宏/函数,还需要添加对应的头文件……  阅读全文

posted @ 2021-07-14 02:20 小菜枫 阅读(626) | 评论 (0)  编辑 |

     摘要: FreeRTOS的线程间通信方式之一,消息队列。
demo示例包含动态和静态创建消息队列……  阅读全文

posted @ 2021-07-14 02:17 小菜枫 阅读(1729) | 评论 (0)  编辑 |

     摘要: FreeRTOS的线程间通信方式之一,信号量。
信号量包含二值信号量、计数信号量的使用示例……  阅读全文

posted @ 2021-07-14 02:12 小菜枫 阅读(994) | 评论 (0)  编辑 |

     摘要: FreeRTOS的线程间同步方式之一,临界区。
临界区是提供互斥功能的一种原始方式,可以简单粗暴的实现线程之间的互斥,确保线程间数据同步是稳定可信的
> 临界区有两种,一种是关闭中断及系统任务的
taskENTER_CRITICAL();
taskEXIT_CRITICAL();
另一种是关闭系统任务调度(禁止系统任务调度,直到重新开启任务调度)的
vTaskSuspendScheduler(); / vTaskSuspendAll();
vTaskResumeScheduler(); / vTaskResumeAll();  阅读全文

posted @ 2021-07-14 02:07 小菜枫 阅读(488) | 评论 (0)  编辑 |

     摘要: FreeRTOS线程间同步的方式之一,互斥量
互斥量是一种特殊的信号量!!!
- 所以其句柄依然是xSemaphoreHandle类型  阅读全文

posted @ 2021-07-14 02:04 小菜枫 阅读(691) | 评论 (0)  编辑 |

     摘要: FreeRTOS从移植实现命令行功能的过程记录  阅读全文

posted @ 2021-07-14 02:01 小菜枫 阅读(2402) | 评论 (0)  编辑 |

     摘要: 基于STM32CubeMX生成的STM32 MDK工程,移植FreeRTOS源码
并通过动态和静态创建线程(任务)的过程  阅读全文

posted @ 2021-07-14 01:41 小菜枫 阅读(1085) | 评论 (0)  编辑 |

     摘要: RT-Thread提供了线程池的实现,为用户的线程频繁的创建使用场景下提供了更友好更有效率的方式
Nano版配置文件没有线程池相关的选项可配置,默认关闭该功能,如果需要开启,需要添加 'RT_USING_MEMPOOL' 的宏定义  阅读全文

posted @ 2021-07-14 01:31 小菜枫 阅读(270) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano定时器的使用示例
定时器分为周期性定时器和一次性定时器
文中的示例包括了两种定时器的使用示例展示……  阅读全文

posted @ 2021-07-14 01:28 小菜枫 阅读(366) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano线程间通信的方式之一,消息队列
消息队列默认关闭,如果需要启用,需要在rtconfig.h中开启
文章记录了消息队列的动态、静态创建以及展示了通信的过程  阅读全文

posted @ 2021-07-14 01:27 小菜枫 阅读(391) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano线程间通信的方式之一,邮箱
邮箱功能默认打开,如果需要关闭,需要在rtconfig.h头文件中注释掉/删掉
文章记录了邮箱的动态、静态创建以及展示了通信的过程  阅读全文

posted @ 2021-07-14 01:24 小菜枫 阅读(445) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano的线程间同步方式之一,事件集
事件默认关闭,如果需要使用事件,则需要在rtconfig.h头文件中启用事件
事件是一种灵活的线程同步机制,每个线程由一个32位的无符号整型来表示一个事件集,一个事件集包含32个事件,由此可以实现事件与线程的一对多或者多对多……  阅读全文

posted @ 2021-07-14 01:21 小菜枫 阅读(230) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano的线程间同步方式之一,信号量。
记录了动态、静态创建信号量的简单使用示例
信号量默认开启,如果需要关闭,需要在rtconfig.h头文件将其对应的宏定义注释掉/删掉  阅读全文

posted @ 2021-07-14 01:17 小菜枫 阅读(313) | 评论 (0)  编辑 |

     摘要: RT-Thread Nano的线程间同步方式之一,互斥量。
记录了动态、静态创建互斥量的简单使用示例  阅读全文

posted @ 2021-07-14 01:06 小菜枫 阅读(275) | 评论 (0)  编辑 |

     摘要: 基于STM32CubeMX生成的STM32 MDK工程,添加RTT的命令行组件Finsh
以及添加自定义命令行,
官方参考链接:……  阅读全文

posted @ 2021-07-13 18:48 小菜枫 阅读(815) | 评论 (0)  编辑 |

     摘要: 基于STM32CubeMX生成的STM32 MDK工程,包含配置时钟、调试串口、工程配置等  阅读全文

posted @ 2021-07-13 18:40 小菜枫 阅读(561) | 评论 (0)  编辑 |

     摘要: RT-Thread 基于stm32cubemx工程的移植及动态、静态创建线程的示例  阅读全文

posted @ 2021-07-13 18:15 小菜枫 阅读(681) | 评论 (0)  编辑 |

     摘要: 重构之于软件开发, 可谓一个绕不过理不清的梗.
整个软件开发的范围触及世间各行各业, 每时每刻都在变更的需求, 每分每秒都在改变的结构, 以不变应万变, 在软件行业, 既不对也对.
不对, 是指不可能一成不变的去应对.
对, 是指前人总结了很好的经验给到我们去学习, 应用; 这些经验表现形式万万千, 大体的流程不会有太大差异.  阅读全文

posted @ 2017-08-20 15:37 小菜枫 阅读(239) | 评论 (0)  编辑 |

     摘要: 测试对于软件开发的意义, 勿需再多言语阐述.
而在所有的测试当中, 单元测试的粒度是最小的, 是进入其他阶段测试的门槛.
以上的话语虽然可能有人看不惯, 但当有过不一样的体会后, 总会得出一些不一样的看法.  阅读全文

posted @ 2017-08-19 20:07 小菜枫 阅读(358) | 评论 (0)  编辑 |

     摘要: 代码结构理清, 章程已经文档化, 工程环境已经规定好, 不着手工程开始干活, 简直对不起之前花费心血准备的种种.
首先, 由于提取出来的基类, 以源码的形式存在并导入到各个模块, 所以必须要将其实现导入到模块工程里面  阅读全文

posted @ 2017-08-18 23:19 小菜枫 阅读(222) | 评论 (0)  编辑 |

     摘要: 历经挣扎后, 愈感力不从心, 决定自己先尝试将整体工程搭建起来, 然后一个个边缘小模块的实现和导入, 并在这个过程中持续的优化考虑不周的地方.
首先是入手的地方是大量重复的代码, 对于这些代码, 唯一的一个途径就是复用. 复用的实现方式有两种: 一是继承, 而是函数库.  阅读全文

posted @ 2017-08-17 22:08 小菜枫 阅读(224) | 评论 (0)  编辑 |

     摘要: 重构的现状:源码工程历经五年, 前后经历五六次人员变更, 20+人次左右的交接; 其中有应届毕业生到老鸟到脱坑, 也有中途其他部门调整岗位过来的同事; 二十多个模块的变更, 在公司相关规范不完善的情况下, 烙印下太多特行独立甚至堪称粗暴的痕迹, 最终成为现在的是一团即将再也看不到缝隙的大泥球,
而我----身处中心.  阅读全文

posted @ 2017-08-16 09:22 小菜枫 阅读(261) | 评论 (0)  编辑 |

     摘要: 近日需要使用Qt进行一个工具的编写, 恰逢最近在学习使用gtest作为测试的首选, 本着熟能生巧, 能有机会多练习就多练习, 无机会创造机会也要上(/(ㄒoㄒ)/~~)的积极(折腾作死)态度, 开展了Qt使用gtest的折腾.
首先, 说明一下环境: win7+qt5.8.0(MinGW), gtest最新版本, 直接从GitHub拉取(https://github.com/google/googletest)  阅读全文

posted @ 2017-04-27 12:16 小菜枫 阅读(979) | 评论 (0)  编辑 |

     摘要: 依赖倒置原则:Dependence Inversion Principle,简称DIP。

定义:High level modules should not depend upon low level modules.Both should depend upon abstractions.

Abstractions should not depend upon details.

Details should depend upon abstractions。

翻译成中文如下:

高层模块不应该依赖低层模块,两者都应该依赖抽象
抽象不应该依赖细节
细节应该依赖抽象
  阅读全文

posted @ 2016-07-10 15:59 小菜枫 阅读(411) | 评论 (0)  编辑 |

     摘要: 单一职责原则:Single Responsibility Priciple,简称SRP。

定义:There should never be more than one reason for a class to change,即不能存在多于一个导致类变更的原因。通俗说法:一个类只负责一项职责。

由来:类C负责两项职责,职责R1,职责R2,当职责R1因某需求导致需要更改类C时,原本正常的R2发生异常。
  阅读全文

posted @ 2016-07-10 14:08 小菜枫 阅读(509) | 评论 (0)  编辑 |