我认为你对 Pex 的使用方法有误:我们强烈建议用户在其参数化的单元测试中编写断言。
如果编写了断言,Pex 将会系统地尝试使其无效 - 这正是 Pex 的优势所在:你编写的断言越多,它就会尝试找到更多的 bug。
如果你使用 Pex 来获得高代码覆盖率的测试套件而没有编写断言,那么你只能得到你要求的东西:代码覆盖率和保证运行时异常。Pex ‘只’尝试覆盖分支(1个断言=1个分支),如果没有分支需要覆盖(没有断言),它将不会生成有趣的测试用例。
总的来说,在参数化的单元测试中编写断言更难编写,因为...嗯,它们更加通用。让我们以舍入行为为例:肯定有一个界限,你允许进行舍入操作,这应该自然地转化为参数化的单元测试:
[PexMethod]
public void RoundInBounds(double value)
{
var money = new Money(value);
Assert.AreEqual(value, money.Amount, 0.005);
}
还有许多模式可用于编写这些内容。例如,您的“Money”类可能是自幂的:如果将“Amount”的值反馈到Money实例中,您将获得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会找到失败的bug,修复它,然后Pex再找到下一个失败的bug,如此反复...
这是否让Pex成为一个有用的工具?由你来评判。