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)).

Eunit には他にもテスト用のメソッドがたくさんある。

テストを実行する

テストを実行してテストが通るか確かめる。

$ ./rebar eunit
==> myproject (eunit)
  All 3 tests passed.

参考