本专栏末尾有我的简介,如果您读过的话,就会知道我在担任程序经理之前曾出任 C# 编译器的测试组长,而在此之前是 C++ 编译器的测试组长。这些工作经历使我对分析和尽量避免软件错误特别感兴趣。
要减少软件中的错误数目,方法之一就是拥有一个专业的测试组,其工作就是尽一切可能使软件崩溃。不幸的是,如果拥有测试组,那么即使是经验丰富的开发人员,也会倾向于花费较少的时间来保证代码的可靠性。
软件界有一句俗语:“开发人员不应该测试他们自己的代码”。这是因为开发人员对自己的代码了如指掌,他们很清楚如何采用适当的方法对代码进行测试。尽管这句俗语很有道理,但却忽略了非常重要的一点 - 如果开发人员不对自己的代码进行测试,又如何知道代码能否按照预期的方式运行?
简单说来,他们根本无从得知。开发人员编写那种运行不正常或只在某些情况下运行正常的代码是一个严重的问题。他们通常只测试代码能否在很少的情况下正常运行,而不是验证代码能够在所有情况下均正常运行。
发现软件错误
发现软件错误的情况有很多:
1、由首次编写代码的开发人员发现。
2、由尝试运行代码的开发人员发现。
3、由组中的其他开发人员或测试人员发现。
4、作为产品大规模测试的一部分。
5、由最终用户发现。
如果在第一种情况下发现软件错误,则修复错误比较容易,成本也很低。情况越靠后,修复软件错误的成本就越高;修复一个由最终用户发现的软件错误可能要耗费 100 或 1000 倍的成本。更不用说用户通常因为软件错误导致工作无法继续,而一直等到下一个版本才能解决问题。
如果开发人员能够在编写代码期间发现所有的软件错误,那就再好不过了。为此,您必须编写能在编写代码时运行的测试。有一种很不错的方法,它恰好可以做到这一点。
事先测试开发
此概念于 20 世纪 90 年代初诞生于 Smalltalk 世界,Kent Beck 在当时编写了 SmalltalkUnit。在过去的几年中,大部分环境都具备了单元测试工具,其中有一个很出色的适用于 .NET
示例
下面我将编写一个 IntegerList 类来介绍事先测试开发的工作原理。IntegerList 是 ArrayList 类的变体,用于在本地存储整数,因此不存在装箱和取消装箱的开销。
第一步是创建一个控制台项目,并向其中添加一个 IntegerList.cs 源文件。要连接 nUnit 框架,需要添加对 nUnit 框架的引用。在我的系统中,它们位于 d:\program files\nUnit v2.0\bin。
第二步是花些时间考虑如何对该类进行测试。这与确定类应该具备哪些功能的过程类似,但重点放在功能的特定用途(将值 1 添加到列表并检查是否成功),而不是功能本身(将一个项目添加到列表)。要生成此类,我们首先要提供一个要使用的测试列表:
1、测试该类可以构造
2、将两个整数添加到列表,并确保数目和项目都正确。
3、执行同一操作,但针对更多的项目。
4、将此列表转换为一个字符串。
5、使用 foreach 枚举此列表。
文章来源于领测软件测试网 https://www.ltesting.net/