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

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

Leave a Reply