我想从单个文件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}}档案?
答案 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
。