Linux(服务器编程):48---luaunit单元测试

一、luaunit概述

  • luaunit是Lua语言的一套用于编写lua的单元测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构
  • 支持很多好用的特性,支持生成Test,TAP,JUnit和XML报告等等,这些格式的结果报名可以很好地集成于Jenkins和Hudson的持续集成环境
  • luaunit支持通过传递一些命令去挑选测试用例,见下文LuaUnit的命令部分描述
  • uaunit支持lua 5.1到lua5.3,支持luaJIT2.0和LuaJIT2.1 beta,以及其它各种操作系统,Windows,MacOS X 和Ubuntu
  • Luaunit的源码见GitHub:https://github.com/bluebird75/luaunit
  • 详情参阅:https://luaunit.readthedocs.io/en/latest/#command-line-options

二、使用

  • 从github上面下载luaunit的源码
git clone https://github.com/bluebird75/luaunit.git

Linux(服务器编程):48---luaunit单元测试_第1张图片

  • 进入到目录中,目录中有一个luaunit.lua文件,只要把这个文件包含到你的工程中就可以使用了

  • 使用语法如下:
-- 创建测试脚本,在测试脚本的开始处包含luaunit:
lu = require('luaunit')

-- ....

-- 在测试脚本的最后添加:
os.exit(lu.LuaUnit.run())

三、演示案例

  • Luaunit只有一个文件,只需要把luaunit.lua添加到工程种就可以了,支持各种各样的断言,在3.3的版本后,支持List的比对

演示案例

  • 代码如下,名为 test_some_lists_comparison.lua
lu = require('luaunit')

TestListCompare={}

function TestListCompare:test1()
    local A = { 121221, 122211, 121221, 122211, 121221, 122212, 121212, 122112, 122121, 121212, 122121 }
    local B = { 121221, 122211, 121221, 122211, 121221, 122212, 121212, 122112, 121221, 121212, 122121 }
    lu.assertEquals( A, B )
end

os.exit(lu.LuaUnit.run())
  • 运行程序:
lua test_some_lists_comparison.lua
  •  结果如下:

四、相关语法

如何编写测试用例

  • 所有的测试用例名字必须以test或者Test开始,如果我们创建了一个表格table,在table里添加测试用例的话,table名称必须以test或者Test开始
  • 当我们写测试用例时,只要使用luaunit.lua里定义的assert就可以对被测对象进行判断了
  • 比如我们想测试以下这个函数:
function add(v1,v2)
    -- add positive numbers
    -- return 0 if any of the numbers are 0
    -- error if any of the two numbers are negative
    if v1 < 0 or v2 < 0 then
        error('Can only add positive or null numbers, received '..v1..' and '..v2)
    end
    if v1 == 0 or v2 == 0 then
        return 0
    end
    return v1+v2
end
  • 们就可以写这样的测试用例:
function testAddPositive()
    lu.assertEquals(add(1,1),2)
end

function testAddZero()
    lu.assertEquals(add(1,0),0)
    lu.assertEquals(add(0,5),0)
    lu.assertEquals(add(0,0),0)
end
  • 运行测试用例:
lua test_add.lua -v
  • 当我们在写测试用例中,如果想输出一些error msg,我们可以使用lu.assertErrorMsgContains('Can only add positive or null numbers, received 2 and -3', add, 2, -3),这样测试的意思是,提示用户只能输入正整数
  • 在lua中,我们还可以定义函数的返回值为一个函数,或者其它,如果是函数,我们还可以使用assertIsFunction()去判断返回值,然后还可以继续调用该函数,比如:
function adder(v)
    -- return a function that adds v to its argument using add
    function closure( x ) return x+v end
    return closure
end

function testAdder()
    f = adder(3)
    lu.assertIsFunction( f )
    lu.assertEquals( f(2), 5 )
end

测试套

  • 比如被测函数是:
function div(v1,v2)
    -- divide positive numbers
    -- return 0 if any of the numbers are 0
    -- error if any of the two numbers are negative
    if v1 < 0 or v2 < 0 then
        error('Can only divide positive or null numbers, received '..v1..' and '..v2)
    end
    if v1 == 0 or v2 == 0 then
        return 0
    end
    return v1/v2
end
  • 那么我们可以在测试脚本中先定义一个表格,然后然表格中添加测试用例函数,这样这个表格就是一个测试套:
TestDiv = {}
    function TestDiv:testDivPositive()
        lu.assertEquals(div(4,2),2)
    end

    function TestDiv:testDivZero()
        lu.assertEquals(div(4,0),0)
        lu.assertEquals(div(0,5),0)
        lu.assertEquals(div(0,0),0)
    end

    function TestDiv:testDivError()
        lu.assertErrorMsgContains('Can only divide positive or null numbers, received 2 and -3', div, 2, -3)
    end
-- end of table TestDiv
  • 但是如果我们想在测试套的每个测试用例前做一些初始化动作和在测试用例之后做一些清理工作,那么就可以添加setUp和tearDown方法。比如:
TestLogger = {}
    function TestLogger:setUp()
        -- define the fname to use for logging
        self.fname = 'mytmplog.log'
        -- make sure the file does not already exists
        os.remove(self.fname)
    end

    function TestLogger:testLoggerCreatesFile()
        initLog(self.fname)
        log('toto')
        -- make sure that our log file was created
        f = io.open(self.fname, 'r')
        lu.assertNotNil( f )
        f:close()
    end

    function TestLogger:tearDown()
        -- cleanup our log file after all tests
        os.remove(self.fname)
    end
  • 当然如果setUp和tearDown有任何的错误,都会视为测试用例失败

断言

assertEquals(actual, expected[, extra_msg])
assertNotEquals(actual, expected[, extra_msg])
  • 更多assert详情见:https://luaunit.readthedocs.io/en/latest/#assertEquals

五、luaunit的命令

  • --output, -o FORMAT:Set output format to FORMAT. Possible values: text, tap, junit, nil . See Output formats
  • --name, -n FILENAME:For junit format only, mandatory name of xml file. Ignored for other formats
  •  --pattern, -p PATTERN:Execute all test names matching the Lua PATTERN. May be repeated to include severals patterns. See Flexible test selection
  •  --exclude, -x PATTERN:Exclude all test names matching the Lua PATTERN. May be repeated to exclude severals patterns. See Flexible test selection
  •  --repeat, -r NUM:Repeat all tests NUM times, e.g. to trigger the JIT. See Other options
  • --shuffle, -s:Shuffle tests before running them. See Other options
  • --error, -e:Stop on first error. See Other options
  • --failure, -f:Stop on first failure or error. See Other options
  •  --verbose, -v:Increase verbosity
  • --quiet, -q:Set verbosity to minimum
  • --help, -h:Print help
  • --version:Version information of LuaUnit

你可能感兴趣的:(Linux(服务器编程))