うたカモ技術ブログ

Lua

Luaプログラミング    モジュール動作確認用テストスクリプトの紹介

post: 

この記事では、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モジュールなどを 呼び出して処理結果をコンソールに表示させれば、ある程度の動作理解に繋がります。どんどん モジュールの呼び出し処理を追記していけば、ちょっとしたときに使えるツールになるはずです。

参考文献

ガジェット記事も読む

超格安な日本発のマイコンボード UIAPduinoの紹介

超格安な日本発のマイコンボード UIAPduinoの紹介

290円という価格が目を引く日本発のマイコンボードについて、主な仕様、安さの背景、向 く用途、定番ボードとの違いをまとめて紹介します。

スキャナーおすすめ5選 書類・写真・本のデジタル化に合う選び方

スキャナーおすすめ5選 書類・写真・本のデジタル化に合う選び方

紙の書類、写真、本をデータ化したい人向けに、ADF、フラットベッド、オーバーヘッド型の違いと5機種の選び方を整理します。

信頼性が売り! 大手・老舗PCメーカーが販売するミニPC 5選

信頼性が売り! 大手・老舗PCメーカーが販売するミニPC 5選

ASUS、マウスコンピューター、Lenovo、HP、MSIから、Amazonで購入できるミニPC5機種を紹介します。CPU、メモリ、ストレージ、拡張性、保証、無線LANの有無を用途別に整理します。

3Dプリンターの選び方! 造形方式や素材、確認ポイントを整理して紹介

3Dプリンターの選び方! 造形方式や素材、確認ポイントを整理して紹介

3Dプリンターの選び方を紹介します。FDMと光造形の違い、PLAやPETG、ABSなどの素材、造形サイズ、家庭で使うときの注意点、代表的なメーカーと製品を整理しています。

【1~5万円台】格安レーザー彫刻機おすすめ10選|入門モデルを比較

【1~5万円台】格安レーザー彫刻機おすすめ10選|入門モデルを比較

1~5万円台で購入しやすい格安レーザー彫刻機10機種を、レーザー光出力、作業領域、付属品、追加費用から比較します。

2026年版
  インスタントカメラ・チェキ系ガジェットの選び方
  おすすめ10選

2026年版 インスタントカメラ・チェキ系ガジェットの選び方 おすすめ10選

昔ながらのフィルム式インスタントカメラと、インスタントデ ジタルカメラ・ハイブリッド機の両方を対象に、チェキ系ガジェ ット10機種を用途別に紹介します。