
我想為 ConTeXt 使用的 Lua 程式碼編寫一些單元測試,並想知道是否有其他人這樣做過,以及設定框架時可能需要什麼。
特別是 Lua 程式碼儲存在單獨的檔案中(例如numbering.lua
),這意味著測試運行程式(例如被抓) 可以將它們包含在require
.
可能值得注意(但可能並不重要),我使用Python的unittest作為測試運行程序瘋狂蟒蛇。
固有的問題是 LuaTeX 和 ConTeXt 定義的全域變數並不是 Lua 中自然定義的。如果沒有從相應的文件中匯入諸如context
和 之類的表,則texio
根本無法存取它們。 require
(這看起來是tex/texmf-context/tex/context/base/trac-log.lua
並且......誰知道, 分別)。
有人有做過ConTeXt + Lua的單元測試嗎?可能需要包含哪些 Lua 檔案才能取得變數?我希望在某個地方有一個入口點來處理大部分設置。
看起來.lua
相關文件通常會在其中,./tex/texmf-context/tex/context/base/
但我只是猜測,由於大約有 840 個.lua
文件,我將不勝感激任何關於從哪裡開始的指導。
答案1
繼 @Aditya 和 @phg 的精彩評論之後,我做了以下事情:
我使用非常酷的工具創建了一個測試套件月測試框架。設定起來很簡單,因為只需要這樣做require('lunatest')
,並且在 中有一組有用的範例test.lua
。
一旦我創建了自己的,my_tests.lua
我就用以下命令運行它:
context my_tests.lua --purgeall --batchmode --once
然後,我的 python 測試執行程式檢查上下文進程的回傳程式碼(失敗時傳回非零)。
context
經過一些嘗試後,我發現捕獲和texio
以及其他函數的輸出具有挑戰性。為了解決這個問題,我不再讓 ConTeXt 啟動 lua,而是使用如下存根的普通 lua:
local function stub(name)
local stubbed = {}
local calls = {}
local metatable = {
__call = function(meta, ...)
local call = {}
call.method = nil
call.args = arg
table.insert(calls, call)
end,
__index = function(meta, ...)
local method = arg[1]
return function(...)
local call = {}
call.method = method
call.args = arg
table.insert(calls, call)
end
end
}
stubbed._calls = calls
setmetatable(stubbed, metatable)
_G[name] = stubbed
end
function M.setup()
stub('context')
stub('texio')
end
每次測試前跑者M.setup
都會呼叫Where 。lunatest
結果是我現在可以測試 Lua 的調用,如下所示texio
(context
涉及更多但不是太多的設置):
lt = require('lunatest')
function suite.test_double_indent()
test_double_indent()
lt.assert_len(5, context._calls)
lt.assert_equal('\\startitemize\\sym{}\\startitemize\\sym{}',
context._calls[1].args[1])
lt.assert_equal('\n\\stopitemize\n\\stopitemize\n\\stopitemize',
context._calls[5].args[1])
end
最後,因為這個設定沒有什麼特別的(即不需要luatex
變數),所以很容易用python-lunatic
或其他解釋器橋調用,如果願意的話。