lua单元测试框架-lunit-0.4文档
lunit-0.4文档
| 译者: | gashero | 
|---|
1 译者序
习惯了单元测试,而不习惯调试器。所以学了lua以后一直寻找这个东西,发现效果不错。
2 初始化
使用 lunit 单元测试框架所需的文件如下: lunit 、 lunit.lua 、 lunit-console.lua 。
编写测试用例需要导入模块。而 lunit 是一个shell脚本用于寻找 lunit.lua 和 lunit-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个断言函数如下:
- fail([msg]) :总是失败。
 - assert(assertion,[msg]) :如果assertion为false或nil时失败。
 - assert_true(actual,[msg]) :当actual不为true时失败。
 - assert_false(actual,[msg]) :断言为假
 - assert_equal(expected,actual,[msg]) :断言相等
 - assert_not_equal(expected,actual,[msg]) :断言不等
 - assert_match(pattern,actual,[msg]) :使用字符串匹配断言
 - assert_not_match(pattern,actual,[msg]) :不匹配
 - assert_nil(actual,[msg]) :断言nil
 - assert_not_nil(actual,[msg]) :断言非nil
 - assert_boolean(actual,[msg]) :断言为true或false
 - assert_not_boolean(actual,[msg]) :断言非true或false
 - assert_number(actual,[msg]) :断言为数字
 - assert_not_number(actual,[msg]) :断言非数字
 - assert_string(actual,[msg]) :断言为字符串
 - assert_not_string(actual,[msg]) :断言为非字符串
 - assert_table(actual,[msg]) :断言为表格
 - assert_not_table(actual,[msg]) :断言非表格
 - assert_function(actual,[msg]) :断言为函数
 - assert_not_function(actual,[msg]) :断言非函数
 - assert_thread(actual,[msg]) :断言为协程
 - assert_not_thread(actual,[msg]) :断言非协程
 - assert_userdata(actual,[msg]) :断言为userdata
 - assert_not_userdata(actual,[msg]) :断言非userdata
 - assert_error([msg],func) :断言func执行会出错
 - assert_pass([msg],func) :断言func执行不出错
 
所有如上函数最后一个参数都是可选的错误信息。只有 assert_error() 和 assert_pass() 例外。
下面的函数也很有用,用于测试值的类型:
- is_nil(actual)
 - is_boolean(actual)
 - is_number(actual)
 - is_string(actual)
 - is_table(actual)
 - is_function(actual)
 - is_thread(actual)
 - 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