Chinaunix首页 | 论坛 | 博客
  • 博客访问: 562363
  • 博文数量: 107
  • 博客积分: 3079
  • 博客等级: 少校
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-08 00:03
个人简介

emmoblin.github.com

文章分类

全部博文(107)

文章存档

2012年(8)

2011年(15)

2010年(49)

2009年(9)

2008年(26)

分类: LINUX

2010-08-06 17:44:07

之所以使用lua进行单元测试,而不用cunit,我觉得主要是考虑一下几点:
1)lua测试命令行,优势明显
2)cunit对函数进行单元测试的功能,用lua也可以做到。而且参数可以通过lua传递,更加灵活,修改测试用例不需要重新编译。
以前用cunit写的时候,修改一下就要重新编译,而且还要继续内存的管理。测试用例写多了有点厌烦。

下面主要看看Lua调用c函数进行单元测试:

这是lua代码,

    local iptable = {}
   

    --组织输入参数

    for num = 1,5 do
     local newip = {["ip"]="192.168.1."..num, ["up"]=0, ["down"]=0}
     iptable[num] = newip
     print(iptable[num].ip, iptable[num].up, iptable[num].down)
    end
   

    --调用被测试的c函数

    qostest.qos_add_e(iptable)
   

    --检测返回结果是否是预期结果,这里只是简单的打印了一下,没有用assert

    for num = 1,5 do
     print(iptable[num].ip, iptable[num].up, iptable[num].down)
    end


下面是对应的c函数的实现:
其中最容易出错的地方就是对于当前栈的层次,要时刻记住每一个lua_* 相关的操作后,栈会变成什么样子。
建议全部使用正数代表index,混合使用正数和负数比较容易出错。

static int qos_add_e (lua_State *L) {
    __u32 *handle,ip;
    int i = 0, ipnum = 0;

    ipnum = lua_objlen(L, 1);
    printf("in libqostst qID = %u pID = %u ipnum = %d\n"
        , qID, pID, ipnum);
  
    const char *ipstr = NULL;
    for ( i = 1; i <= ipnum; i++ ) {
        lua_pushnumber(L, i);//push key

        lua_gettable(L, 1);//get value ,get level 1 table

        lua_getfield(L, 2, "ip");
        ipstr = luaL_checkstring(L, 3);
        
        printf("%d=%s\n", i, ipstr);
        ip = ntohl(inet_addr(ipstr));

       

        //传入ip,返回上下行的handle

        testfunc(ip, handle)

        //return handle to lua
        lua_pushnumber(L, handle[0]);
        lua_setfield(L, 2, "up");
        lua_pop(L, 2);
    }
   
    return 1;
}


阅读(1933) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~