🐛

Lua製Neovimプラグインのテストをデバッグする

2024/09/15に公開

Lua製Neovimプラグインのテスト実行時、インタラクティブにデバッグする方法を紹介する。

デバッグ実行する

以前の記事で書いたようなNeovimプラグインのテストをデバッグ実行する手順を示す。

https://zignar.net/2023/06/10/debugging-lua-in-neovim/
上記の記事ではより汎用性の高いnluaを使う方法が紹介されている。
やることはほぼ同じだが、ここではvustedを使う形にする。

セットアップ

以下の手順を行う。

local dap = require("dap")

local lldebugger_path = "/path/to/local-lua-debugger-vscode"
dap.adapters["local-lua"] = {
  type = "executable",
  command = "node",
  args = {
    vim.fs.joinpath(lldebugger_path, "extension/debugAdapter.js"),
  },
  enrich_config = function(config, on_config)
    if not config.extensionPath then
      local c = vim.deepcopy(config)
      c.extensionPath = lldebugger_path
      on_config(c)
      return
    end
    on_config(config)
  end,
}

-- 好きなようにマッピングやコマンドを定義する
vim.api.nvim_create_user_command("DebugVusted", function()
  dap.run({
    name = "Debug vusted",
    type = "local-lua",
    cwd = vim.fs.root(0, ".git") or vim.uv.cwd(),
    request = "launch",
    program = { command = "vusted" },
    args = { "${file}" },
  })
end, {})

📝 local-lua-debuggerはvusted側で実行される。
そのため、以下をテストファイルに足す必要はない。

if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
  require("lldebugger").start()
end

実行手順

セットアップができたら特別なことはない。
dap.nvimを利用して以下のようにデバッグ実行できる。

  • :lua require("dap").toggle_breakpoint()でテストファイルにブレークポイントを設定する
  • :DebugVustedでデバッグを開始する

テスト実行後のNeovimを操作する

デバッグ実行までは不要だが、テスト実行後のNeovimを操作して状態を確認したい場合がある。
つまり、下記の条件を満たす形でテストを実行したい。

  • 確認したいテストに絞って実行する
  • テスト終了後にプロセスを終了しない
  • テスト後のクリーンアップの処理を実行しない
  • ヘッドレスで実行しない

vustedを以下のように実行すると実現できる。

VUSTED_DISABLE_EXIT=1 VUSTED_DISABLE_CLEANUP=1 VUSTED_ARGS='-u NONE -i NONE' vusted --filter 'hoge plugin creates new tab' hoge_spec.lua
hoge_spec.lua
local helper = require("vusted.helper")

describe("hoge plugin", function()
  after_each(function()
    helper.cleanup()
    helper.cleanup_loaded_modules("hoge")
  end)

  it("creates new tab", function()
    require("hoge").open()
  end)
end)

状態、特に見た目を確認したい場合に便利。

Discussion