LoginSignup
30
28

More than 5 years have passed since last update.

[Docker + Elixir]Docker上でElixir環境を作ってTDDしてみた話

Last updated at Posted at 2018-08-18

はじめに

今回の記事は ソフトウェアテストもくもく会in福岡 #1 で実践した内容になります。
最近何かと話題の Elixir(エリクサー) を触ってみたかったこと、Dockerに親しんでいきたいと思っていたことから今回の課題を選択しました。
Elixir入れたついでにフレームワークのPhoenixもついてきてます。

やること

  • ローカルにDocker for Macをインストール
  • Elixirのコンテナを作成する
  • Elixirに触れてみる
  • ElixirでTDDをやってみる

ローカルにDocker for Macをインストール

DockerをMacにインストールする の記事を参考にさせていただきました。
基本的に悩むことはないと思います。
インストール後は念のため、下記コマンドを実行してみる。

console
docker version
docker-compose version

Elixirのコンテナを作成する

ワークディレクトリを作成する

適当なところにワークディレクトリを作成しておきます。
私は構成を下記の通りにしました。

directory
elixir
|
+-- Dockerfile
|     * コンテナの構成を記述したファイル。
+-- docker-compose.yml
|     * サービスの構成などを記述したファイル。
|     * 更に.envなどとして細分化が可能。
`-- docker/elixir
      * elixirのソースコードを管理するディレクトリ。

以降の処理

これ以降の作業は こちらの記事 通りに進めさせていただきました。

Elixirに触れてみる

ElixirというかPhoenixというか。
とりあえずコマンドが分からんでは話にならないので、よく使いそうなコマンドを調べてみました。
なお、今回はDocker上で起動しているため、全て docker-compose run --rm web を頭につける必要があります。

まとめると言ったな、スマンありゃウソだった

ElixirでTDD!

TDDのお題は有名なFizzBuzzで行こうかと。

ディレクトリ構造

elixir/docker/elixir
lib
+-- fizzbuzz.ex
|     * Fizzbuzzモジュール
`-- test
    |
    `-- fizzbuzz_test.ex
          * テストモジュール

 まずは単体でテストモジュールをテストする

elixir/docker/elixir/test/fizzbuzz_test.ex
defmodule FizzbuzzTest do
    use ExUnit.Case

    test "入力値をそのまま返す" do
        assert 1 == 2
    end

end
console
# test {path} とすることで特定のテストだけに絞り込める
docker-compose run --rm web mix test test/fizzbuzz_test.ex
result
  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 などとして、グリーンで通してみましょう。

result
.

Finished in 0.2 seconds
1 test, 0 failures

徐々にテストを実装していく

…ぶっちゃけここからは 他の方の記事 通りに実装しただけなので(と言うかタイムアップで)、最初のユニットテストだけご紹介します。

elixir/docker/elixir/lib/fizzbuzz_text.ex
defmodule FizzbuzzTest do
    use ExUnit.Case

    test "入力値をそのまま返す" do
        assert Fizzbuzz.fizzbuzz(1, 2) == [1, 2]
    end

end
elixir/docker/elixir/lib/fizzbuzz.ex
defmodule Fizzbuzz do

  # 受け渡された値をそのまま返す
  def fizzbuzz(from, to) do
    from..to |> Enum.map(&(fizzbuzz/1))
  end

end

終わりに

Laravelなんかだと、最初に use とかしてどのモジュールをテストしているのかひと目で分かるんだけど、Elixir(というかPhoenix?)はそういった記述がなくてパッと見どこをテストしているのか分からなくなりました。
まあこの辺は慣れだと思います。
あとやっぱり懸念はしていたんですが、今やってるのが Elixir 側の機能なのか、 Phoenix 側の機能なのかで混乱してる感じが否めない。
コマンド一発でテーブル・ビュー・コントローラー・テストなどがまとめて生成できるのにはびっくりした反面、どうなってんだか理解するのに時間がかかりそうです。

とは言え新しい言語ということもあり、楽しくやれたので今後も続けていきたいと思います。

30
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
28