はじめに
今回の記事は ソフトウェアテストもくもく会in福岡 #1 で実践した内容になります。
最近何かと話題の Elixir(エリクサー) を触ってみたかったこと、Dockerに親しんでいきたいと思っていたことから今回の課題を選択しました。
Elixir入れたついでにフレームワークのPhoenixもついてきてます。
やること
- ローカルにDocker for Macをインストール
- Elixirのコンテナを作成する
- Elixirに触れてみる
- ElixirでTDDをやってみる
ローカルにDocker for Macをインストール
DockerをMacにインストールする の記事を参考にさせていただきました。
基本的に悩むことはないと思います。
インストール後は念のため、下記コマンドを実行してみる。
docker version
docker-compose version
Elixirのコンテナを作成する
ワークディレクトリを作成する
適当なところにワークディレクトリを作成しておきます。
私は構成を下記の通りにしました。
elixir
|
+-- Dockerfile
| * コンテナの構成を記述したファイル。
+-- docker-compose.yml
| * サービスの構成などを記述したファイル。
| * 更に.envなどとして細分化が可能。
`-- docker/elixir
* elixirのソースコードを管理するディレクトリ。
以降の処理
これ以降の作業は こちらの記事 通りに進めさせていただきました。
Elixirに触れてみる
ElixirというかPhoenixというか。
とりあえずコマンドが分からんでは話にならないので、よく使いそうなコマンドを調べてみました。
なお、今回はDocker上で起動しているため、全て docker-compose run --rm web
を頭につける必要があります。
まとめると言ったな、スマンありゃウソだった
ElixirでTDD!
TDDのお題は有名なFizzBuzzで行こうかと。
ディレクトリ構造
lib
+-- fizzbuzz.ex
| * Fizzbuzzモジュール
`-- test
|
`-- fizzbuzz_test.ex
* テストモジュール
まずは単体でテストモジュールをテストする
defmodule FizzbuzzTest do
use ExUnit.Case
test "入力値をそのまま返す" do
assert 1 == 2
end
end
# test {path} とすることで特定のテストだけに絞り込める
docker-compose run --rm web mix test test/fizzbuzz_test.ex
1) test 入力値をそのまま返す (FizzbuzzTest)
test/fizzbuzz_test.ex:4
Assertion with == failed
code: assert 1 == 2
left: 1
right: 2
stacktrace:
test/fizzbuzz_test.ex:6: (test)
Finished in 0.1 seconds
1 test, 1 failure
はい、当然エラーになりますね。
ここで 1 == 1
などとして、グリーンで通してみましょう。
.
Finished in 0.2 seconds
1 test, 0 failures
徐々にテストを実装していく
…ぶっちゃけここからは 他の方の記事 通りに実装しただけなので(と言うかタイムアップで)、最初のユニットテストだけご紹介します。
defmodule FizzbuzzTest do
use ExUnit.Case
test "入力値をそのまま返す" do
assert Fizzbuzz.fizzbuzz(1, 2) == [1, 2]
end
end
defmodule Fizzbuzz do
# 受け渡された値をそのまま返す
def fizzbuzz(from, to) do
from..to |> Enum.map(&(fizzbuzz/1))
end
end
終わりに
Laravelなんかだと、最初に use
とかしてどのモジュールをテストしているのかひと目で分かるんだけど、Elixir(というかPhoenix?)はそういった記述がなくてパッと見どこをテストしているのか分からなくなりました。
まあこの辺は慣れだと思います。
あとやっぱり懸念はしていたんですが、今やってるのが Elixir
側の機能なのか、 Phoenix
側の機能なのかで混乱してる感じが否めない。
コマンド一発でテーブル・ビュー・コントローラー・テストなどがまとめて生成できるのにはびっくりした反面、どうなってんだか理解するのに時間がかかりそうです。
とは言え新しい言語ということもあり、楽しくやれたので今後も続けていきたいと思います。