5

我想使用模拟测试算法。该算法 - 在当前实现中 - 在多个通道中迭代容器类,并从中获取 set()s 和 get()s 值。测试的目的是验证最终结果,存储在容器中。最终值取决于在通道之间读取和写入的值。例如,任何元素的值可能会多次更改,直到算法完成,并且最有可能的是,它作为迭代 n 的结果的值将取决于它在迭代 n-1 之后的值。

我喜欢模拟的想法,我很想在上述场景中使用它们,因为它可以让我在算法发生错误行为时验证它,而不仅仅是在计算完成时。但是,我不确定这是否真的是一个好主意,因为我必须将模拟真实的期望与当前实现联系起来(例如,“期望 get(element n) 并返回 x,然后 set(元素 n,值 x+1),另一个 get(n) 并返回 x+1,然后期望 set(n, x+2) 等")。

虽然允许我验证中间值是否符合预期,但我认为这样的预期会与测试的目的相矛盾(验证算法是否计算出正确的最终值),并且如果实现发生变化,测试可能会失败,而不管正确性如何最终值。

现在我的问题是:我错过了什么吗?不过,在这种情况下是否有一种使用模拟的好方法?还是在这里使用它们根本没有意义?其他人如何处理这个问题?

最后一句话:我说的是测试 c++ 代码和使用 googlemock,如果这对你的答案有任何影响的话。

ps:我在这里查看了谷歌和文章(特别是Mocking迭代行为- 只解决了增加返回值的问题),但是,我没有找到任何接近我的问题的东西。

4

3 回答 3

3

为算法的最终输出创建单元测试。您希望您的自动化测试能够验证预期结果,因为这是程序的其他部分将使用的。

至于测试算法代码中的各个步骤,这更像是使用调试器单步执行的工作——而不是自动化测试。通过算法的内部工作应该是一次性的,一旦你做对了,就没有必要继续测试其中的各个步骤。

于 2011-09-12T14:27:08.980 回答
1

单元测试将更适用于构成算法的较小部分。

话虽如此,单元测试工具对于以这种方式开发算法非常有帮助。它们使用起来一点也不差,如果它们不再有效,请不要继续使用它们。通常你不会在集成测试中测试每个迭代,你只是测试结果。如果以这种方式开发算法有帮助,那就去做吧。

您对模拟是正确的,您并没有真正进行很多测试。但是,如果您想控制某些输入,它们可能会很有用。很多时候,当我有无法控制的黑匣子时,我会以详尽的方式排列我的输入。不过,这类测试运行时间过长。当它们进入源代码控制时,我通常会全部或部分注释掉它们。

于 2011-09-12T14:27:53.457 回答
1

我想说,如果容器在某种程度上很慢,或者它有副作用,这意味着你不能在不干扰它的情况下读取它的值,那么你应该使用一个模拟。

否则,使用模拟是浪费时间。你会使用 的模拟版本std::vector吗?我不会;那会很傻。

在您的单元测试中,如果您无法通过各种公共参数测试算法的所有内部状态,那么这些状态实际上并不重要。它们永远无法在实际使用中出现。所以只要你从你的算法中得到每组输入参数的正确最终答案,我会说一切都很好。

于 2011-09-12T15:37:30.227 回答