我认为您在使用 Pex 的方式上是错误的:我们强烈建议用户在其参数化单元测试中编写断言。
如果您编写断言,Pex 将系统地尝试使它们无效 - 这就是 Pex 的强大之处:您编写的断言越多,它就越会尝试为您查找错误。
如果您使用 Pex 在不编写断言的情况下获得高代码覆盖率测试套件,那么您只会得到您所要求的:代码覆盖率和保证的运行时异常。Pex '仅' 尝试覆盖分支(1 个断言 = 1 个分支),如果没有要覆盖的分支(无断言),它将不会生成有趣的测试用例。
通常,在参数化单元测试中编写断言更难编写,因为……它们更通用。让我们从舍入行为开始:肯定存在允许舍入发生的界限,这应该自然地转化为参数化单元测试:
[PexMethod]
public void RoundInBounds(double value)
{
var money = new Money(value);
// distance between value and amount should be at most 0.01/2
Assert.AreEqual(value, money.Amount, 0.005);
}
还有许多模式可用于编写这些模式。例如,您的“Money”类可能是幂等的:如果您在 Money 实例中返回“Amount”的值,您将获得 Amount。这优雅地转化为参数化单元测试:
[PexMethod]
public void RoundIsIdempotent(double value)
{
var first = new Money(value).Amount;
var second = new Money(first).Amount;
Assert.AreEqual(first, second, 0.0001);
}
另请注意,参数化单元测试绝对属于 TDD 世界。只需先编写参数化的单元测试,Pex 会找到失败的错误,修复错误,Pex 找到下一个失败的错误,等等......
这是否使 Pex 成为有用的工具?你来做法官。