C++ 使用mock测试迭代代码-有意义吗,如何?

C++ 使用mock测试迭代代码-有意义吗,如何?,c++,algorithm,unit-testing,mocking,googlemock,C++,Algorithm,Unit Testing,Mocking,Googlemock,我想用mock测试一个算法。在当前实现中,该算法在多个过程中迭代容器类,并从中设置()s和get()s值。测试的目的是验证储存在容器中的最终结果。最终值取决于在两次传递之间读取和写入的值。e、 g.任何元素的值可能会多次更改,直到算法完成,最有可能的是,作为迭代n的结果,其值将取决于迭代n-1后的值 我喜欢mock的想法,我很愿意在上面描述的场景中使用mock,因为它允许我在算法出现错误时验证算法的行为,而不仅仅是在计算完成时。然而,我不确定这是否真的是一个好主意,因为我必须将模拟实数的预期与当

我想用mock测试一个算法。在当前实现中,该算法在多个过程中迭代容器类,并从中设置()s和get()s值。测试的目的是验证储存在容器中的最终结果。最终值取决于在两次传递之间读取和写入的值。e、 g.任何元素的值可能会多次更改,直到算法完成,最有可能的是,作为迭代n的结果,其值将取决于迭代n-1后的值

我喜欢mock的想法,我很愿意在上面描述的场景中使用mock,因为它允许我在算法出现错误时验证算法的行为,而不仅仅是在计算完成时。然而,我不确定这是否真的是一个好主意,因为我必须将模拟实数的预期与当前实现联系起来(例如,“expect get(元素n)和return x,然后set(元素n,值x+1),另一个get(n)和return x+1,然后expect set(n,x+2)等等”)

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

现在我的问题是:我遗漏了什么吗?在这个场景中,有没有一种很好的方法来使用mock?还是说在这里使用它们毫无意义?其他人如何处理这个问题

最后,我说的是测试C++代码和使用GooGeMoLok,如果这对你的答案有什么不同。
p、 美国:我在这里查看了google和文章(特别是-只处理增加返回值的问题),但是,我没有发现任何与我的问题相近的东西。

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


至于测试算法代码中的各个步骤,这更像是一项使用调试器逐步完成的工作,而不是自动测试。完成算法的内部工作应该是一次性的,一旦正确,就不需要继续测试其中的各个步骤。

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

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


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

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

否则,使用模拟是浪费时间。您会使用模拟版的
std::vector
?我不会;那太傻了


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

我基本上同意您的看法。然而,在阅读了所有的回答之后,我仍然认为验证/测试算法的各个步骤是一件好事。然而,这可能不应该成为每天测试的一部分,而是一旦测试开始失败就会触发的东西。另一方面,也许你对单步执行仍然是正确的,因为算法的代码已经记录了它应该做什么(与验证单个步骤的模拟相同),而且模拟大部分与原始代码相似的可能性很高?在实践中,如果你测试算法的内部工作,它不应该有什么区别,但是,只有在输出测试失败时才运行测试,这本质上就是“调试”的定义(在这一点上,您无论如何都要亲自动手)。单元测试很好,但听起来你只是为了测试而测试——这不一定是对时间的最佳利用。构建输出测试,模拟尽可能多的输入,并编写代码,直到算法为所有输入提供正确的输出。模拟或不模拟std::vector实际上是一个很好的例子。尽管,如上(@Justin),我认为如果出现问题,验证算法的每一步可能会有所帮助,但指定此类模拟可能比单步执行错误代码需要更多的工作。所以,我想,至少在大多数情况下,你是对的对于公开可见的数据/方法,我认为也是如此。算法的用户不关心返回值是如何计算的,他们只希望返回值是正确的。谢谢你的想法。我不确定你说的对不对:你会用变异的输入编写测试来验证输出,然后在日常运行中停用它们吗?这是否违背了测试的目的之一——验证实现是否仍然按照“任何”输入的预期运行?或者你的观点有什么不同?@jo.tr单元测试应该很快,所有测试都应该在几秒钟内完成。像这样的集成测试可以测试广泛的细节,这可能非常长。我吃了西米拉