Factory_bot: 工場でランダムな特性を適用する

作成日 2014年09月26日  ·  4コメント  ·  ソース: thoughtbot/factory_bot

やあ、
私は現在いくつかの工場で働いており、それぞれに静的な値とランダム化された値を持たせたいと思っています。 すでに定義されている特性を使用するには、次のようにします。

FactoryGirl.define do

  factory :currency do
    eur

    trait :usd do
      name 'US-Dollar'
      symbol '$'
    end

    trait :eur do
      name 'Euro'
      symbol '€'
    end

    # what would be really nice..
    trait :random, traits: [
        [:eur, :usd].sample
    ]

  end
end

この機能を将来のリリースで追加できますか、それともすでにこれを行う可能性はありますか?

最も参考になるコメント

@joshuaclayton私はファズテストツール

テストでランダム化されたデータを使用しないと、確証バイアスが発生します。すでに成功または失敗すると予想されるケースのみをテストしたくなるため、テストはあまり役に立ちません。 入力と出力の間に明確に定義された決定論的関係を持つランダム化されたデータは、あなたを正直に保ちます。


私がテストを書く方法の例:

# models/user.rb
class User < ActiveRecord::Base
  def uppercase_name
    name.upcase
  end
end
# factories/user.rb
FactoryGirl.define do
  factory :user
    name { Faker::Name.name }
  end
end
# spec/models/user_spec.rb
describe User, '#uppercase_name' do
  it "returns the user's name in uppercase"
    user = FactoryGirl.create(:user)
    expect(user.uppercase_name).to be == user.name.upcase
  end
end

したがって、入力と出力の関係は完全に決定論的です。「John」=>「JOHN」、「Billy Bob」=>「BILLYBOB」などです。 しかし、RSpecコードはより意図を明らかにするものであり(ハードコードされた結果ではなく、関係を記述する必要があるため)、すべてのケースに合格しない実装を記述してアプリケーションを壊すことはできません。

全てのコメント4件

@loybert技術的には、工場を建設するときにこれを行うことができます: create(:currency, [:eur, :usd].sample)

とはいえ、アクセプタンスまたはユニットテストスイートでランダムデータを使用しないことを強くお勧めします。テストスイートにランダムな値を導入すると、壁に頭をぶつけてしまうだけであることが何度もあります。

?? 私はテストスイートでランダムなデータを日常的に使用しています。 私はそれが問題を引き起こすことをまったく発見していません、そして時々それは私が考慮しなかったケースを指摘します。 固定データはテスト臭だと思います。

@marnenテスト次第だと思います。 タランチュラのようなファジングツールを使用して、アプリケーションの領域を積極的に破壊しようとすることは間違いなくありがたいです。

ただし、アプリケーションをファズするように明示的に記述されていないテストでランダムデータが発生すると、非決定性が導入されることがよくあります。これについては、MartinFowlerがます

非決定論的テストの問題は、テストが赤くなったときに、それがバグによるものなのか、非決定論的動作の一部によるものなのかわからないことです。 通常、これらのテストでは、非決定論的な失敗が比較的一般的であるため、これらのテストが赤くなると肩をすくめることになります。 回帰テストの失敗を無視し始めると、そのテストは役に立たないので、破棄したほうがよいでしょう。

結果が同じであるオブジェクトのインターフェースをテストしている場合、Rubyとテストフレームワークを使用して複数のケースの決定論的テストを生成するため、テストが失敗した場合、どこで、どのように、そして失敗したときにオブジェクトが存在することを示します。 マーティン・ファウラーの指摘によれば、それよりも少ない情報は、_何か_が壊れていること以外に実用的なフィードバックを提供しないため、役に立たない。

@joshuaclayton私はファズテストツール

テストでランダム化されたデータを使用しないと、確証バイアスが発生します。すでに成功または失敗すると予想されるケースのみをテストしたくなるため、テストはあまり役に立ちません。 入力と出力の間に明確に定義された決定論的関係を持つランダム化されたデータは、あなたを正直に保ちます。


私がテストを書く方法の例:

# models/user.rb
class User < ActiveRecord::Base
  def uppercase_name
    name.upcase
  end
end
# factories/user.rb
FactoryGirl.define do
  factory :user
    name { Faker::Name.name }
  end
end
# spec/models/user_spec.rb
describe User, '#uppercase_name' do
  it "returns the user's name in uppercase"
    user = FactoryGirl.create(:user)
    expect(user.uppercase_name).to be == user.name.upcase
  end
end

したがって、入力と出力の関係は完全に決定論的です。「John」=>「JOHN」、「Billy Bob」=>「BILLYBOB」などです。 しかし、RSpecコードはより意図を明らかにするものであり(ハードコードされた結果ではなく、関係を記述する必要があるため)、すべてのケースに合格しない実装を記述してアプリケーションを壊すことはできません。

このページは役に立ちましたか?
0 / 5 - 0 評価