2009-06-22 95 views
7

我不能对代码的某些部分使用单元测试,因此我要回归回归测试。 我想检查一下我的程序在修改后是否以相同的方式运行。 而行为我的意思大都是数据结构的状态。 到目前为止,我将它们序列化为人类可读的文本格式,并在第一次运行时转储到某些文件。然后在接下来的转储中,我可以比较状态是否改变。 如果更改来自新功能而不是来自错误,则更新它。C++中的回归测试

我可以使用库(C++)来组织所有这些。你知道任何? 与转储文件一起,它将提供廉价,大规模的单元测试。

最麻烦的事情是序列化过程。有时我只是转储内存状态,但当它不同时,很难进行反向工程。所以我转向另一种方法。现在,在比较阶段,我将内存转储读入一个“幻像”对象,并运行专门的diff方法(运算符==带有丰富的错误报告),有时比序列化为人类可读的文本格式更容易编写。

基本上我觉得重新发明轮子,所以我的问题是相当一般的:
你如何执行回归测试(如果你这样做)?
你使用任何库/工具包吗?
你有没有为自己的需要实施一个?

只是出于好奇:
你有没有想过做回归测试,但有些东西阻止了你?

+0

只是出于好奇...为什么你不能使用单元测试? – nathan 2009-06-22 00:47:02

回答

2

你可以看看the Boost Test Library 。我从来没有使用它,但它可能会满足你的愿望。

当我在工作时,我通常会在我们的测试跟踪器中编写简单的测试用例,以使回归测试尽可能地简单(尤其对于不是我的人:)。

2

检查出增强serialization库。这将允许您将文件转储到xml,然后您可以对每个版本进行比较。

为了创建您的测试用例,如果您还没有这样做,请使用gcov通过您的函数来计算覆盖范围。这至少会确保你的函数中包含了所有的陈述。

单元测试

当我们正在测试一个缺少灯具的遗留代码,我们有时会使用一个中间立场的做法。我们所拥有的是我们的应用程序的稍微修改版本,它执行常规任务,但也可以对函数执行测试。

它不是严格意义上的单元测试,因为您必须假定库的其余部分是正确的,但是,它至少允许您执行比回归/系统测试可能更多的测试。

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支持。我有一个基本的实现需要完成。