Erlangことはじめ
Erlangことはじめ
erlangを書くことになったので、初歩的なスクリプトの実行からテストの実行までを勉強。
ディレクトリ構成
myproject ├── ebin │ └── mymath.beam # コンパイル時に生成される ├── rebar ├── src │ └── mymath.erl └── test └── mymath_test.erl
rebarを持ってくる
Erlangのビルドツールであるrebarを持ってくる。コンパイルやテスト実行が簡単になる。
git clone https://github.com/rebar/rebar.git cd rebar make
コードを書く
フィボナッチ数、階乗を返す関数を定義したモジュールを書く。
src/mymath.erl
-module(mymath). -export([fib/1, fact/1]). fib(X) when X < 0 -> throw({error, 'Negative Number'}); fib(0) -> 1; fib(1) -> 1; fib(X) -> fib(X - 1) + fib(X - 2). fact(X) when X < 0 -> throw({error, 'Negative Number'}); fact(0) -> 0; fact(1) -> 1; fact(X) -> X * fact(X - 1).
試しに実行してみる。
$ rebar compile $ erl -pa ebin Erlang/OTP 17 [erts-6.4] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Eshell V6.4 (abort with ^G) 1> mymath:fib(3). 3 2> mymath:fact(3). 6
テストを書く
mymath.erlに対する単体テストを書く。 テストのファイルはmymath_test.erlになる。 テストでは*_testのメソッドが呼ばれる。
test/mymath_test.erl
-module(mymath_test). -include_lib("eunit/include/eunit.hrl"). fib_test() -> ?assertThrow({error, 'Negative Number'}, mymath:fib(-1)), ?assertEqual(1, mymath:fib(0)), ?assertEqual(1, mymath:fib(1)), ?assertEqual(2, mymath:fib(2)), ?assertEqual(3, mymath:fib(3)), ?assertEqual(5, mymath:fib(4)). fact_test() -> ?assertThrow({error, 'Negative Number'}, mymath:fact(-1)), ?assertEqual(0, mymath:fact(0)), ?assertEqual(1, mymath:fact(1)), ?assertEqual(2, mymath:fact(2)), ?assertEqual(6, mymath:fact(3)), ?assertEqual(24, mymath:fact(4)).
テストを実行する
テストを実行してテストが通るか確かめる。
$ ./rebar eunit ==> myproject (eunit) All 3 tests passed.