この記事の概要
busted を使ったユニットテストを試したメモです。
まだ、使いこなせていないのですが、
簡易に実行する程度までには至ったため一旦書き留めておきます。
Olivine-Labsによって公開されているLuaのユニットテストツールです。
MITライセンスです。
ドキュメント:
ソース:
実行環境のつくりかた
ドキュメントには、
busted works with lua >= 5.1, moonscript, terra, and LuaJIT >= 2.0.0.
と記載されていました。
Lua、LuaJITの実行環境を整えたのちに、
Ubuntu18.04、CentOS7の場合は下記でセットアップできました。
(環境によっては、途中で足りないパッケージがあり、コンパイル失敗したので、適宜インストールしました。)
【Ubuntuの場合】
# apt-get install -y luarocks
# luarocks install busted
# luarocks install luacov
【CentOS7の場合】
# yum install -y luarocks
# luarocks install busted
# luarocks install luacov
簡易なユニットテストを用意する
今回は、テスト対象の関数のあるファイルと、別にテストシナリオだけを書いたファイルを分けてみました。
-- テスト対象の関数のあるファイル
-- /etc/nginx/lua/process.lua
-- テスト対象の関数 その1
function is_match(a, b)
if a == b then
return true
end
return false
end
-- テスト対象の関数 その2
function sum(a, b)
return a + b
end
-- ユニットテスト
-- ~/unit_test/test.lua
-- 今回はdofileで関数を読み込みました
dofile("/etc/nginx/lua/process.lua")
-- describeでブロックをネストして、グループ毎に実行できるようにハッシュタグ(#)付けします
describe("all test", function()
-- #match とタグ付けし、このブロックのみの実行が -t match でできるようにします
describe("is_match test #match", function()
-- it内に1つのシナリオをかきます
it("is_match 1 & 1 => true", function()
-- is_true(判定) で判定の内容がtrueだとテスト成功
assert.is_true(is_match(1,1) == true)
end)
-- わざと失敗させてみます
it("is_match 1 & 2 => true(false)", function()
assert.is_true(is_match(1,2) == true)
end)
end)
-- #sum とタグ付けし、このブロックのみの実行が -t sum でできるようにします
describe("sum test #sum", function()
it("sum 1 & 2 => false", function()
assert.is_true(sum(1,2) == 3)
end)
it("sum 10 & 20 => false", function()
assert.is_true(sum(10,20) == 30)
end)
end)
end)
テストを実行してみる
sumタグを実行
# busted test.lua -t sum
●●
2 successes / 0 failures / 0 errors / 0 pending : 0.00159 seconds
⇒ 2シナリオとも sucess になりました。
matchタグ実行
# busted test.lua -t match
●?
1 success / 1 failure / 0 errors / 0 pending : 0.001331 seconds
Failure → test.lua @ 19
all test is_match test #match is_match 1 & 2 => true(false)
test.lua:20: Expected objects to be the same.
Passed in:
(boolean) false
Expected:
(boolean) true
⇒ どのブロックのどのシナリオで失敗しているか確認できます。
全件実行
# busted test.lua
●?●●
3 successes / 1 failure / 0 errors / 0 pending : 0.001995 seconds
Failure → test.lua @ 19
all test is_match test #match is_match 1 & 2 => true(false)
test.lua:20: Expected objects to be the same.
Passed in:
(boolean) false
Expected:
(boolean) true
⇒ 同上。
簡単な使い方のメモでした。
判定方法やエラー出力など柔軟にできるようですので、
使いこなせるようになった際には、別途紹介したいと思います。