如何在单个文件Lua脚本中测试函数?

时间:2017-09-22 14:39:56

标签: unit-testing testing lua

我想从单个文件Lua脚本中单元测试函数,比如script.lua。该脚本如下所示:

-- some fields from gvsp dissector which shall be post processed in custom dissector
gvsp_field0_f = Field.new("gvsp.<field0-name>")
gvsp_field1_f = Field.new("gvsp.<field1-name>")

-- custom protocol declaration
custom_protocol = Proto("custom","Custom Postdissector")

-- custom protocol field declarations
field0_f = ProtoField.string("custom.<field0-name>","Custom Field 0")
field1_f = ProtoField.string("custom.<field1-name>","Custom Field 1")

-- register custom protocol as postdissector
register_postdissector(custom_protocol)

function custom_protocol.dissector(buffer,pinfo,tree)
    -- local field values of "pre" dissector which are analyzed
    local gvsp_field0_value = gvsp_field0_f()
    local gvsp_field1_value = gvsp_field1_f()

    -- functions which shell be unit tested
    function0(...)
    function1(...)
end

function0(...)
    -- implementation
end

function1(...)
    -- implementation
end

假设我不想将函数从脚本文件分离到单独的模块文件中(这可能会使事情变得更容易)。我如何定义测试(最好使用luaunit,因为易于集成,但其他工具也可以),用于script.lua文件中script.lua或{1}中定义的函数。 {1}}档案?

2 个答案:

答案 0 :(得分:2)

简单回答:你不能!

几年前我自己问过Lua团队这个问题,因为没有明显的方法可以让脚本知道它是运行或包含的主要脚本(例如,&#39;要求&#39; d)。

在可预见的将来,似乎没有兴趣增加这种能力!

答案 1 :(得分:0)

要启用单独的脚本和单元测试执行,需要至少3个文件(在此示例中为4,因为由单个文件组成的单元测试框架luaunit已集成到项目目录中)。对于此示例,所有文件都驻留在同一目录中。脚本script.lua可能未定义其中的任何函数,但必须从其模块module.lua导入所需的所有函数。

-- script imports module functions
module = require('module')

-- ... and uses it to print the result of the addition function
result = module.addtwo(1,1)
print(result)

module.lua是根据Lua module skeleton实现的,其功能会自动注册,以便通过其他脚本文件或模块导入。

-- capture the name searched for by require
local NAME=...

-- table for our functions
local M = { }

-- A typical local function that is also published in the
-- module table.
local function addtwo(a,b) return a+b end
M.addtwo = addtwo

-- Shorthand form is less typing and doesn't use a local variable
function M.subtwo(x) return x-2 end

return M

test_module.lua包含模块函数的单元测试,并导入luaunit.lua(单元测试框架)以执行它。 test_module.lua具有以下内容。

luaunit = require('luaunit')
script = require('module')

function testAddPositive()
    luaunit.assertEquals(module.addtwo(1,1),2)
end

os.exit( luaunit.LuaUnit.run() )

如果通过执行lua test_module.lua运行测试,则测试将与脚本功能分开执行。

.
Ran 1 tests in 0.000 seconds, 1 success, 0 failures
OK

脚本照常执行,lua script.lua输出2