2017-09-22 54 views
3

我想从单个文件Lua脚本中测试函数,比如script.lua。该脚本看起来像如下:如何测试单个文件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 

比方说,我不想从脚本文件中的函数分成单独的模块文件(这可能会使事情变得更容易)。如何定义script.lua文件中的script.lua或单独的test_script.lua文件中定义的测试功能(最好是luaunit,因为容易集成,但其他工具也可以)?

+0

这取决于_how_你定义的东西lot_。你使用'local'(这会让事情变得更难)还是你使用“local''ENV'ironments”(更容易)?你的代码结构如何?请添加一个如何定义函数的小代码示例(不一定是实际的代码,只是与您定义的东西相匹配的虚函数)。目前,没有足够的信息来给出有意义的信息答案。 – nobody

+0

该脚本非常类似于https://wiki.wireshark.org/Lua/Dissectors#postdissectors中的解析程序,在文件末尾定义了用于协议'dissector'函数的'local'函数。但我不坚持这种结构。 – thinwybk

回答

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实现accoring到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 

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

2

简单的回答:你不能!

几年前,我已经向Lua团队询问了这个问题,因为没有明显的方式让脚本知道它是否是运行或包含的主脚本(例如,'require')。

在可预见的将来,似乎没有兴趣添加这样的功能!

+0

好的。那么在单独的'test_script.lua'中执行测试呢? – thinwybk

+0

我不确定我是否理解。那个怎么样?只需“要求”文件即可从测试文件中进行测试,并根据需要调用其公共功能。 – tonypdmtr

+0

在下面的例子中,除了单元测试之外,还会执行脚本主要功能。我不希望脚本主要功能在单元测试执行期间执行。 – thinwybk