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

我想对单个 Lua 脚本文件中的函数进行单元测试,比如说 script.lua。脚本的样子大概是这样的:

-- 一些从 gvsp 解析器中获取的字段,将会在自定义解析器中进行后处理
gvsp_field0_f = Field.new("gvsp.<field0-name>")
gvsp_field1_f = Field.new("gvsp.<field1-name>")

-- 自定义协议声明
custom_protocol = Proto("custom","Custom Postdissector")

-- 自定义协议字段声明
field0_f = ProtoField.string("custom.<field0-name>","Custom Field 0")
field1_f = ProtoField.string("custom.<field1-name>","Custom Field 1")

-- 将自定义协议作为后处理器进行注册
register_postdissector(custom_protocol)

function custom_protocol.dissector(buffer,pinfo,tree)
    -- "pre" 解析器中的局部字段值
    local gvsp_field0_value = gvsp_field0_f()
    local gvsp_field1_value = gvsp_field1_f()

    -- 测试用的函数
    function0(...)
    function1(...)
end

function0(...)
    -- 实现
end

function1(...)
    -- 实现
end

比方说我不想将脚本文件中的函数分离到单独的模块文件中(虽然这样可能会更容易),那么该如何在 script.lua 文件内或者一个单独的 test_script.lua 文件中定义测试(最好使用 luaunit )以测试已经在 script.lua 中定义的函数呢?

点赞
用户3735873
用户3735873

简单的答案是:你不能!

几年前,我向 Lua 团队询问过这个问题,因为脚本无法明确知道它是运行的主脚本还是已经包含被 'require' 的脚本。

未来看来也不打算添加这种功能!

2017-09-23 05:15:20
用户5308983
用户5308983

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

--脚本导入模块函数
module = require('module')

-- ...并使用它来打印加法函数的结果
result = module.addtwo(1,1)
print(result)

module.lua 根据 Lua 模块骨架 实现,其函数会自动注册以供其他脚本文件或模块导入。

-- 捕获 require 搜索的名称
local NAME=...

-- 表格用于存储函数
local M = { }

-- 一个典型的本地函数,也会在模块表格中发布。
local function addtwo(a,b) return a+b end
M.addtwo = addtwo

-- 简写形式不需要键入较多代码,也不使用本地变量
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

2017-09-24 14:46:34