我目前正在尝试创建一些类来执行傅里叶变换。
我先创建一些单元测试,然后构建基本功能。但问题是,我只能编写一个测试来检查算法是否有效,并知道预期结果。然后开始构建大型算法,如果它有效,则我的单元测试将通过。
我的问题在于,这并不是真正的TDD。因为通常您会创建测试来测试类的基本特征。现在我的类基本上执行一个大算法,而且我无法测试算法的较小部分,因为它们不是公共的(我一直被告知您永远不想测试私有方法)。
你如何处理这个问题?
我目前正在尝试创建一些类来执行傅里叶变换。
我先创建一些单元测试,然后构建基本功能。但问题是,我只能编写一个测试来检查算法是否有效,并知道预期结果。然后开始构建大型算法,如果它有效,则我的单元测试将通过。
我的问题在于,这并不是真正的TDD。因为通常您会创建测试来测试类的基本特征。现在我的类基本上执行一个大算法,而且我无法测试算法的较小部分,因为它们不是公共的(我一直被告知您永远不想测试私有方法)。
你如何处理这个问题?
我看到有两种可能的方法:
最近我一直在探讨“什么是单元?”这确实是一个棘手的问题。
如果你有理由相信FFT的子单元特别容易出错,那么就设置边界条件,打破私有方法豁免规则。
另一种说法是,子单元实际上是FFT使用的服务单元,这样你就不会违反任何规则。
如果你的类只有一个可测试方法(根据你仅测试公共方法的标准),那么你别无选择,只能测试该方法,对吧?然而,这并不意味着它不是 TDD - 你完全可以测试多种输入值。在这里的大部分工作将是找到有趣的值 - 你的转换可能会失败的边缘情况是什么?是否有任何无效的输入数据,以及如何处理?
你是否有办法对许多值进行算法验证,例如调用已知良好的例程,使用一些关键的 Fourier 相关标识,或者使用你的 FFT 进行multiplication?
我认为如果你无法测试算法的各个组件,那么代码要么非常紧密耦合,要么非常过程化。
你可能需要将代码定义为单元,并将这些单元作为受保护的方法。只要该方法受到保护,就会清楚地传达它不是API的一部分。