这是模块:ScribuntoUnit的文档页面
内容协议 本文采取的内容协议为CC BY-SA 4.0
|
来自EN Wikipedia
|
此模块为其他 Lua 模块提供单元测试。要测试一个模块,需创建独立的测试模块,通常放在 Module:模块名/testcases。
测试模块结构
local myModule = require('Module:MyModule') -- 待测模块
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()
然后向 suite 对象添加测试函数。任何以 test 开头的函数都会被识别为测试。
function suite:testSomeCall()
self:assertEquals('期望值', myModule.someCall(123))
self:assertEquals('另一个期望值', myModule.someCall(456))
end
最后返回 suite 对象:
return suite
运行测试
- 调试控制台:
require('Module:MyModule/testcases').run() - Wiki 页面:
{{#invoke:MyModule/testcases|run}}(生成完整表格) - 紧凑模式:
{{#invoke:MyModule/testcases|run|displayMode=short}}
断言方法
所有方法的最后一个参数 message 是失败时显示的自定义信息,可选。
assertEquals
self:assertEquals(expected, actual, message, level)
断言两值相等。若均为数字,则使用 delta=1e-8 的浮点容差比较。
self:assertEquals(4, calculator.add(2, 2))
assertNotEquals
self:assertNotEquals(expected, actual, message, level)
断言两值不等。
assertTrue / assertFalse
self:assertTrue(expression, message, level)
self:assertFalse(expression, message, level)
断言表达式为 true 或 false(Lua 中仅 false 和 nil 为 false)。
assertStringContains
self:assertStringContains(pattern, s, plain, message, level)
断言 pattern 出现于字符串 s 中。若 plain=true 则为字面匹配,否则为 ustring 模式匹配。
self:assertStringContains("foo", "foobar") -- 通过
self:assertStringContains(".oo", "foobar") -- 通过:匹配 "foo"
self:assertStringContains(".oo", "foobar", true) -- 失败:. 按字面匹配
assertNotStringContains
self:assertNotStringContains(pattern, s, plain, message, level)
assertStringContains 的反向版本。
assertDeepEquals
self:assertDeepEquals(expected, actual, message, level)
递归比较表,尊重 __eq 元方法。
self:assertDeepEquals(table1, table2)
assertWithinDelta
self:assertWithinDelta(expected, actual, delta, message, level)
断言两浮点数之差在 delta 范围内。Lua 使用双精度浮点,0.3 - 0.2 == 0.1 实际为 false(浮点误差),应使用此方法。
self:assertWithinDelta(0.1, calculator.subtract(0.3, 0.2), 1e-10)
assertNotWithinDelta
self:assertNotWithinDelta(expected, actual, delta, message, level)
assertTemplateEquals
self:assertTemplateEquals(expected, template, args, message)
断言模板调用结果。注意 <pre>、<nowiki> 等标签会被转为 strip markers,导致比较失败。
self:assertTemplateEquals(4, 'add', {2, 2}) -- 等价于 {{add|2|2}} == 4
assertResultEquals
self:assertResultEquals(expected, text, message)
断言任意 wikitext 展开结果。
self:assertResultEquals(4, '{{#invoke:Calculator|add|2|2}}')
assertSameResult
self:assertSameResult(text1, text2, message)
断言两段 wikitext 展开结果相同。可用于验证模块与模板行为一致。
self:assertSameResult('{{add|2|2}}', '{{#invoke:Calculator|add|2|2}}')
assertThrows
self:assertThrows(fn, expectedMessage, message, ...)
断言函数抛出异常。可选检查异常消息是否匹配。
self:assertThrows(function() myModule.badCall() end, "参数错误")
assertDoesNotThrow
self:assertDoesNotThrow(fn, message, ...)
断言函数不抛出异常。
fail
self:fail(message)
无条件标记测试失败。
