这篇文章是对软件构造课程第二节Testing and Test-First Programming的总结
软件测试是一个大的话题,在软件构造课程的学习任务中离不开基本的测试能力,本节的重点是掌握基本的软件测试能力——黑盒测试思想与单元测试。
软件测试是程序员的一份保证书,更是提高软件质量的重要手段。测试与其他活动的出发点相反——测试要尽早尽全力让软件运行失败。同时,测试又是一项让人失望的工作,因为无论多么好的测试都无法证明系统里不存在错误,也就是说,尽管测试程序花费了你很多精力,你也不能保证自己的工作绝对完美。这也许就是程序员的世界。
一、测试用例
测试可以分为静态测试与动态测试。静态测试是在程序运行前,对代码进行检查。动态测试是给定的一组测试用例去运行代码,通过判断测试用例是否通过,来判断测试结果。
Test case = {test inputs + execution conditions+ expected results}
测试用例:输入+执行条件+期望结果
测试用例具体该如何选取设计,这要结合具体的测试思想(黑盒测试或白盒测试)和具体的测试情形。
二、TFP与TDD
TFP:Test-First Programming 测试优先的编程
TFP简单来讲,就是先写测试,再写代码。这种编程模式的思想基于“Make it fail, fail it fast”,即尽早尽快地让程序出错,然后去不断改错,直至通过。
具体的过程:
1.Write a specification for the function. 先写spec
2.Write tests that exercise the specification. 再写符合spec的测试用例
3.Write the actual code. Once your code passes the tests you wrote, you’re done. 写代码、执行测试、有问题再改、再执行测试用例,直到通过它
书写测试用例的过程就是理解、修正和完善Spec设计的过程
TDD:测试驱动的编程,是敏捷开发中的一种模式
三、单元测试
单元测试:针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试
在软件构造课程中,需要掌握Junit自动化单元测试工具的使用。
四、黑盒测试vs白盒测试
黑盒测试:对程序外部表现出来的行为的测试。用于检查代码的功能,不关心内部实现的细节。
白盒测试:对程序内部代码结构的测试。
打个比方来理解黑盒测试与白盒测试,有一天,你买了一台洗衣机,你想看看这洗衣机是好的还是坏的,这就是测试,于是,你拿着说明书,把这台洗衣机所有的功能都试了一遍,所有的按钮都按了一遍,各种类型的衣物也洗了一次,发现达到了你的预期,于是你认为这洗衣机是好的,这就是黑盒测试,但是,你父亲是一个工程师,他找到了这台洗衣机的设计文档,于是,他拿着工具,将这台洗衣机拆开检查了个遍,这个螺丝是不是达到了预定的规格,这处材料达没达到预期的强度......最后检查完了,发现和设计文档规定的一样,于是,你父亲认为这台洗衣机是好的,这就是白盒测试。
基于黑盒测试思想设计测试用例:
Test cases for black-box testing are built around specifications and requirements, i.e., what the application is supposed to do. 检查程序是否符合规约
方法1 等价类划分
基于等价类划分的测试:将被测函数的输入域划分为等价类,从等价类中导出测试用例。针对每个输入数据需要满足的约束条件,划分等价类。每个等价类代表着对输入约束加以满足/违反的有效/无效数据的集合。
例如,如下的等价类划分
方法2 边界值分析
大量的错误发生在输入域的“边界”而非中央,边界值分析的方法是在边界值附近去选取测试值,边界值分析方法是对等价类划分方法的补充。
例如
在面临多个输入值时,每个输入值的等价类划分是独立的,这时,测试值的选取策略有以下两种:
1.笛卡尔积:全覆盖策略
即,多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例
2.覆盖每个取值:最少一次即可
即,每个维度的每个取值至少被1个测试用例覆盖一次即可
例如
五、测试覆盖度
代码覆盖度:已有的测试用例有多大程度覆盖了被测程序。
代码覆盖度越低,测试越不充分,但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高
其他覆盖度:函数覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖。
测试效果:路径覆盖>分支覆盖>语句覆盖
测试难度:路径覆盖>分支覆盖>语句覆盖
在软件构造课程中,要学会使用计算代码覆盖度的工具。例如,Eclipse中的EclEmma或者IDEA自带的工具。
六、测试策略Testing Strategy
测试策略是一段注释文档,用于说明测试程序的测试思路以及测试用例的选取等。目的是在代码评审过程中,其他人可以理解你的测试,并评判你的测试是否足够充分。
书写测试策略一方面是帮助评审人员快速理解你的测试代码,另一方面也是理清,修改和完善自己测试思路的一个过程。
例如
待测试的方法
一种测试策略