求测试框架思路
求测试框架思路
系统环境:嵌入式系统;没有源代码级调试器;但可以跟踪os消息;每个process占用系统时间
不能超过N秒时间,否则重启;
设计原因:由于系统跟硬件结合的很紧密,而且频繁更改,并且,要命的是,设计也没有很好的
遵循紧内聚、松耦合的原则。同一模块内的数据和硬件资源是完全共享的;不同模块
之间的硬件资源也有一部分是完全共享的;并且,没有一个单独的资源管理模块;对
硬件资源的使用和释放由各个模块自己实现。
这样,经常出现的一种情况就是,对某一个模块某一个函数的一点小的改动,不经意
间影响到其他的功能,导致一个隐藏很深的bug,要在使用好几天以后才被发现。
由于系统很复杂,手工作一遍回归测试(测试所有功能)很费时间,所以想弄一个自
动测试框架——可以根据事前的定义自动测试所有的函数,可以很方便的添加和删除需
要测试的函数和输入数据,而不用大量改写代码。
我的设计:之前在网上着了一些c语言自动测试框架,不过,不太理解,似乎不可配置:(
很简单的把被测函数往那一放,了事
自己也尝试设计了一把。
一种思路是开定时器,每次定时器中断到来的时候,改变一些全局变量的值在定时器
中断里放一个庞大的switch-case语句,根据这些全局变量的不同调用不同的函数,
这就起到一个循环执行不同函数的作用,又不会使整个循环的时间太长超过N秒的
限制,但这样做在需要增加或删除一个新的函数时需要改写switch-case语句,容易
出错。
另一种思路是不需要改写switch-case语句,这样就需要把待测试的函数跟测试数据
都放进不同的数据结构中,通过对这一个数据结构的遍历来测试不同的函数。
下面是一个我根据第二种思路在pc上实现的模拟框架,在实际系统中,将用定时器和
switch-case来实现for循环的功能(好像此路不通:<)
*********************************************************
现在的问题是,将不同参数的函数塞进一个结构是可以实现的,遍历执行这个结构也
是可以实现的;但是,当遍历到不同函数时,需要给不同的函数不同的参数,怎么
实现呢?
这种遍历的思路是否不行了,还请大家集思广益:)
#include <stdio.h>
typedef struct sTestElement
{
int (*func_p)(int i, ...); /*待测试函数的指针,变参*/
int timer_ticks; /*该函数执行的次数*/
}
TestElement;
const int test_func1(void) /*待测函数1*/
{
printf("\ntest_func1 ok");
return 0;
}
const int test_func2(int i, void *p) /*待测函数2*/
{
printf("\n#%d#testfunc_2 ok", i);
printf("\n*%x*testfunc_2 ok", *(int*)p);
return 0;
}
/*待测函数2的输入*/
int i1 = 10;
int j1= 555;
/*测试集,数组的每一个元素指向一个待测函数指针,以及该待测函数将执行的次数*/
TestElement testSuits[] =
{
(const TestElement((*)()))test_func1, 3,
(const TestElement((*)()))test_func2, 1,
(const TestElement((*)()))test_func2, 2
};
/*配置,丛数组的TEST_BEGIN_ID开始测试到TEST_END_ID*/
const TEST_BEGIN_ID = 0;
const TEST_END_ID = 2;
int main(void)
{
int i, j;
for(i = TEST_BEGIN_ID; i <= TEST_END_ID; i++)
{
for(j = 0; j< testSuits[i].timer_ticks; j++)
{
testSuits[i].func_p(i1, &j1); /*!!!!问题在这里!!!!*/
/*
现在test1和test2都可以正确执行,因为test1是忽略参数的,test2的参数
就是这个样子,但如果现在有个void test3(int),跟test2的参数类型不一样,
这个就没有办法了
*/
}
}
}