.net - 使用浮点值进行单元测试

标签 .net unit-testing testing floating-point

我创建了一个类 Matrix 来对浮点矩阵进行数学运算(基本运算、求逆……)。

浮点精度使其难以测试。 通常,如果测试逆运算,如果矩阵的行列式接近于零,则误差可能很大。

如何对这些操作进行单元测试?

最佳答案

有许多选项可能适合您的目标。

对于每个单独的输出元素,您可以根据对其产生影响的输入值设置该元素的容许误差。 (在复合运算的情况下,例如乘以一个矩阵然后乘以它的逆,您仍然会根据对最终值有贡献的所有值来设置容差。)

您可以选择行列式不接近零的输入矩阵进行测试。

您可以计算结果矩阵与理想结果的距离,并确定该距离是否超出您的误差容限,而不是测量单个元素中的误差。 (例如,将两个矩阵相减,将元素的平方相加,然后取平方根。对于“距离”的其他概念和矩阵运算中的误差,请考虑 this page。)

请记住,测试的目的是发现错误。这表明如果阈值小于错误可能导致的任何差异的幅度,则可以使用非常大的容错度。也就是说,考虑您的代码中可能出现的错误类型:对错误元素的引用、对数组外部的引用、操作遗漏等等。通常,这些错误会导致结果出现非常大的错误。只要您的测试捕获到这些错误,它们就达到了目的。

理想情况下,您会将运算的计算结果与理想结果进行比较,而不是反转运算并与原始输入进行比较。如果理想结果不可用,您可以使用扩展精度与更精确的计算结果进行比较。如果这不是普遍可用的,那么您可以使用准备好的行为良好的矩阵集进行比较,例如在各种位置(和其他地方为零)只有几个简单元素(例如,小整数)的矩阵。将使用不同的输入矩阵重复每个测试,以便组合的测试集涵盖必要的情况。但是每个测试都会有简单的输出,几乎没有或没有预期的舍入误差。

关于.net - 使用浮点值进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589535/

相关文章:

.NET - Queue.Enqueue 方法线程安全吗?

java - 等同于 Mockito any 具有非空约束

testing - 如果测试用例 100% 失败,我们如何使用 Jenkins 发送自定义电子邮件?

c# - 如何使用 Dapper 映射 MySQL JSON 列

c# - 不确定如何修复这个奇怪的 Entity Framework (关系/导航)错误

objective-c - Objective-C - 单元测试 dispatch_async block ?

java - 在 Selenium 2 中使用 Chrome 驱动程序

ruby-on-rails - 如何在 Capybara 中模拟浏览器后退按钮?

c# - 使用退格符附加字符串时从文本文件中删除字符

c# - 使用 T-SQL 更改 filstream 目录权限?