编辑推荐: |
本文主要简单介绍了单元测试,实现了一个测试用例,并且让测试通过。
本文来自于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 |
|