Crystal標準specとspec2 libraryで書いたテストの比較

Crystal標準specとspec2 libraryで書いたテストの比較をします

## <i class="fa fa-code" style="font-size:1em;"></i> 対象コード
FizzBuzzです

```ruby
require "./sample_test/*"

module SampleTest
  class FizzBuzz
    def initialize(@limit : Int32)
    end

    def fizzbuzz
      ary = Array(String).new
      @limit.times {|i|
        i+=1
        ary << case
        when i%15==0 then "FizzBuzz"
        when i%5==0 then "Buzz"
        when i%3==0 then "Fizz"
        else i.to_s
        end
      }
      ary
    end
  end
end
```

## <i class="fa fa-flask" style="font-size:1em;"></i> spec
標準の spec によるテストです。
成功するテストと失敗するテストを1ケースずつ用意しています。

### <i class="fa fa-cube" style="font-size:1em;"></i> テストコード
```ruby
require "./spec_helper"

describe SampleTest do
  describe SampleTest::FizzBuzz do
    describe "fizzbuzz1" do
      it "valid" do
        actual = SampleTest::FizzBuzz.new(15).fizzbuzz
        actual.should eq(["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"])
      end

      it "invalid" do
        actual = SampleTest::FizzBuzz.new(16).fizzbuzz
        actual.should eq(["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "Fizz"])
      end
    end
  end
end
```

### <i class="fa fa-cube" style="font-size:1em;"></i> 実行結果

```bash
crystal spec
.F

Failures:

  1) SampleTest SampleTest::FizzBuzz fizzbuzz1 invalid
     Failure/Error: actual.should eq(["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "Fizz"])

       expected: ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "Fizz"]
            got: ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "16"]

     # ./spec/sample_test_spec.cr:13

Finished in 0.74 milliseconds
2 examples, 1 failures, 0 errors, 0 pending

Failed examples:

```

## <i class="fa fa-flask" style="font-size:1em;"></i> spec2
[spec2 library](https://github.com/waterlink/spec2.cr)によるテストです。
成功するテストと失敗するテストを1ケースずつ用意しています。

spec2 は spec に加えて

* let / subject の追加
* expect 記法
* before / after の追加

などがあります。

### <i class="fa fa-cube" style="font-size:1em;"></i> テストコード
```ruby
require "./spec_helper"

Spec2.describe SampleTestSpec2 do
  describe SampleTestSpec2::FizzBuzz do
    subject { SampleTestSpec2::FizzBuzz }
    let (base_array) {
      ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]
    }

    describe "fizzbuzz1" do
      it "valid" do
        actual = subject.new(15).fizzbuzz
        expect(base_array).to eq(actual)
      end

      it "invalid" do
        actual = subject.new(16).fizzbuzz
        base_array << "Fizz"
        expect(base_array).to eq(actual)
      end
    end
  end
end
```

### <i class="fa fa-code" style="font-size:1em;"></i> spec_helper
```ruby
require "spec"
require "spec2"
require "../src/sample_test_spec2"
```

### <i class="fa fa-cube" style="font-size:1em;"></i> 実行結果

```bash
$ crystal spec
.F

In example: SampleTestSpec2 SampleTestSpec2::FizzBuzz fizzbuzz1 invalid
  Failure: Expected to be equal:
    Expected:  ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "16"]
    Actual:    ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "Fizz"]
```

## <i class="fa fa-flask" style="font-size:1em;"></i> テスト関連ライブラリ備忘録
### <i class="fa fa-pencil-square" style="font-size:1em;"></i> power_assert
Crystal にも power_assert library があるのだが、 Crystal version 0.16.0 の変更によって
現在（2016/05/26）は動作しなくなっている。
version 0.15 系では動作します。

http://qiita.com/rosylilly/items/4c1e120ee9b82c2ed250
https://github.com/rosylilly/power_assert.cr