测试优先
测试优先是初上软件构造这门课就强调了的。写测试用例,就是理解、修正、完善spec设计的过程。
大一学期学习C语言时,我还丝毫没有测试优先的概念,那时候写SSE以及三次实验课,都是“实现优先”,天真地以为只要完成题干给的例子代码就完成了一大半,可是每次都会被一些奇奇怪怪的刁钻的测试数据给扣掉几分。那时候的编程都是以程序员的视角贯穿整个编程阶段,以至于程序的健壮性并没有得到很好的保障。做一个类比,我就像是一个球队的主教练,思考怎么面对对方时,总是在想怎样在理想状态使我的球队达到最佳,而并没有考虑对方球员的特点,于是导致我本以为可以取得零封的比赛,总会被对方出其不意的战术安排进一两个球,虽然不影响我方不败的结果,但还是让球员的零封奖金泡了汤。
大二接触到Java语言后,我才有了“测试优先”的概念。写完一个spec后,我会根据这个spec去写测试代码。我会从客户端(用户)的视角去完善测试代码,充当一个调皮捣蛋乐于触碰spec底线的“小男孩”,根据spec将测试分为几个等价类,确保能覆盖到几乎所有的客户端输入情况。做出与上文相对的类比:我还是一支球队的教练,但当我安排战术时,首先站在对方教练的角度,思考如何运用对方的阵容特点来对付我这边的球员。如果对方极端地攻或者极端地守,抑或是中规中矩地踢,对方教练会怎样针对我透露给媒体的信息来针对性地找我的弱点。思考完这些,我才会去结合对方可能的战术安排来实施我的战术安排,做到万无一失。
测试优先对于处理spec以外的情况很有帮助。在写lab1时,有一个删除已经加入图中的两点间的某一条边的操作。这时候测试用例的作用就显现出来:1、两点间是否有点并未创建;2、两点之间是否有点未加入图;3、两点之间是否有这条边。这样,写实现代码时整体思路就比较清晰。