スポンサーリンク

2015年7月4日

[Elixir]ElixirでもBDDがしたい!!

目的

WindowsにElixirライブラリのESpecを導入する。

実行環境

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4
ESpec: v0.6.3

始める前に

espec_phoenixが動かなかったお!
でも、ElixirでもBDDがしたいんだお!!
ならESpecを使えばいいんだお!!!!
うざくてすいません・・・
(知り合いが隣でスライド作成にやる夫を入れてたせいだ)
実際の所、「espec_phoenixを使う必要性があるのか?」と考えてみました。
やりたいことはElixir(可能ならPhoenix)でBDDがしたいわけです。
espec_phoenixの元になっているのがESpecですね。
ならESpecでいいんじゃないかな~っと思うわけです。
別にDBが必要なら自分でテスト環境のDBを用意すればいいだけですし・・・
最悪、junit+dbunitみたいな感じで、
db_ESpecのようなものを作成してしまえばいいんじゃないかな~っと思うわけです。
(言い訳はこれくらいで大丈夫かな)
では、ESpecを導入して、
楽しい楽しいBDDをやりましょう~!!
今回のプロジェクト生成。
>cd プロジェクト生成ディレクトリ
>mix new espec_sample
>cd espec_sample
>mix test
以降、この記事中でプロジェクトと言えば、
espec_sampleを指し示すものとする。

目次

  1. ESpecって何だ?
  2. ESpecを使用する準備をしよう
  3. ElixirでもBDDがしたい!!

1. ESpecって何だ?

ESpecって何だろうか?
READMEに書いてあります。
ESpecは、Elixirで作られたBDD Test-Frameworkです。
(ESpecはRSpecの影響を受けています)
まぁ、RSpec(Ruby)のElixir版って思っておkだと思います。
さて、BDDって何だろうか?
恥ずかしながら、BDDと言うものをこの間まで知らなかった次第です。
なので、この記事で少しBDDの知識を取り得れておきます。
良い記事を見つけました。
(この記事を見れば書く必要がない気がする・・・)
数行でまとめる程度でいっか。
BDD(=振る舞い駆動開発)とは、TDDから派生したテスト手法の一種です。
テストは「振る舞い」の記述に特化している。
以上!
後は以下のリンクを参考にして下さい。
参考: テスト駆動開発/振る舞い駆動開発を始めるための基礎知識 (1/3)

2. 使用する準備をしよう

mix.exsに以下の記述を追加する。
defp deps do
  ...
  {:espec, "~> 0.6.3", only: :test},
  ...
end
依存関係の解決します。
>mix deps.get
...
初期化処理をします。
変数を設定しないといけないです。
(以前、痛い目を見たから警戒する・・・)
>set MIX_ENV=test

>mix espec.init
* creating spec
* creating spec/spec_helper.exs
* creating spec/example_spec.exs
mix.exsのproject部分に以下の行を追加して下さい。
追加行: preferred_cli_env: [espec: :test]
def project do
  [app: :espec_sample,
   version: "0.0.1",
   elixir: "~> 1.0",
   build_embedded: Mix.env == :prod,
   start_permanent: Mix.env == :prod,
   deps: deps,
   preferred_cli_env: [espec: :test]]
end
最初のspecテストを実行してみます。
(生成されたサンプルのテストしかないですけどね・・・)
>mix espec
Compiled lib/espec_sample.ex
Generated espec_sample app
 [32m. [0m [32m. [0m [33m* [0m [32m. [0m [33m* [0m

        1) ExampleSpec ExampleSpec xcontext skips examples. And xit also skips
         [36mc:.../espec_sample/spec/example_spec.exs:34 [0m
         [33mTemporarily skipped with: `xit`. [0m

        2) ExampleSpec ExampleSpec There are so many features to test!
         [36mc:.../espec_sample/spec/example_spec.exs:39 [0m
         [33mPending with message: There are so many features to test!. [0m

         [33m5 examples, 0 failures, 2 pending [0m

         [33mFinished in 0.16 seconds (0.14s on load, 0.01s on specs) [0m
文字化けしてますけど大丈夫そうですね。
(failuresが2つ出てますがexampleだしいいか・・・
後でファイル消しますし、exampleだから失敗する例でも書いているのでしょう。

3. ElixirでもBDDがしたい!!

specのテスト対象にしたいソースコードについて先に書いておこう。
引用:
Place your _spec.exs files into spec folder. use ESpec in the ‘spec module’.
翻訳:
specフォルダ(ディレクトリ)へ自分の”_spec.exs”ファイルを置きます。「spec module」を使ってESpecを利用して下さい。
と言うことだそうです。
specのディレクトリ配下にsample_spec.exsのように配置しろってことですね。
ではサンプルを作成してテストしましょう。
READMEにあったサンプルは以下です。
ファイル名: spec/some_spec.exs
defmodule SomeSpec do
  use ESpec
  it do: expect(1+1).to eq(2)
  it do: (1..3) |> should have 2
end
記法がさっぱり分かりません><
まぁいいです。追々、学んでいきましょう!
実行してテストが流れるか確認してみましょう。
>mix espec
 [32m. [0m [32m. [0m [33m* [0m [32m. [0m [33m* [0m

        1) ExampleSpec ExampleSpec xcontext skips examples. And xit also skips
         [36mc:.../espec_sample/spec/example_spec.exs:34 [0m
         [33mTemporarily skipped with: `xit`. [0m

        2) ExampleSpec ExampleSpec There are so many features to test!
         [36mc:.../espec_sample/spec/example_spec.exs:39 [0m
         [33mPending with message: There are so many features to test!. [0m

         [33m5 examples, 0 failures, 2 pending [0m

         [33mFinished in 0.16 seconds (0.14s on load, 0.01s on specs) [0m
先ほどと変わりません。実行できたのでしょうか?
先ほどのfailures以外は出てないので大丈夫だと思いますが・・・
分かりやすく見るために個別実行してみます。
>mix espec spec/some_spec.exs
 [32m. [0m [32m. [0m

         [32m2 examples, 0 failures [0m

         [32mFinished in 0.09 seconds (0.08s on load, 0.01s on specs) [0m
個別でテストをしてfailuresが出てないので問題ないと判断します。
ちなみにhelpが見たければ以下のコマンドを実行して下さい。
※ 但し、変数は設定しておかなければいけません。
>set MIX_ENV=test (設定しているなら不要)

>mix help espec
機能的なところはREADMEに一杯あります。
とりあえず、こんなところで終了します。
もっと詳しく知りたい人はREADMEを読んで下さい。

管理人の独り言~

ESpec_Phoenixでやらかした感じがする・・・
引用:
You must require this helper in your spec_helper.exs.
Also you need restart Ecto transaction before each example.
So spec_helper.exs should look like:
DBが残って導入失敗したよって書いてたけど、
READMEを見直したら上記の文言中にneed restart Ectoとある・・・
簡単に和訳すると、
「各自で動かす時にEctoを再起動する必要があるぜ!!」的なことが書かれている。
ってことは・・・自分でテストを流す前に、
手動でテスト用のDBを”ecto.drop(適切な処理なのか不明)”
させるようなことをやらなければならないのでは?
後で試してみよう・・・
やってしまった気がする・・・

参考文献

人気の投稿