web-dev-qa-db-ja.com

ミニテスト/単体テストを整理するには?

いくつかのプロジェクトでRSpecを使用した後、ミニテスト/ユニットを実行します。私はこれまでのところ気に入っていますが、describe/contextブロックを使用してテスト/仕様を論理的な方法でグループ化することはできません。

Minitest/specがこの機能を提供することは知っていますが、そのminitest/unitがベアボーンRubyに少し近いと感じているのが好きです。

ミニテスト/ユニットの説明/コンテキストサポートを提供する宝石はありますか?または、minitest/unitにある整理されていない長いテストファイルをそのまま使用する必要がありますか?

51
dojosto

私は、RSpecから同じ質問に苦闘しているミニテストに来ている何人かの人々を知っています。彼らは、describe/contextブロックを使用してネストする機能を気に入っており、ミニテストを続行したいと考えています。いくつかの解決策があります:

  1. Minitestの仕様DSLを使用する:多少の違いはありますが、仕様DSLはrspec DSLの優れた部分のほとんど(すべて?)を提供します。大きな違いは、contextブロックがないことです。ただし、代わりにdescribeを簡単に使用でき、すべて期待どおりに機能します。
  2. ディレクトリとファイルを使用する:このオプションを使用します。仕様DSLを使用しているか、従来のxUnitスタイルを使用しているかに関係なく、300行のテストファイルをスクロールするのは嫌いです。無関係なテストをネストすることは役に立ちません。コードの理解に関する同じルールがテストに適用されます。だからそれを分割します。ディレクトリを作成し、その中にいくつかのファイルを配置します。

以下は、テストファイルの構成例です。

test/
     models/
            user/
                 authentication_test.rb
                 email_test.rb
                 reservation_test.rb
                 user_test.rb
                 username_test.rb

仕様DSLを使用しているか、xUnitスタイルを使用しているかにかかわらず、この構造を使用します。 spec DSLを使用するときは、記述ブロックでテストする対象を次のように指定します。

require "minitest_helper"

describe User, :authentications do

  before do
    # ...
44
blowmage

複数のクラスを1つのテストファイルにスローすることもできます。

module PizzaTest
  class Isolation < ActiveSupport::TestCase
    test "is awesome by default" do
      assert Pizza.new.awesome?
    end
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      pizzas('one-with-everything').awesome?
    end
  end
end

そしてテストクラスを入れ子にする:

class PizzaTest < ActiveSupport::TestCase
  test "is awesome by default" do
    assert Pizza.new.awesome?
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      assert pizzas('one-with-everything').awesome?
    end
  end
end
16

私はこの方法(ほんの少しだけ)を好みますが、従う方が簡単だと思います。

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < ConventionalNameTest
    # so much stuff...
  end
  class AnotherContextTest < ConventionalNameTest
    # and some more...
  end
11
kangkyu