1 前言
[无产品不测试]
[姿势不对,起来重睡]
产品与测试如同自行车的两个轮子,缺一不可,而测试姿势不对,那么产品将难以“远行”,也将面临严峻的后期维护。
在《物联网RTOS新贵-TencentOS tiny入门》一文,我们已经初步认识了TencentOS tiny的系统架构,可以看到TencentOS tiny作为面向物联网的RTOS,不只是一个RTOS内核,还包含了丰富的中间层组件(文件系统、KV存储、设备框架等),具备低功耗能力、连接能力(IoT通信协议支持、AT框架、云端连接等)、安全能力等;此外,物联网RTOS不仅是一个软件(平台)产品,也是一个扩芯片平台的硬件产品。面对如此庞大的功能集合,可想而知,物联网RTOS产品测试验证工作量是多么的庞大。
与此同时,在TencentOS tiny“新秀”赛季,随着社区成长与不断壮大,腾讯与大佬们号召力加持与持续投入,TencentOS tiny必将会迎来新旧技能的快速迭代,回归测试也将是家常便饭。
作为面向物联网端侧的基础设施软件平台,在TencentOS tiny迭代更新周期中,除了TencentOS tiny开发团队与开源社区的共同努力,不可或缺的还有自动化测试——用计算机的运行速度换取后期维护与排查故障时间,进而实现产品的敏捷开发与快速迭代。
TencentOS tiny 1.1.0版本目前提供了比较完整的内核自动化测试与用例,可以非常方便地进行内核功能验证。从已有的内核测试用例可以看到,仅仅RTOS内核本身就包含了非常多的功能项,自动化测试有助于在新老平台上快速实现内核功能的覆盖测试与回归测试,保证其功能正常与完整,事半功倍。同时,基于TencentOS tiny的测试框架,也可以非常便捷地构建产品应用功能的单元测试集,最终实现自动化的集成测试,高效进行产品迭代。
通过学习TencentOS tiny内核的测试用例集与自动化测试,体会到了先进的测试理念与测试工具带来的高效率。完备的测试用例不仅能大致反应出产品当前版本的主体功能,还能从中学习到设计者对产品的典型应用方式与使用注意事项等等,因此透过TencentOS tiny内核自动测试的学习与体验,有助于进一步掌握TencentOS tiny内核功能及其使用。本文主要内容提要:
-
TencentOS tiny内核功能
TencentOS tiny内核测试
-
C语言单元测试框架greatest
TencentOS tiny内核自动化测试
-
内核测试用例集
MDK硬件平台实战
MDK硬件模拟器仿真
2 TencentOS tiny内核功能
TencentOS tiny内核具有RTOS的典型特征,提供了可抢占式调度机制,满足多任务、实时性等需求,针对相同优先级的任务调度,提供了时间片轮转的Robin机制。同时,还有低功耗实时内核所需的基础服务单元:任务间同步与通信、中断管理、时间管理、内存管理与功耗管理等。
图2.1 TencentOS tiny内核基础
TencenOS tiny内核的任务状态主要包含:
就绪态(K_TASK_STATE_READY)
运行态 (调度器总是运行处于最高优先级的就绪态任务)
睡眠态(K_TASK_STATE_SLEEP)
阻塞态(K_TASK_STATE_PEND)
挂起态(K_TASK_STATE_SUSPENDED)
退出态(K_TASK_STATE_DELETED)
还有如下子任务状态,这些状态实际上是上述主任务状态的“或”组合:
阻塞超时态(K_TASK_STATE_PENDTIMEOUT)
睡眠挂起态(K_TASK_STATE_SLEEP_SUSPENDED)
阻塞挂起态(K_TASK_STATE_PEND_SUSPENDED)
阻塞超时挂起态(K_TASK_STATE_PENDTIMEOUT_SUSPENDED)
TencentOS tiny任务状态与切换如下图所示:
图2.2 TencentOS tiny任务状态与切换
使用开源的代码行数统计工具CLOC,来看看TencentOS tiny内核的代码行数(LOC),如下图所示,相当精炼小巧。
Window下运行命令行CMD.exe:
在cmd命令行窗口中,进入目标文件的所在目录,比如TencentOS tiny\kernel
cd /d 目标文件目录
将cloc-1.84.exe放在该目录下
在cmd命令行窗口中,输入如下命令即可
cloc-1.84.exe core
图2.3 TencentOS tiny内核代码行数
3 TencentOS tiny内核测试
TencentOS tiny基于开源的C语言单元测试框架greatest,提供了一个完整自动化单元测试框架。基于这个测试架构,可以很方便添加新的功能单元测试。
图3.1 TencentOS tiny集成C测试框架greatest
C语言单元测试框架greatest非常精简,通过宏定义(结合#、##等)提供了一套通用的宏API接口,所有代码实现都包含在 "greatest.h"头文件中。
greatest代码仓库
https://github.com/silentbicycle/greatest
3.1 C语言单元测试框架greatest简述
小巧,可移植,轻量
除了ANSI C89之外,greatest 不依赖任何其他库,通过GCC编译( -Wall -Wextra -pedantic)下,在没有警告。代码量小于1,000 行,并且未采用动态分配。
许可证
根据ISC许可证发行。你可以自由使用它,甚至用于商业目的
ISC许可:修改代码后可闭源、可不需版权申明,可免费商用,但商用后不能用作者名字宣传
易于设置
要使用greatest ,仅需#include "greatest.h"在项目中。实际要使用的样板非常少(主要用到的有TEST、SUITE、ASSERT_EQ等),大多数功能是可选的
Un-Opinionated软件
没有太多的规则限制,允许你制定自己的框架规则
单元测试模块化
单元测试可以单独运行,也可以分组进行。分组(Suite)允许不同测试项可以共享通用设置,并且可以位于不同的编译单元。
3.1.1 greatest使用方法
通过调用greatest提供的相关宏接口,即可快速构建测试用例。
图3.2 C单元测试框架greatest使用流程
3.2 内核自动化测试
TencentOS-tiny\test\test_main.c包含了内核单元测试的入口,并根据内核不同的功能单元进行分组(suite)测试,如下所示。
#include "test/test.h"#include "greatest/greatest.h"SUITE_EXTERN(suit_task);SUITE_EXTERN(suit_mutex);SUITE_EXTERN(suit_sem);SUITE_EXTERN(suit_queue);SUITE_EXTERN(suit_event);SUITE_EXTERN(suit_msg_queue);SUITE_EXTERN(suit_mmblk);SUITE_EXTERN(suit_fifo);SUITE_EXTERN(suit_robin);SUITE_EXTERN(suit_timer);GREATEST_MAIN_DEFS();int application_entry(void *arg){ GREATEST_MAIN_BEGIN(); RUN_SUITE(suit_task); RUN_SUITE(suit_mutex); RUN_SUITE(suit_sem); RUN_SUITE(suit_queue); RUN_SUITE(suit_event); RUN_SUITE(suit_msg_queue); RUN_SUITE(suit_mmblk); RUN_SUITE(suit_fifo); RUN_SUITE(suit_robin); RUN_SUITE(suit_timer); GREATEST_MAIN_END();}
通过Doxygen工具可以非常清晰看到内核单元测试之间的调用关系:
图3.3 TencentOS tiny内核测试调用关系
3.2.1 内核测试用例
TencentOS tiny内核测试当前主要包含了任务、信号量、互斥量、事件、队列、消息队列、静态内存池、字节流FIFO、软定时器等功能单元,如下图所示
图3.4 TencentOS tiny内核测试用例
3.2.1 MDK硬件平台实战
在TencentOS-tiny\board\TencentOS_tiny_EVB_MX\KEIL\test提供了一个完整的内核测试示例。
若需要在一个新的硬件平台进行内核测试,可参考以下操作:
假设新平台已移植好,拷贝一个原有可用工程作为原型工程,在新工程中增加TencentOS-tiny\test文件夹下的所有.c文件。
在头文件路径中,“Options” -“C\C++”-“Include Paths”增加 ..\..\..\..\test\include
烧入到新的硬件平台后即可运行(当前测试平台为STM32L476VG),运行结果如下图所示:
图3.5 STM32L4平台内核自动测试报告
greatest测试报告中若有提示FAIL,会提供出错的所在文件、行数等信息,这些信息非常有利于进一步分析问题。
图3.5 suit_timer.c单元测试中的FAIL项分析
3.2.2 MDK硬件模拟器
一时半伙,硬件平台还没有Ready的小伙伴,如果开发环境使用的是MDK,针对TencenOS tiny内核功能的学习与使用,也可以先使用MDK硬件模拟器,MDK针对STM32F103系列提供了比较完整的硬件模拟功能(比如串口外设、GPIO外设等)。
3.2.2.1 硬件模拟器环境搭建
搭建MDK硬件模拟器平台,跟上述硬件平台基本一致,主要的不同是"Debug "标签页需要设置硬件模拟器的相关参数:
可直接拷贝“board/NUCLEO_STM32F103RB”作为项目原型,重名为新项目名称,比如“NUCLEO_STM32F103RB_simulator”
项目工程新增TencentOS-tiny\test文件夹下面所有.c文件
新增头文件路径“Options ”- “Debug ”- “C/C++” - “Include Paths”增加 ..\..\..\..\test\include
使用MDK硬件模拟器最关键的一步,设置“Options ”- “Debug ”,选择为“Use Smiulator”,然后修改“Dialog dll ”与“Parameter”为下述内容,如下图红色方框所示
Dialog dll :
DARMSTM.dll
Parameter:
-pSTM32F103R8
图3.6 MDK硬件模拟器STM32F103设置
编译后即可仿真运行。
图3.7 TencentOS tiny基于MDK硬件模拟器的内核测试
4 参考
TencentOS tiny官网
-
https://cloud.tencent.com/product/tos-tiny
TencentOS tiny 开发指南
-
https://cloud.tencent.com/document/product/1098/36351
或者
-
https://github.com/Tencent/TencentOS-tiny/blob/master/doc/4.TencentOS-tiny开发指南.md
TencentOS tiny SDK文档
-
https://cloud.tencent.com/document/product/1098/36330
或者
-
https://github.com/Tencent/TencentOS-tiny/blob/master/doc/5.TencentOS-tiny-SDK文档.md
杰杰mcuTencentOS tiny深度源码分析(1)——task
杰杰mcuTencentOS tiny深度源码分析(2)—— 调度器