12

我从事音频操作,通常使用 Matlab 进行原型设计,使用 C++ 进行实现。最近,我一直在阅读 TDD。我查看了一些基本示例,并且对该范例非常感兴趣。

目前,我使用我认为的全局“测试辅助”方法。为此,我用 C++ 编写信号处理块,然后制作一个简单的 Matlab mex 文件,该文件可以与我的类交互。我随后添加了功能,检查结果是否与我去的等效 Matlab 脚本匹配。这可以正常工作,但随着系统的发展,测试很快就会过时。此外,我正在测试整个系统,而不仅仅是单元。

使用已建立的 TDD 框架会很好,我可以在其中拥有一个测试套件,但我看不出如何在没有与被测代码同样复杂的测试的情况下验证处理块的功能。我将如何在 C++ 测试中生成参考信号来验证处理块,而测试不是一种自我实现的预言?

如果有人在这方面有经验,或者可以提出一些我可以阅读的方法,那就太好了。

4

4 回答 4

3

我认为将 TDD 方法应用于信号处理非常棒(如果我在几年前自己进行信号处理时就知道它,它会为我节省几个月的时间)。我认为关键是将您的系统分解为可以独立测试的最低级别的组件,例如:

  • FFT:在已知频率下测试信号:DC、Fs/Nfft、Fs/2 和不同相位等。检查峰值和相位是否符合预期,检查归一化常数是否符合预期
  • 峰值选择:测试您是否正确找到最大值/最小值
  • 滤波器:以已知频率生成输入,并检查输出幅度和相位是否符合预期。

您不太可能在 C++ 和 Matlab 之间得到完全相同的结果,因此您必须在某些测试中提供错误界限。TDD 是一种很好的方法,不仅可以验证您拥有的代码的正确性,而且在尝试不同的实现时非常有用。例如,如果您想用另一种 FFT 实现替换,数据打包方式或使用的规范化常数通常会略有不同。TDD 将使您对正确集成新库充满信心。

于 2012-05-29T14:22:58.167 回答
2

我为启发式检测做了类似的事情,我们有大量的捕获文件和一个能够加载和注入它们进行测试的框架。您是否有可能在文件中捕获参考信号并执行相同操作?

至于我关于 TDD 的 2 美分,它是一种很好的开发方式,但与大多数范式一样,你不必总是严格遵守它,有时你应该知道如何稍微改变规则,以免编写太多一次性代码/测试。我读到了一种方法,它说在开发测试之前绝对不应该编写任何代码,这有时可能过于严格。

另一方面,我总是喜欢说:“如果它没有经过测试,它就坏了”:)

于 2012-05-29T09:22:47.130 回答
1

测试与正在开发的代码一样复杂或更复杂是可以的。如果您更改(更新、重构、错误修复)代码而不是测试,则单元测试会警告您某些内容已更改并且需要进行审查(是模式 A 的错误修复应该更改模式 B 吗?等等)

此外,您可以维护各个计算组件的 API,而不仅仅是整个端到端系统。

于 2012-05-29T15:16:07.717 回答
0

我才刚刚开始在信号处理的背景下考虑 TDD,所以我只能在前面的答案中添加一点。我所做的是利用一些叠加来测试原语。例如,在测试 IIR 滤波器时,我独立验证了具有单位增益和缩放增益的 b0、b1 和 b2 元素,然后验证了遵循易于建模衰减的 a1 和 a2 元素。我的测试信号是分子的斜坡函数和分母的脉冲函数的组合。我知道这是一个微不足道的例子,但该过程应该适用于大量线性操作。测试还应该锻炼不稳定区域并显示输出适当地爆炸。

一般来说,我希望脉冲响应会为我做很多工作,因为在许多情况下它们会简化为可以独立计算的三角函数。同样,如果您的操作具有系列扩展,您的测试函数可以执行扩展为相关顺序并与您的处理块进行比较。它会很慢,但它应该工作。

于 2015-08-17T08:29:49.593 回答