【发布时间】:2012-06-01 13:10:03
【问题描述】:
我正在手工制作新代码。我想确保我不遗余力。
除了指定代码合同来指导 Pex 以使其在数字密集型代码中产生良好的覆盖率之外,我还能做些什么具体的事情?
尝试在http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf 中搜索关键字“float”以获取一些背景信息。
浮点数的算术约束通过转换为有理数来近似,启发式搜索技术在 Z3 之外用于寻找浮点约束的近似解。
...还有...
符号推理。 Pex 使用自动约束求解器来确定哪些值与测试和被测代码相关。然而,约束求解器的能力是有限的,而且永远是有限的。特别是,Z3 无法精确推理浮点运算。
或者,您是否知道 .NET 下更适合在 .NET 下查找数值异常的工具?我知道http://fscheck.codeplex.com/,但它不执行符号推理。
【问题讨论】:
-
对于
floats 避免使用与==相关的条件。请改用<或>。如果您必须使用==,则使用表达式Math.Abs(value - target) < epsilon来表示您关心的epsilon 容差。由于approximation to rational==关系在您希望它成功时经常失败。但 Pex 应该更容易处理<。 -
@JesseChisholm 我知道静态分析工具可以让您找到此类编码错误。我不确定这对这个问题有什么帮助。
-
@GregC,我不确定我明白你在问什么。您想知道 (A) 包含浮点数的条件语句是否使用 epsilon 容差,或者 (B) 您的算法在数值上是稳定的,或者 (C) 只是对代码覆盖工具的推荐?还是别的什么?
-
(A) 是编码错误,可以通过静态分析确定。 (B) 可以通过分析生成的测试输入来推断。 (C) 代码覆盖率不难做到;生成有意义的边缘条件来驱动有趣的输出很难,这就是我正在寻找的
-
这让我想到我们应该避免使用浮点类型,除非迫不得已。
标签: c# unit-testing code-contracts numerical pex