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内核具有RTOS的典型特征,提供了可抢占式调度机制,满足多任务、实时性等需求,针对相同优先级的任务调度,提供了时间片轮转的Robin机制。同时,还有低功耗实时内核所需的基础服务单元:任务间同步与通信、中断管理、时间管理、内存管理与功耗管理等。

图2.1 TencentOS tiny内核基础
TencenOS tiny内核的任务状态主要包含:
还有如下子任务状态,这些状态实际上是上述主任务状态的“或”组合:
TencentOS tiny任务状态与切换如下图所示:

图2.2 TencentOS tiny任务状态与切换
使用开源的代码行数统计工具CLOC,来看看TencentOS tiny内核的代码行数(LOC),如下图所示,相当精炼小巧。
Window下运行命令行CMD.exe:

图2.3 TencentOS tiny内核代码行数
TencentOS tiny基于开源的C语言单元测试框架greatest,提供了一个完整自动化单元测试框架。基于这个测试架构,可以很方便添加新的功能单元测试。

图3.1 TencentOS tiny集成C测试框架greatest
C语言单元测试框架greatest非常精简,通过宏定义(结合#、##等)提供了一套通用的宏API接口,所有代码实现都包含在 "greatest.h"头文件中。
greatest代码仓库
- https://github.com/silentbicycle/greatest
通过调用greatest提供的相关宏接口,即可快速构建测试用例。


图3.2 C单元测试框架greatest使用流程
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内核测试调用关系
TencentOS tiny内核测试当前主要包含了任务、信号量、互斥量、事件、队列、消息队列、静态内存池、字节流FIFO、软定时器等功能单元,如下图所示







图3.4 TencentOS tiny内核测试用例
在TencentOS-tiny\board\TencentOS_tiny_EVB_MX\KEIL\test提供了一个完整的内核测试示例。
若需要在一个新的硬件平台进行内核测试,可参考以下操作:
烧入到新的硬件平台后即可运行(当前测试平台为STM32L476VG),运行结果如下图所示:

图3.5 STM32L4平台内核自动测试报告
greatest测试报告中若有提示FAIL,会提供出错的所在文件、行数等信息,这些信息非常有利于进一步分析问题。

图3.5 suit_timer.c单元测试中的FAIL项分析
一时半伙,硬件平台还没有Ready的小伙伴,如果开发环境使用的是MDK,针对TencenOS tiny内核功能的学习与使用,也可以先使用MDK硬件模拟器,MDK针对STM32F103系列提供了比较完整的硬件模拟功能(比如串口外设、GPIO外设等)。
搭建MDK硬件模拟器平台,跟上述硬件平台基本一致,主要的不同是"Debug "标签页需要设置硬件模拟器的相关参数:
Dialog dll :
- DARMSTM.dll
Parameter:
- -pSTM32F103R8


图3.6 MDK硬件模拟器STM32F103设置
编译后即可仿真运行。

图3.7 TencentOS tiny基于MDK硬件模拟器的内核测试
或者
或者
作者:绿森林雨景
本文授权转载自LPWANThings(ID: LPWANThings),二次转载或合作请联系 296894494@qq.com
·end·