2017-03-10 28 views
1

어제 FsCheck를 살펴보기 시작했고 DiscountAmount의 인스턴스가 항상 음수 값을 갖게되는 간단한 테스트를 작성하려고합니다. 내 질문은 하나의 테스트 내에서 여러 개의 주장을 가지고 있어도 괜찮습니까? 예를 들어, 여기서 discountAmount가 생성 된 금액과 할인 금액은 0이어야한다고 말하고 있습니다.하지만 할인 금액은 0보다 작아야합니다. 2 테스트 또는 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에는 Label, And과 같은 몇 가지 메소드가 있습니다. Or은 인수 생성을 공유하는 동안 서로 다른 속성을 함께 결합 할 수 있으며 테스트의 어느 부분이 실패했는지 알 수있게 해줍니다.