求测试框架思路

xiaDan 2002-12-19 01:34:57
求测试框架思路

系统环境:嵌入式系统;没有源代码级调试器;但可以跟踪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的参数类型不一样,
这个就没有办法了
*/

}
}
}



...全文
50 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaDan 2002-12-19
  • 打赏
  • 举报
回复
多谢捧场,受教了
哎,看来还是要针对不同的函数生成不同的测试——如alou()所说的funcTester(),看来最好是要能够写一个脚本,可以分析这些函数,然后自动生成funcTester()比较方便。
还有主流的测试框架,我听说过有XUnit系列,其中CUnit似乎是从JUnit改写过来的,不只有没有针对C的经典一点的,哪里有下载?
alou 2002-12-19
  • 打赏
  • 举报
回复
主流的测试框架采用OO的方式设计,在TestCase下面都会派生出针对具体测试用例的XXXTestCase。
这样就是
TestCase
|
XXXTestCase ---- XXXUnitUnderTest
的关系。
不同的XXXUnitUnderTest之间不需要有任何的关系,因为只有它们的TestCase知道它。
而在上面的结构中,是
TestSuite --- TestCase --- UnitUnderTest
缺少了继承的灵活性,所有的变化直接冲击了UnitUnderTest,这就造成了提出的问题。
我觉得,加上一个funcTester可能会好一些。
func1Tester()
{
test_func1();
}
func2Tester()
{
il = ..
jl = ...
test_func2(il, jl);
}
...
TestSuite =
....

xunknown 2002-12-19
  • 打赏
  • 举报
回复
现在的问题是,将不同参数的函数塞进一个结构是可以实现的,遍历执行这个结构也
是可以实现的;但是,当遍历到不同函数时,需要给不同的函数不同的参数,怎么
实现呢?
这种遍历的思路是否不行了,还请大家集思广益:)
/////////////////////////
给你提示一下:
MFC的消息处理函数就要不同的参数,但是他们一样能够正常的遍历。
他们采用了一个函数参数和返回值的标识符来给不同的函数确定返回值和参数。
要更多的信息请参考MSDN或者查看MFC源代码。看看MESSAGE_MAP.

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧