2017-03-10 11 views
1

私は昨日FsCheckを見始めました。私はDiscountAmountのインスタンスが常に負の値を持つという簡単なテストを書こうとしています。私の質問は、1回のテストで複数のアサーションを持つことは大丈夫ですか?たとえば、ここで私はdiscountAmountが作成された金額と割引額は0でなければならないと言っています。しかし、私はまた、割引額は0未満でなければならないと言っています。1回のテストで複数のアサートが可能ですか?

public class DiscountAmountTests 
    { 
     [Property()] 
     public void value_or_created_discountAmount_should_be_negative() 
     { 
      Arb.Register<AmountArbitrary>(); 
      Prop.ForAll<Amount>(
       v => 
       { 
        var sut = new DiscountAmount(v); 
        var expectedResult = 0; 
        var result = v + sut; 

        result.Should().Be(expectedResult); 

        sut.Value.Should().BeLessThan(0); 

       }) 
       .QuickCheckThrowOnFailure(); 
     } 

     public class AmountArbitrary 
     { 
      public static Arbitrary<Amount> Amounts() 
      { 
       return Arb.Generate<decimal>().Where(x => x > 0) 
        .Select(x => new Amount(x)) 
        .ToArbitrary(); 
      } 
     } 

    } 
} 
+0

主に意見に基づいていますが、特定のテストケースに重点を置いた複数のアサーションを持つことは問題ではありません。 – Nkosi

答えて

0

これはあなた次第です。私は議論があると思います。一方では、セットアップコストが高価になることもあります(システムを特定の状態にするプログラマーの仕事や、リソースコストを実際に計算するという点で、高価なクエリを実行する必要がありますDBや何かに)し、私の意見では、テストをより粗くざらざらにする価値があります。

粗い粒度のテストが失敗した場合の問題点は、一般的にはあまり明確ではないということです。

単体テストと比較して、FsCheckは引数生成の点で設定コストがもう少しあり、FsCheckテストを単位テストよりも粗くすることは魅力的です。また、FsCheckにはLabelAndのようないくつかのメソッドがあります。 Orは、引数の生成を共有しながら異なるプロパティをまとめて組み合わせることができますが、テストのどの部分が失敗したかを見分けることができます。

関連する問題