使用模拟测试迭代代码 - 它是否有意义,如何?

jo.*_*.tr 5 c++ algorithm unit-testing mocking googlemock

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

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

虽然允许我验证中间值是否符合预期,但我认为这样的期望会与测试的目的相矛盾(验证算法计算正确的最终值),如果实现更改,测试可能会失败,无论正确性如何最终价值.

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

最后的评论:我正在谈论测试c ++代码和使用googlemock,如果这对你的答案有任何影响.

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

Zan*_*ynx 1

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

否则,使用模拟就是浪费时间。你会使用 的模拟版本吗std::vector?我不会;这太愚蠢了。

在单元测试中,如果您无法通过各种公共参数测试算法的所有内部状态,那么这些状态实际上并不重要。它们永远无法实际使用。因此,只要您从算法中为每组输入参数获得正确的最终答案,我就会说事情进展顺利。