ラベル lua の投稿を表示しています。 すべての投稿を表示
ラベル lua の投稿を表示しています。 すべての投稿を表示

2016年1月7日木曜日

busted で Lua スクリプトのテストをやってみた

概要

busted は Lua スクリプトをテストするためのテストフレームワークです
インストールから簡単な使い方まで紹介したいと思います

環境

  • CentOS 6.7 64bit Final
  • Lua 5.1.4
  • LuaRocks 2.1.2
  • busted 2.0.rc11-0

busted のインストール

luarocks を使ってインストールできます
luarocks のインストールはこちらを参照してください

  • luarocks install busted

依存するライブラリが結構ありました

busted
2.0.rc11-0 (installed) - /usr/lib/luarocks/rocks
dkjson
2.5-2 (installed) - /usr/lib/luarocks/rocks
lua-term
0.3-1 (installed) - /usr/lib/luarocks/rocks
lua_cliargs
2.5-5 (installed) - /usr/lib/luarocks/rocks
luafilesystem
1.6.3-1 (installed) - /usr/lib/luarocks/rocks
luasocket
3.0rc1-2 (installed) - /usr/lib/luarocks/rocks
luassert
1.7.9-0 (installed) - /usr/lib/luarocks/rocks
mediator_lua
1.1.2-0 (installed) - /usr/lib/luarocks/rocks
penlight
1.3.2-2 (installed) - /usr/lib/luarocks/rocks
say
1.3-1 (installed) - /usr/lib/luarocks/rocks

サンプルテストコードの作成

今回は function を定義している別の Lua スクリプトを busted でテストしてみたいと思います

  • sample_function.lua
function sum(a, b)
  return a + b
end

とりあえず引数の値を足しあわせて返却する簡単なメソッドを定義しておきます
これをテストするテストコードを作成します

  • sample_busted.lua
require 'busted.runner'()

require("sample_function")

describe("sum method test", function()
  it("is three", function()
    local val = sum(1, 2)
    assert.are.equal(val, 3)
  end)
end)

describe("sum method test2", function()
  it("is occured error", function()
    local val = sum(1, 2)
    assert.are.equal(val, 4)
  end)

  it("is not three", function()
    local val = sum(1, 2)
    assert.are_not.equal(val, 4)
  end)
end)

テスト冒頭で require 'busted.runner'() することで busted のテストコードであることを明示します
次にテストしたい Lua スクリプトを require します

あとはテストを記載していきます
基本形は describe -> it -> assert でテストを記載していきます

describe はテストの説明を記載するためのメソッドで階層を持たせることもできます
describe 配下に it を定義します
具体的なテストコードは it 配下に記載します
1 つの describe 内に複数の it を記述することも可能です

実行してみる

では実行してみましょう
今回は作成した 2 つの Lua スクリプトは同一ディレクトリに存在することを想定しています

  • busted sample_busted.lua

結果は以下のようになると思います
2 つ目のテストはあえて失敗するテストにしています

●?●
2 successes / 1 failure / 0 errors / 0 pending : 0.000965 seconds

Failure → sample_busted.lua @ 13
sum method test2 is occured error
sample_busted.lua:15: Expected objects to be equal.
Passed in:
(number) 4
Expected:
(number) 3

サンプルの結果だと色はないですが、失敗か成功かを丸と色で表示してくれます
成功した場合は緑になります
失敗したテストは結果と期待値を表示してくれます
あとはテストにかかった時間を表示してくれます

参考サイト

2015年12月21日月曜日

CentOS で LuaRocks のインストールと簡単な使い方

概要

LuaRocks という Lua 言語用のパッケージ管理ツールがあります
CentOS 上でインストールして簡単に使ってみたので紹介します

環境

  • CentOS 6.7 64bit Final
  • Lua 5.1.4
  • LuaRocks 2.1.2

LuaRocks のインストール

Epel を使えるようにすれば yum コマンドでインストールすることができます
開発用の devel パッケージもインストールします

  • rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
  • yum -y install lua-devel
  • yum -y install luarocks

ライブラリのインストール

ここではサンプルとして暗号化ツールの luacrypto をインストールしてみます

  • luarocks install luacrypto

でインストール完了です
自分の環境では何も指定しない状態だと /usr/lib/luarocks/rocks/luacrypto/ にインストールされました

インストールしたライブラリが使えるか確認する

  • eval `luarocks path`
  • lua

でまずはライブラリを使えるようにします
あとは lua コマンドのインタラクティブモードで試していきます

> require "crypto"
> crypto.hmac.digest('sha256', "hoge", "fuga", false)
> digest = crypto.hmac.digest('sha256', "hoge", "fuga", false)
> print(digest)
4a68986307d6d29a8060f2e6a6394f29ddd8b4e5a0d9694c886bd400922c0841

こんな感じで使うことができます
require するときのパッケージ名が install 時のパッケージ名と違うのに注意が必要です
require 時のパッケージ名は luarocks show luacrypto で Modules という項目に書かれたパッケージ名を使えば OK です

Tips

  • パッケージが存在しないというエラーが出た

> require “crypto”
stdin:1: module ‘crypto’ not found:
no field package.preload[‘crypto’]
no file ‘./crypto.lua’
no file ‘/usr/share/lua/5.1/crypto.lua’
no file ‘/usr/share/lua/5.1/crypto/init.lua’
no file ‘/usr/lib64/lua/5.1/crypto.lua’
no file ‘/usr/lib64/lua/5.1/crypto/init.lua’
no file ‘./crypto.so’
no file ‘/usr/lib64/lua/5.1/crypto.so’
no file ‘/usr/lib64/lua/5.1/loadall.so’
stack traceback:
[C]: in function ‘require’
stdin:1: in main chunk
[C]: ?

インストールしたライブラリに対してパスが通っていないことがほとんどです
luarocks path で export したパスにインストールしたライブラリがあるか確認してください
ない場合はイントールしたパスを LUA_PATH と LUA_CPATH に設定してください

  • Nginx 上の Lua スクリプトで使いたい場合

Lua 上でパスを通せば OK です
以下をライブラリを使いたい Lua スクリプトの先頭に記載してください

local p = "/usr/lib/luarocks/rocks/"
local m_package_path = package.path
package.path = string.format("%s?.lua;%s?/init.lua;%s?/init.lua;%s", p, p, p3, p3, m_package_path)