Luaプログラミング モジュール動作確認用テストスクリプトの紹介
この記事では、Luaモジュールの動作確認用として個人的に良く使っているテストスクリプトのテンプレートを掲載します。 自分以外に使う人はいるのか?もっと良い方法があるんじゃないか?と思いますが、個人的にパッとコピペして使う用で掲載することにしました。
ここでは、簡単な処理を実行するmod.luaと呼ばれるLuaモジュールを例にします。
このmod.luaをテストスクリプト経由で呼び出すことで、入力に対する出力結果を確認します。
それでは、行ってみます。
※この記事は以下の環境で実施した結果を元に作成しています。
- #実行環境OS
- ubuntu 22.04 LTS 64bit
- #Lua
- Ver 5.4.4
動作確認対象のLuaモジュール例(mod.lua)
例として今回、動作確認をするLuaモジュールは次のmod.luaです。
関数は「hello」とコンソールに表示するmod.greetと入力値xyの加算結果を返すmod.addの2つです。
--mod.lua local mod = {} --helloと表示する mod.greet = function () print("hello") end --xとyの加算結果を返す mod.add = function (x, y) return x + y end return mod
次節では、このモジュールの各関数をテストするスクリプトを掲載します。
テストスクリプト
テストスクリプトは2つのLuaスクリプトで構成されます。
まず、1つ目のスクリプトは対象モジュールを呼び出すための処理が記述されたものです。
この記事ではmod.luaの動作確認をしたいので、testmod.luaと呼ばれるスクリプトを用意し、その中にmod.luaを
呼び出すためのテスト関数と引数情報を管理しています。
--testmod.lua --modモジュールのテスト関数 function test_greet() local mod = require("mod") mod.greet() end function test_add(args) local mod = require("mod") local x = args[1].value local y = args[2].value local result = mod.add(x, y) return result end --modモジュールをテスト実行するために必要な情報を呼び出し元に提供します function get_mod_list() local test_list = { { title = 'mod.greet', --テスト対象の関数名 desc = 'helloと表示します。', --処理についての説明(任意) func = test_greet --テスト関数の指定 }, { title = 'mod.add', desc = 'XとYの値を加算します。', --mod.addは引数が2つ必要なので、ここで引数用テーブルを記述しています。 args = { { desc = 'xの値 :', --入力時の説明文 value = nil }, { desc = 'yの値 :', value = nil }, }, func = test_add }, } return test_list end
テスト関数は何に対するテストか明確になるように、確認対象の関数名の先頭にプレフィックス「test_」を付けて命名しています。 get_mod_listはmod.luaの関数呼び出しに必要な情報をリストアップしている関数です。メイン処理によって実行されるとテスト関数情報をテーブルとして提供します。
2つ目のスクリプトは、メイン処理部のtest.luaです。
テストスクリプトのエントリポイントとして動作し、ユーザーの入力を受付けて指定モジュールをテスト実行します。
今回の場合、mod.luaのテスト一覧はtestmod.luaのget_mod_listで取得できます。
これによって得られた情報を基にテスト関数を実行します。
--test.lua require("testmod") while true do local list = nil print("[module list]") print("[1]...mod.lua") --テストしたいモジュール番号を選択します io.write("\nselect module no:") local test = io.read() if test == "1" then list = get_mod_list() --elseif test == '2' then 新たにテストしたいモジュールが増えたらリストをここに追加します -- list = get_xxx_list() else break end print("\nfunction list") for idx, val in ipairs(list) do print("["..idx.."]..."..val.title) end --テスト対象の関数番号を選択します io.write("\nselect function no:") local select = io.read() select = tonumber(select) local target_test = list[select] local args = target_test.args if not target_test then break end print(target_test.desc) --テスト対象の関数説明を表示します if args then for i = 1, #args do io.write(args[i].desc) args[i].value = io.read() --テスト対象関数の引数を入力します end end --実行結果を表示します print("\n[Result]----------------------------------------------") io.write(target_test.title..'(') if args then for i = 1, #args do io.write(args[i].value) if args[i+1] then io.write(', ') end end end print(')\n') local result = target_test.func(args) if result then print(result) end print("------------------------------------------------------\n") io.flush() end print("terminate")
実行例
コンソール上のユーザー指定によって、テスト対象モジュールの関数を実行することができます。
関数に引数が必要であれば、ユーザーはコンソールから引数の値を入力することができます。
実行結果はコンソールに表示されます。
kamo@kamo:~$ lua test.lua [module list] [1]...mod.lua select module no:1 function list [1]...mod.greet [2]...mod.add select function no:1 helloと表示します。 [Result]---------------------------------------------- mod.greet() hello ------------------------------------------------------ [module list] [1]...mod.lua select module no:1 function list [1]...mod.greet [2]...mod.add select function no:2 XとYの値を加算します。 xの値 :1 yの値 :2 [Result]---------------------------------------------- mod.add(1, 2) 3 ------------------------------------------------------ [module list] [1]...mod.lua select module no: terminate
このテストスクリプトからCGIプログラムが内部実行するLuaモジュールなどを 呼び出して処理結果をコンソールに表示させれば、ある程度の動作理解に繋がります。どんどん モジュールの呼び出し処理を追記していけば、ちょっとしたときに使えるツールになるはずです。
参考文献
- The Programming Language Lua: https://www.lua.org/