8

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

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

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

基本上我想重新发明轮子,所以我的问题很笼统:
你如何进行回归测试(如果你这样做的话)?
您使用任何库/工具包吗?
您是否曾经根据自己的需要实施过一个?

只是出于好奇:
你有没有想过做回归测试,但有什么事情阻止了你?

4

3 回答 3

2

您可以查看Boost Test Library 。我从未使用过它,但它可能会满足您的需求。

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

于 2009-06-22T09:39:45.073 回答
2

查看 boost序列化库。这将允许您将文件转储到 xml,然后您可以针对每个版本进行差异化。

为了创建您的测试用例,如果您还没有这样做,请使用 gcov 通过您的函数计算覆盖率。这至少可以确保您的函数中涵盖了所有语句。

单元测试

当我们测试缺少固定装置的遗留代码时,我们有时会使用中间方法。我们所拥有的是我们的应用程序的略微修改版本,它执行通常的任务,但也可以执行功能测试。

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

于 2009-06-22T11:07:13.557 回答
1

好的,这里讨论了三件事:将测试拟合到遗留代码、单元测试和验收/回归测试,所有这些都在 C++ 中。

首先,为了获取遗留代码并对其进行拟合测试,我建议购买 Michael Feathers 的“有效使用遗留代码”的副本。这是一本很棒的书,它会告诉你任何遗留代码都可以进行单元测试!我已经使用那本书中的技术对每个人都告诉我不能进行单元测试的东西进行测试,但我还是做了:-)

其次,对于 C++ 中的单元测试,我刚刚写了一个由 5 部分组成的系列博客文章,详细描述了如何使用 Visual Studio 执行此操作:C++ Unit Testing With Boost.Test

最后,对于接受/回归测试,我已经成功使用了 Fitnesse。这基本上是一个验收测试框架,它使用 wiki 来组织和编写测试。wiki 页面被遍历和解析以将调用转换为您编写的测试夹具。然后,测试夹具在测试(如 wiki 页面所述)和您的生产代码之间进行调解。我已经使用这种机制对整个应用程序进行端到端的回归测试。将它与您正在更改的类的单元测试结合起来,它是一个非常强大的错误检测器机制。回归测试从上面挤压,单元测试从下面挤压,错误被夹在中间!它对我很有用。

从fitnesse.org获取主要的fitnesse 发行版您可以从sourceforge 获取FitNesse 的C++ 测试运行器。(我是那个项目的开发人员。)我们还没有在主要的 Fitnesse wiki 中添加对 SLIM 的支持,但我们确实对几个固定装置有很好的支持。我们希望尽快添加对 SLIM 的支持。我有一个基本的实现需要完成。

于 2009-07-18T09:30:23.127 回答