1

我有一个符合规范的信号处理库。但是,我已经确定了一些重构的好地方。一段时间以来,我一直打算将单元测试纳入我的工作流程,这看起来是一个尝试非平凡代码的好机会。这样我就可以测试重构后的输出是否几乎相同。

我正在尝试将catch作为测试框架,但是,这个细节可能无关紧要,因为(据我所知)所有测试框架都取决于操作员的结果,即

REQUIRE(i_x == 2)

但是,对于浮点数据,需要某种形式的错误边界检查。.

const float target = 2.000f;
const float tolerance = 0.000005f;
const float err = target*tolerance;
REQUIRE( (f_x > target-err) && (f_x < target+err) )

对于每个编写的测试,这很快就会变得很难看,所以我当然可以创建一个(模板化的)全局函数,它返回一个bool给定的x,targettolerance作为参数。

这是其他人都这样做的方式吗?这是最佳实践还是我错过了一个技巧?

4

1 回答 1

4

测试对上下文高度敏感。您提出的测试测试相对误差。本质上,您是在断言,在这种特殊情况下:

  • 正常的、可接受的代码更改可能会在每个结果中产生相对于结果而言很小的偏差。
  • 错误很可能会产生相对于结果而言不小的偏差。

总的来说,我认为第二个断言通常是安全的。“随机”代码更改可能会至少在某些值上产生巨大差异。但是,可能有一些应用程序可以很好地处理浮点数,在这种情况下,小的偏差可能会导致超出规范的结果。例如,假设您有一个反正弦例程,它返回的结果与正确结果仅略有不同:当正确结果为 1 时,它返回 1+2 -23。稍后,此结果 x 用于表达式,例如sqrt(1-x*x). 这个表达式对于所有数学上正确的反正弦值(对于实数输入)都是实数,但是,给定一个略大于 1 的 x,它会尝试取负数的平方根,并且会发生错误。所以你必须决定第二个断言是否适合你的应用程序。

第一个断言更值得怀疑。浮点运算中的误差源并不总是与最终结果成正比。例如,考虑对某些输入信号进行离散傅里叶变换 (DFT)。对于几乎每个输出数字,每个输入数字都贡献了一部分。偶然地,一些单独的输出数字将接近于零。但是,它们中的错误可能与输入中的大量数字成正比。因此,对此类输出数字应用相对误差测试将产生错误的错误指示。相反,有必要允许输入以某种方式缩放错误。

于 2012-09-13T14:14:31.480 回答