1.准确的需求说明
2.做好应对变化的准备
3.测试四步曲
在编译型语言中,将不断重复编辑、编译、运行的循环。在有些情况下,编译程序时就会出现问题,程序员不得不在编辑和编译之间来回切换。在python中,不存在编译阶段,只有编辑和运行阶段。
测试就是运行程序。
要避免代码在开发途中被淘汰,必须能够应对变化并具备一定的灵活性,因此为程序的各个部分编写测试至关重要(称为单元测试),而且是应用程序设计工作的重要组成部分。
“测试一点点,再编写一点点代码”的理念 是胜于 “编写一点点,再测试一点点”的做法。
测试在先,编码在后。称为 测试驱动的编程
1.准确的需求说明
开发软件时,必须要直到软件要解决什么问题--要实现什么样的目标;
要阐明程序的目标,可编写需求说明;也就是描述程序必须满足何种需求的文档。
可使用python来描述需求,并让解释器检查是否满足了这些需求。
注意:需求类型比较多;包括诸如让客户满意度这样模糊的概念;这里描述的重点是功能需求,即可程序必须提供哪些功能。
理念是先编写测试,再编写让测试通过的程序。测试程序就是需求说明,可帮助确保程序开发过程紧扣这些需求。
举例:
假设要编写一个模块,其中只包含一个根据矩形的宽度和高度计算面积的函数。动手编写代码前,编写一个单元测试,其中包含部分直到答案的例子。
from area import rect_area height = 3 width = 4 correct_answer = 12 answer = rect_area(height,width) if answer == correct_answer: print("test pass") else: print("test failed")
在这个示例中,调用函数rect_area,并将参数heigth和width分别设置为3 和 4,再将结果与正确的答案进行比较。
如果接下来,不小心将函数rect_area实现为下面这样,并尝试运行测试程序,将出现一条错误信息。
def rect_area(heigth,width): return height * height #这是不对的
则接下来,就需要检查代码,看看问题出在什么地方,并将返回的表达式替换为 height * width
先编写测试再编写代码并不是为了发现bug,而是为了检查代码是否管用。
2.做好应对变化的准备
自动化测试不仅可在编写程序时提供极大的帮助,还有助于在你修改代码时避免累积错误,这在程序规模很大时尤其重要。
必须做好修改代码的心理准备,不是固守既有代码,但修改是有风险的,修改代码时候,常常会引入一两个意象不到的bug。如果设计良好(使用了合适的抽象和封装),修改带来的影响将是局部的,只会影响很小一段代码。这意味着你能够确定bug的范围,因此调试起来更容易。
覆盖率:是一个重要的测试概念。
3.测试四步曲
测试驱动开发过程的各个阶段
(1) 确定要实现的新功能。可将其记录下来,再为之编写一个测试。
(2)编写实现功能的框架代码,让程序能够运行(不存在语法错误之类的问题),但测试依然无法通过。测试失败是很重要的,因为这样你才能确定它肯恩失败。如果测试有错误,导致在任何情况下都能成功,那么它实际上什么都没有测试。
不断重复这个过程:确定测试失败后,再试图让它成功。
(3)编写让测试刚好能够通过的代码。在这个阶段,无需完全实现所需的功能,而只要让测试能够通过即可。这样,在整个开发阶段,都能够让所有的测试通过(首次运行测试时除外),即便是刚着手实现功能时亦如此。
(4)改进(重构)代码以全面而准确地实现所需的功能,同时确保测试依然能够成功。
提交代码时,必须确保它们处于健康状态,即没有任何测试是失败的。