在 ConTeXt 中為 Lua 編寫單元測試

在 ConTeXt 中為 Lua 編寫單元測試

我想為 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 的調用,如下所示texiocontext涉及更多但不是太多的設置):

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或其他解釋器橋調用,如果願意的話。

相關內容