LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

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

対象コード

FizzBuzzです

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

spec

標準の spec によるテストです。
成功するテストと失敗するテストを1ケースずつ用意しています。

テストコード

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

実行結果

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:

spec2

spec2 libraryによるテストです。
成功するテストと失敗するテストを1ケースずつ用意しています。

spec2 は spec に加えて

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

などがあります。

テストコード

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

spec_helper

require "spec"
require "spec2"
require "../src/sample_test_spec2"

実行結果

$ 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"]

テスト関連ライブラリ備忘録

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

1
1
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
1
1