如何编写好的单元测试?

Aar*_*rry 41 c++ tdd unit-testing

有人可以建议书籍或材料来学习单元测试吗?

有些人认为没有单元测试的代码是遗留代码.如今,测试驱动开发是一种轻松管理大型软件项目的方法.我非常喜欢C++,我没有接受任何正规教育就自己学习.我之前从未考虑过单元测试,所以感到被遗忘了.我认为单元测试很重要,从长远来看会有所帮助.我将不胜感激这个主题的任何帮助.

我主要关注的是:

  1. 什么是单元测试?它是一个应该分析的测试用例的综合列表吗?所以让我们说一下我有一个名为"复数"的类,其中包含一些方法(让我们说找到共轭,一个重载的赋值运算符和一个重载的乘法运算符.这类的典型测试用例应该是什么?有什么方法吗?选择测试用例?

  2. 有没有可以为我创建单元测试的框架,或者我必须编写自己的类进行测试?我在Visual Studio 2008中看到了"测试"的选项,但从未让它工作.

  3. 单元测试的标准是什么?是否应对班级中的每个功能进行单元测试?为每个班级进行单元测试是否有意义?

Ash*_*Ash 22

一个重点(我在开始时没有意识到)是单元测试是一种可以单独使用的测试技术,无需应用完整的测试驱动方法.

例如,您希望通过向问题区域添加单元测试来改进遗留应用程序,或者希望在现有应用程序中查找错误.现在你编写一个单元测试来公开问题代码,然后修复它.这些是半测试驱动的,但可以完全适合您当前的(非TDD)开发过程.

我发现有用的两本书是:

Microsoft .NET中的测试驱动开发

接下来肯特贝克斯的原创TDD书籍,非常看好测试驱动开发.

使用C#和nUnit进行语用单元测试

它直接指向单元测试是什么,以及如何应用它.

回应你的观点:

  1. 实际上,单元测试是一个类中的单个方法,它包含足够的代码来测试应用程序的一个方面/行为.因此,您通常会进行许多非常简单的单元测试,每个单元测试都会测试一小部分应用程序代码.例如,在nUnit中,您将创建一个包含任意数量测试方法的TestFixture类.关键点在于测试"测试代码的单位",即尽可能小的(合理的)单位.您不会测试您使用的基础API,只测试您编写的代码.

  2. 有些框架可以承担创建测试类的一些繁琐的工作,但是我不推荐它们.要创建实际为重构提供安全网的有用单元测试,除了让开发人员考虑如何以及如何测试其代码之外别无选择.如果您开始依赖于生成单元测试,那么很容易将它们视为必须完成的另一项任务.如果你发现自己处于这种情况,你就完全错了.

  3. 关于每个类,每个方法等多少单元测试没有简单的规则.您需要查看应用程序代码并对复杂性存在的位置进行有根据的评估,并为这些区域编写更多测试.大多数人开始只测试公共方法,因为这些方法通常会运用其余的私有方法.然而,情况并非总是如此,有时需要测试私有方法.

简而言之,即使是经验丰富的单元测试人员也可以通过编写明显的单元测试开始,然后寻找更精细的测试,一旦他们编写了明显的测试就会变得更加清晰.他们不希望事先得到每个测试,而是在他们想到的时候添加它们.


Ken*_*ran 7

虽然您已经接受了问题的答案,但我还是想推荐一些尚未提及的其他书籍:

  • 有效地使用遗留代码 - Michael Feathers - 据我所知,这是唯一能够充分解决将不是为可测试性而设计的现有代码转变为可测试代码的主题的书.作为更多的参考手册,它分为三个部分:工具和技术概述,遗留代码中常见路障的一系列主题指南,本书其余部分引用的一组特定依赖性破坏技术.
  • 敏捷原则,模式和实践 - Robert C. Martin - Java中的例子,C#中有一个续集的例子.两者都很容易适应C++
  • 清洁代码:敏捷软件工艺手册 - 罗伯特C.马丁 - 马丁将其描述为他的APPP书的前传,我同意.本书为专业和自律提供了一个案例,这是任何认真的软件开发人员的两个基本素质.

Robert(Uncle Bob)Martin的两本书所涵盖的内容远远超过了单元测试,但他们将单元测试的有效性和编码质量和生产力结合在一起.我发现自己经常提到这三本书.