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();
            }
        }

    }
}
4

1 回答 1

0

我会说这真的取决于你。我认为有利有弊 - 一方面,有时设置成本很昂贵(无论是程序员工作以使系统进入特定状态,还是真正计算资源成本,例如您必须进行昂贵的查询到数据库或其他东西),然后在我看来,值得使测试更粗粒度。

权衡是,如果粗粒度测试失败,通常不太清楚问题是什么。

与单元测试相比,FsCheck 在参数生成方面的设置成本更高,并且使 FsCheck 测试比单元测试更粗粒度是有吸引力的。另请注意,FsCheck 有一些方法,如Label, AndOr在共享参数生成的同时将不同的属性组合在一起,并且仍然允许您查看测试的哪一部分失败,这在一定程度上抵消了一个缺点。

于 2017-03-13T10:24:30.963 回答