您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
嵌入式单元测试实践介绍
 
作者:忠s
   次浏览      
 2021-3-22 
 
编辑推荐:
本文主要简单介绍了单元测试,实现了一个测试用例,并且让测试通过。
本文来自于csdn,由火龙果软件Anna编辑、推荐。

背景:

实践单元测试一段时间了,感觉十分有用,具体单元测试的好处,这边不描述,单元测试的基本概念,这里也不描述了。本文章是介绍单元测试在嵌入式开发的应用。

我这边使用的单元测试框架是:Unity,一个轻量级的单元测试框架,C语言编写,方便移植和裁剪。

Unity的相关资料源码可以从Github上下载,开源的。单元测试的优点也可以从CSDN其它博客中找到。

本文会以TDD为指导原则,先写测试用例定义被测函数的功能,再在被测函数中实现这个功能,全部用C语言实现。

简介

代码架构介绍

讲解下添加单元测试后的代码结构:

1. 代码比较简单:

2. 系统存在多个子系统或者模块的

单元测试的运行:

IDE

目标硬件上运行

Linux下运行

开始

我eMMC协议的CMD6处理为例子,建立单元测试的相关测试用例,为什么要用CMD6处理函数为被测试对象呢,因为我正在写测试用例覆盖这个模块。.如果不了解eMMC协议的,没有关系,逻辑其实不复杂,下面会以简单的说明去介绍。

首个测试用例

根据协议描述,如果CMD6操作了EXTCSD192 - 255区域,device应该不做任何修改,并且设置“SWITCH_ERROR”状态。

The Index field can contain any value from 0–255, but only values 0–191 are valid values. If the Index value is in 192-255 range the Device does not perform any modification and the SWITCH_ERROR status bit is set.

测试用例简介,

CMD6操作偏移设置为192进行访问,argument是CMD6的参数,4BYTE,每个byte代表不同的含义,其中[16:23]指存取的index。

其中emmc_initial_status()为初始化device status为正常,emmc_get_status()是获取device当前的状态。

static void tst_cmd6_access_invalid_index (void)
{
BYTE ret;
BYTE command_set = 0;
BYTE value = 0;
BYTE index = 0;
BYTE access_mode = 0;
UINT argument;
EXT_CSD extcsd;

emmc_initial_status(); // 初始化device status为normal status

index = 192;
argument = ((UINT)access_mode << 24) | ((UINT)index << 16) | ((UINT)value << 8) | command_set;

ret = emmc_cmd6 (argument, &extcsd);

TEST_ASSERT_EQUAL_INT8 (FALSE, ret); // 被测函数检测到异常,返回false
TEST_ASSERT_EQUAL_INT8 (SWITCH_ERROR, emmc_get_status());
}

被测函数如下:

BYTE emmc_cmd6 (UINT argument, EXT_CSD *pextcsd)
{
return TRUE;
}

把测试用例添加到测试套件中:

int tstSuite_cmd6(void)
{
UNIT_regSetupFunc(Setup);
UNIT_regTeardownFunc (TearDown);
UnityBegin(__FILE__);

RUN_TEST (tst_cmd6_access_invalid_index);

UNIT_regSetupFunc(NULL);
UNIT_regTeardownFunc(NULL);
return UnityEnd();

运行测试,并且输出结果:

>>>>
..\unittest\ts_cmd6\tsuite_cmd6.c:87 :tst_cmd6_access_invalid_index:FAIL: Expected 0 Was 1

1 Tests 1 Failures 0 Ignored
FAIL

OK,结果肯定是fail的。我们修改被测代码以让测试可以pass,修改内容:在检测到异常时返回FALSE,并且在index >= 192时设置device status为SWITCH_ERROR”,修改过程略...修改后如下

BYTE emmc_cmd6(UINT argument, EXT_CSD *pextcsd)
{
BYTE index = (BYTE)(argument >> 16);

if (index >= 192)
{
emmc_set_status(SWITCH_ERROR);
return FALSE;
}

return TRUE;
}

测试通过,输出界面如下:

>>>>
..\..\..\unitTest\ts_cmd6\tSuite_cmd6.c: 126:tst_cmd6_access_invalid_index :PASS

1 Tests 0 Failures 0 Ignored
OK

 

 

 
   
次浏览       
 
相关文章

云计算的架构
对云计算服务模型
云计算核心技术剖析
了解云计算的漏洞
 
相关文档

云计算简介
云计算简介与云安全
下一代网络计算--云计算
软浅析云计算
 
相关课程

云计算原理与应用
云计算应用与开发
CMMI体系与实践
基于CMMI标准的软件质量保证
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]
 
最新文章
基于FPGA的异构计算在多媒体中的应用
深入Linux内核架构——简介与概述
Linux内核系统架构介绍
浅析嵌入式C优化技巧
进程间通信(IPC)介绍
最新课程
嵌入式Linux驱动开发
代码整洁之道-态度、技艺与习惯
嵌入式软件测试
嵌入式C高质量编程
嵌入式软件可靠性设计
更多...   
成功案例
某军工所 嵌入式软件架构
中航工业某研究所 嵌入式软件开发指南
某轨道交通 嵌入式软件高级设计实践
深圳 嵌入式软件架构设计—高级实践
某企业 基于IPD的嵌入式软件开发
更多...