如何生成浮点逻辑的良好代码覆盖率?

13

我正在手工编写新代码,希望确保不遗漏任何细节。

是否有特定的方法可以让 Pex 生成良好的数值密集型代码覆盖率,除了指定和使用代码契约?

请在http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf中搜索“float”关键字,以获取一些背景信息。

浮点数算术约束通过转换为有理数来近似处理,并使用 Z3 之外的启发式搜索技术来查找浮点数约束的近似解。

...还有...

符号推理。Pex 使用自动约束求解器确定哪些值对测试和被测试的代码是相关的。然而,约束求解器的能力是有限的,特别是 Z3 无法精确地推理浮点算术。

或者,你知道一个更适合在 .NET 下查找数字异常的工具吗?我知道http://fscheck.codeplex.com/,但它不执行符号推理。


2
避免使用与==相关的条件语句来处理float类型。改用<>。如果必须使用==,则使用表达式Math.Abs(value - target) < epsilon,其中epsilon是您关心的任何公差。由于“近似有理数”的原因,当您希望成功时,“==”关系太容易失败。但是Pex应该更容易处理< - Jesse Chisholm
@JesseChisholm,我知道有静态分析工具可以帮助您找到这些编码错误。但我不确定这如何回答这个问题。 - GregC
在NUnit中,您可以这样做:Assert.That(result, Is.EqualTo(expected).Within(.000001)); 不太了解Pex,但似乎这是您想要做的事情类型。 - cbp
1
这让我想到,除非绝对必要,否则我们应该避免使用浮点类型。 - AndyM
0.0f,0.1f,0.9f,1.0f,1.1f,float.MaxValue-0.1f,float.MaxValue -0.1f,-0.9f,-1.0f,-1.1f,float.MinValue + 0.1f,float.MinValue - MrFox
显示剩余4条评论
1个回答

0

你想要的是好的覆盖率吗?仅仅运行代码中每个分支的测试很可能并不能证明它是正确的 - 通常更多的是关于边角情况,而作为开发者,你最了解这些边角情况。它似乎只是说“这是一个有趣的输入组合”,而更有可能的是你想指定你想看到的系统行为 - 如果你一开始就写错了代码,那么有趣的输入可能与正确的代码完全无关。

也许这不是你想要的答案,但我认为最好的方法是手动完成!在开始编码之前编写规范,并将其转换为一堆测试用例,当你知道/正在编写类/子系统的API时。

随着填写API/编写代码的开始,你可能会发现需要做额外的工作,找出困难的部分 - 如果你有条件语句等,你觉得有人重构你的代码可能会出错,那么编写一个涵盖它们的测试用例。有时我故意在这些点上写错代码,加入一个失败的测试,然后纠正它,以确保测试检查代码的正确路径。

然后尝试考虑一些你可能没有涵盖的奇怪值 - 负输入、空值等。通常这些将是无效的情况,你不想为其提供支持或者去思考 - 在这种情况下,我通常会编写一些测试来说明它们应该抛出异常 - 这基本上可以防止人们在你没有正确考虑/使用无效数据的情况下误用代码。

你提到你正在处理数值密集型代码 - 也许值得测试一个更高的层次,这样你就可以测试系统中你所寻找的行为,而不仅仅是数字计算 - 假设代码不纯粹是数字,这将帮助你建立一些真实的执行条件,并确保任何数字计算部分实际上与程序的其余部分以你需要的方式交互 - 如果它是一些算法性的东西,你可能最好编写一个验收测试语言来帮助描述在不同情况下所需的输出 - 这给出了你试图实现什么的清晰图片,它还允许你通过一个系统投入大量(真实)数据,这可能比计算机生成的输入更好。另一个好处是,如果你意识到算法需要彻底重写以满足一些新要求,那么你所要做的就是添加新的测试用例,然后重写/重构;如果你的测试只是关注算法的细节并假设对外部世界的影响,那么你将面临一个巨大的头痛,试图弄清楚算法当前如何影响行为,哪些部分是正确的,哪些部分是错误的,然后尝试将大量单元测试迁移到新的API/算法上。

当然,这正是现在所做的。我的意思是,我宁愿筛选计算机生成的测试数据,也不想事先猜测现场数据可能带来的问题。如果你学过数值分析,这可能对你有意义。我特别感兴趣的是找到导致数值错误(如溢出和下溢)的合理形式的数据。这些问题通常是计算上复杂的,最好交给机器去解决。 - GregC
以下是一个探索示例,如果有自动故障检测器的帮助将会更简单:http://www.mathworks.com/matlabcentral/newsreader/view_thread/278975 - GregC
我看不出那个人的问题的解决方案是什么 - 它是否可以通过生成的测试数据找到?浮点数的搜索空间一定非常大 - 看起来在那个pdf中pex无法精确地推理它们。有趣的问题,很抱歉我不能提供更多帮助! - JonnyRaa
我把你的答案标记为问题的解决方案,即使它实际上并不是。 我想我需要深入学习一下了... - GregC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接