Archive for August, 2008

lua单元测试框架-lunit-0.4文档

Monday, August 11th, 2008

lunit-0.4文档

译者: gashero

目录

1   译者序

习惯了单元测试,而不习惯调试器。所以学了lua以后一直寻找这个东西,发现效果不错。

2   初始化

使用 lunit 单元测试框架所需的文件如下: lunitlunit.lualunit-console.lua

编写测试用例需要导入模块。而 lunit 是一个shell脚本用于寻找 lunit.lualunit-console.lua

require "lunit"

lunit 使用lua-5.1的模块系统。测试用例是被标志为”lunit.testcase”的模块,例如:

require "lunit"
module("my_testcase",lunit.testcase,package.seeall)

实际的测试用例就是模块中以 test 开头或结尾的函数,函数名大小写无关。例如:

require "lunit"
module("my_testcase",lunit.testcase,package.seeall)

function FirstTest()
    --Test code goes here
end

function test_something()
    --Test code goes here
end

3   断言函数

测试函数中可以使用多种断言函数,用于测试代码或包。 lunit 定义了26个断言函数如下:

  1. fail([msg]) :总是失败。
  2. assert(assertion,[msg]) :如果assertion为false或nil时失败。
  3. assert_true(actual,[msg]) :当actual不为true时失败。
  4. assert_false(actual,[msg]) :断言为假
  5. assert_equal(expected,actual,[msg]) :断言相等
  6. assert_not_equal(expected,actual,[msg]) :断言不等
  7. assert_match(pattern,actual,[msg]) :使用字符串匹配断言
  8. assert_not_match(pattern,actual,[msg]) :不匹配
  9. assert_nil(actual,[msg]) :断言nil
  10. assert_not_nil(actual,[msg]) :断言非nil
  11. assert_boolean(actual,[msg]) :断言为true或false
  12. assert_not_boolean(actual,[msg]) :断言非true或false
  13. assert_number(actual,[msg]) :断言为数字
  14. assert_not_number(actual,[msg]) :断言非数字
  15. assert_string(actual,[msg]) :断言为字符串
  16. assert_not_string(actual,[msg]) :断言为非字符串
  17. assert_table(actual,[msg]) :断言为表格
  18. assert_not_table(actual,[msg]) :断言非表格
  19. assert_function(actual,[msg]) :断言为函数
  20. assert_not_function(actual,[msg]) :断言非函数
  21. assert_thread(actual,[msg]) :断言为协程
  22. assert_not_thread(actual,[msg]) :断言非协程
  23. assert_userdata(actual,[msg]) :断言为userdata
  24. assert_not_userdata(actual,[msg]) :断言非userdata
  25. assert_error([msg],func) :断言func执行会出错
  26. assert_pass([msg],func) :断言func执行不出错

所有如上函数最后一个参数都是可选的错误信息。只有 assert_error() 和 assert_pass() 例外。

下面的函数也很有用,用于测试值的类型:

  1. is_nil(actual)
  2. is_boolean(actual)
  3. is_number(actual)
  4. is_string(actual)
  5. is_table(actual)
  6. is_function(actual)
  7. is_thread(actual)
  8. is_userdata(actual)

这些函数在actual类型正确时返回true,否则返回false。

可以在你的代码中使用断言函数和 is_type 函数来测试代码或包,例如:

require "lunit"
module("my_testcase",lunit.testcase,package.seeall)

function FirstTest()
    local result=compute_some_value()
    assert_string(result)
    assert_equal("foobar",result)
end

function test_something()
    local result=flip_coin()
    assert_number(result)
    if result==0 then
        --ok
    elseif result==1 then
        --ok
    else
        fail("flip_coin: invalid number: "..tostring(result))
    end
end

4   测试会话函数

可以定义 setup() 和 teardown() 函数,用于每次调用测试函数时的资源初始化和释放。例如:

require "lunit"
module("resource_testcase",lunit.testcase,package.seeall)

local orig_content,handle

function setup()
    orig_content={"row1","row2","row3"}
    handle=database_open("test.db")
    database_create_table(handle,...)
    database_fill_table(handle,orig_content,...)
end

function teardown()
    database_drop_table(handle,...)
    database_close(handle)
    handle=nil
    orig_content=nil
    delete_file("test.db")
end

function test_select()
    --...
end

function test_insert()
    --...
end

function test_delete()
    --...
end

5   运行单元测试

$ ./lunit my_testcase.lua

httplib/urllib/urllib2很不靠谱

Thursday, August 7th, 2008

如题,httplib在连接同一个DNS得到的多个IP时有bug导致Operation now in progress错误。而urllib/urllib2更是基于httplib的。

最近咬咬牙,升级到Python2.5.2了,也许升级版本会解决这个问题。不过我更加倾向于使用curl。

刚才骑车摔了

Sunday, August 3rd, 2008

如题,下午去公司,先去吃午饭的路上,下坡后没看见有个10cm深的小坑,于是,就摔了。车子摔出距离坑有1.5m远的地方,我则甩出去接近2m。

当时摔了以后,后面的电动车又撞到我的车上,不过貌似没有造成更严重的伤害。左腿被压住,还是请旁边的观众抬起了车。我则坐在原地挣扎了半天才站起来,右胳膊肘关节可能伤的比较重,支撑不起我的身体。车子前挡泥板摔歪了,简易的扳一下就送回公司了。身上没有出血的地方,连淤血都没见到,就是右胳膊的肘关节疼的比较严重。

摔下去时后背着地,回公司一样,T43好牛,一点问题都没有。Nokia5500的手机也是纹丝不动。让我略感安慰。

买了自行车一年了,一直骑车很嚣张,不过这次却不是因为嚣张,仅仅是下坡速度稍微快了一点,又遇上小坑。

唉,右臂还是很痛,抬起胳膊都困难,等几天看看情况吧。万恶的医疗保险,连看病都不敢去。