本次我们来介绍嵌入式可测试软件设计。 什么是可测试性?就是你这个软件模块/函数接口写完之后,可以较为方便、较为全面地进行自测 。 举个简单的例子来认识可测试性软件。 有一个计算函数cal_func,其计算依赖于存在flash里的数据a,与一个外部输入的数据b。
此时,有如下两种实现方法: 方法一: int get_a_from_flash(void)
{
int a = 0;
flash_read(&a, sizeof(int));
return a;
}
int cal_func(int a, int b)
{
int res = 0;
res = a + b;
return res;
}
// 调用
cal_func(get_a_from_flash(), 5);
int get_a_from_flash(void)
{
int a = 0;
flash_read(&a, sizeof(int));
return a;
}
int cal_func(int b)
{
int res = 0;
int a = get_a_from_flash();
res = a + b;
return res;
}
// 调用
cal_func(5); 方法二: int get_a_from_flash(void)
{
int a = 0;
flash_read(&a, sizeof(int));
return a;
}
int cal_func(int a, int b)
{
int res = 0;
res = a + b;
return res;
}
// 调用
cal_func(get_a_from_flash(), 5);
这种类似场景,实际开发中应该有不少,大家平时都是按照方式一写代码还是方式二写代码呢? 从可测试性的角度来看, 方法二的实现,更具备可测试性 。 方式一,因为有一个数据是在函数内部从flash中读取的,所以这个数据我们不太方便进行控制,而能控制的只有参数b。那么,这样子,我们在调用测试时,测得就不是很全,也不能灵活地控制测试路径。 方式二,计算所依赖的数据都通过函数参数留出来了,我们可以很方便地对函数进行测试,可以很方便地输入不同的数据组合。 并且,一般地,我们会引入一些 单元测试框架 ,用来统一管理我们的测试例子。
|