我不能对代码的某些部分使用单元测试,所以我回到了回归测试。 我想检查一下修改后我的程序是否以相同的方式运行。 行为我的意思主要是数据结构状态。 到目前为止,我将它们序列化为人类可读的文本格式,并在第一次运行时转储到某些文件中。然后在下一个转储中,我可以比较状态是否改变。 如果更改来自新功能而不是来自错误,请更新它。
我可以使用库(C ++)来组织所有这些。你知道任何? 与转储文件一起,它将提供廉价,大规模的单元测试。
最麻烦的是序列化程序。有时我只是转储内存状态,但是当它不同时,很难进行逆向工程。所以我转向另一种方法。现在,在比较阶段,我将内存转储读入“幻像”对象,并运行专门的diff方法(operator ==,具有丰富的错误报告),有时比序列化为人类可读的文本格式更容易编写。
基本上我觉得要重新发明轮子,所以我的问题很普遍:
你如何进行回归测试(如果你这样做)?
你使用任何库/工具包吗?
你有没有为自己的需求实现一个?
只是出于好奇:你有没有想过进行回归测试,但有些东西阻止了你?
答案 0 :(得分:2)
您可以查看the Boost Test Library 。我从未使用它,但它可能满足你的欲望。
当我工作时,我通常在我们的测试跟踪器中编写简单的测试用例,以使回归测试尽可能简单(特别是对于那些不是我的人:)。
答案 1 :(得分:2)
查看boost serialization库。这将允许您将文件转储到xml,然后您可以为每个版本进行差异化。
为了创建您的测试用例,如果您还没有这样做,请使用gcov通过您的功能计算出覆盖范围。这至少可以确保您的函数中包含所有语句。
单元测试
当我们测试缺少灯具的遗留代码时,我们有时会使用中间接地方法。我们所拥有的是我们的应用程序的略微修改版本,它执行常规任务,但也可以执行功能测试。
严格来说,这不是单元测试,因为您必须假设库的其余部分是正确的,但是,它确实允许您至少进行比回归/系统测试更多的测试。
答案 2 :(得分:1)
好的,这里讨论的有三件事:将测试应用于遗留代码,单元测试和验收/回归测试,所有这些都是用C ++编写的。
首先,为了获取遗留代码并对其进行拟合测试,我建议您购买Michael Feathers的“有效使用旧版代码”的副本。它是一本很棒的书,它将教你任何遗留代码都可以进行单元测试!我已经使用了那本书中的技巧来测试每个人都告诉我无法进行单元测试的事情,但我还是做了:-)
。
其次,对于C ++中的单元测试,我刚刚编写了一个由5部分组成的系列博客文章,描述了如何使用Visual Studio进行详细操作:C++ Unit Testing With Boost.Test。
最后,对于验收/回归测试,我已成功使用Fitnesse。这基本上是一个验收测试框架,它使用wiki来组织和编写测试。遍历并解析wiki页面以变成对您编写的测试夹具的调用。然后,测试夹具在维基页面描述的测试与您的生产代码之间进行调解。我已经使用这种机制对整个应用程序进行端到端的回归测试。将它与您正在更改的类的单元测试相结合,以及一个非常强大的错误检测器机制。回归测试从上面挤出,单元测试从下面挤出来,错误被夹在中间!它对我很有用。
从fitnesse.org获取主要的fitnesse分布您可以从sourceforge获得FitNesse的C ++测试运行器。 (我是该项目的开发人员。)我们还没有在主要的fitnesse wiki中添加SLIM支持,但我们确实对几个灯具有很好的支持。我们希望尽快增加SLIM支持。我有一个基本的实现需要完成。