以前非常羡慕 Ruby 中的 if __FILE__ == $0
手法,这样每当写完一个模块之后,就可以将一段测试代码放在前面的 if
块中。因为,那段代码只有当当前文件是启动文件才会被执行,而在程序正式运转的时候,不会耗费时间去运行测试代码(除开 if
测试的话)。之前,也没太多去考虑,今天突然发现在 Lua 之中也可以很方便的实现这个技巧。
因为, Lua 中加载模块一般是通过 require
函数(此处不考虑用 dofile dostring
这些非正常手法来编译、加载代码),而 require
函数会向模块文件传一个字符串参数,即模块名(默认为与无后缀的文件名相同)。而只要我们从控制台启动 Lua 程序的时候不传递任何其他参数,那么这里就能和刚才的情形区分开来。代码很简短:
<!-- lua -->
local mod = {}
-- init module
if select('#', ...) == 0 then
-- test module
end
return mod
当然,这只是非常简单的测试方法,如果需要更加健壮的测试框架,可以学习一下 Lua 安装程序中带的 luaunit。看了一下示例代码,貌似用法和 JUnit 3差不多,都是通过名称来寻找测试代码。