每个测试可以有多个断言吗?
Can there be multiple asserts per one test?
我昨天开始查看 FsCheck,我正在尝试编写一个简单的测试,以确保 DiscountAmount 的任何实例始终具有负值。我的问题是,在一个测试中可以有多个断言吗?比如这里我说discountAmount加上discount amount应该是0。但是我也说discount amount应该小于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();
}
}
}
}
我会说这真的取决于你。我认为有利有弊 - 一方面,有时设置成本很昂贵(无论是程序员使系统进入特定状态的工作,还是真正计算资源成本,例如你必须做一个昂贵的查询到数据库或其他东西),然后在我看来,值得进行更粗粒度的测试。
权衡是,如果粗粒度测试失败,问题是什么通常不太清楚。
与单元测试相比,FsCheck 在参数生成方面的设置成本要高一些,使 FsCheck 测试比单元测试更粗粒度是有吸引力的。另请注意,FsCheck 有一些方法,如 Label
、And
。 Or
在共享参数生成的同时将不同的属性组合在一起,并且仍然允许您查看测试的哪一部分失败,这在一定程度上抵消了一个缺点。
我昨天开始查看 FsCheck,我正在尝试编写一个简单的测试,以确保 DiscountAmount 的任何实例始终具有负值。我的问题是,在一个测试中可以有多个断言吗?比如这里我说discountAmount加上discount amount应该是0。但是我也说discount amount应该小于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();
}
}
}
}
我会说这真的取决于你。我认为有利有弊 - 一方面,有时设置成本很昂贵(无论是程序员使系统进入特定状态的工作,还是真正计算资源成本,例如你必须做一个昂贵的查询到数据库或其他东西),然后在我看来,值得进行更粗粒度的测试。
权衡是,如果粗粒度测试失败,问题是什么通常不太清楚。
与单元测试相比,FsCheck 在参数生成方面的设置成本要高一些,使 FsCheck 测试比单元测试更粗粒度是有吸引力的。另请注意,FsCheck 有一些方法,如 Label
、And
。 Or
在共享参数生成的同时将不同的属性组合在一起,并且仍然允许您查看测试的哪一部分失败,这在一定程度上抵消了一个缺点。