欢迎来到测试的世界!
你有没有试过玩游戏玩到快要赢的时候,游戏却突然崩溃?或是用应用程序时遇到奇怪的错误信息?这些情况都是因为程序没有经过妥善测试。在这一章,我们将学习程序员如何找出并修复这些“臭虫(Bugs)”,以建立稳健的程序(Robust programs)——也就是那些强大、可靠且不容易死机的程序!
如果这些内容看起来很多,别担心。我们会把它拆解成容易消化的小部分,并结合许多日常生活中的例子。
1. 为什么要测试?
测试的主要目的很简单:确保程序能完全按照预期运行!具体来说,测试能帮助我们:
• 找出并修复代码中的错误(Errors / Bugs)。
• 确保程序符合需求(Requirements)(即完成用户要求的功能)。
• 检查程序是否能在遇到非预期的输入(Unexpected inputs)时,不会崩溃。
快速复习:测试不是为了证明程序完美无缺;而是要在用户看到程序之前,尽可能找出所有的错误!
2. 测试的类型
程序员主要有两种测试工作的方式,就像厨师制作一道新汤品一样。
迭代测试(Iterative Testing)
迭代测试发生在开发过程中。程序员编写一小段代码(模块),进行测试,修复任何错误,然后再进入下一部分。
比喻:厨师在煮汤的过程中不断试味,并随时加入适量的盐或水。
最终 / 终端测试(Final / Terminal Testing)
最终测试(也称为终端测试)发生在开发过程的最后阶段,即所有程序零件都整合完成后。这会检查整个系统作为一个整体是否能正常运行。
比喻:将煮好的汤盛给客人,等待最终评价。
重点总结:迭代 = 开发期间。最终 = 开发完成后。
3. 识别错误
在计算机科学中,并非所有的错误都是一样的。你需要了解两种主要错误之间的区别。
语法错误(Syntax Errors)
语法错误是代码中的“文法”错误。程序语言有非常严格的规则(语法)。如果你把 print() 拼写成 prnt(),或是漏掉了一个括号,计算机就会看不懂该怎么做。如果有语法错误,程序将完全无法执行。
逻辑错误(Logic Errors)
逻辑错误是程序“思考”上的错误。代码写得完全正确(没有文法错误),所以程序可以执行,但会给出错误的结果。
例子:你想计算两个数字相加 \(2 + 2\),但不小心输入了 \(2 - 2\)。计算机虽然正确地执行了数学运算,但给出的答案是 0 而不是 4。这就是逻辑错误!
你知道吗?“Bug”这个词源于 1940 年代,当时一只真正的飞蛾飞进计算机硬件里,导致计算机停止运行!
4. 选择合适的测试数据
为了正确测试程序,你不能随便输入乱码。你需要一个计划!想象我们有一个程序,要求用户输入学生的考试分数,该分数必须在 0 到 100 之间。
我们会使用四种特定的测试数据类型:
1. 正常数据(Normal Data)
这些是范围内的数据,程序应该要接受。
例子:45, 82, 或 10。
2. 边界数据(Boundary Data)
这些是位于允许范围最边缘的数据。这些地方最容易隐藏逻辑错误!
例子:0 和 100。(我们也应该测试 -1 和 101,看看程序是否拒绝它们)。
3. 无效数据(Invalid Data)
这是类型正确(数字)但超出范围的数据。
例子:-50 或 150。程序应该拒绝这些输入。
4. 错误数据(Erroneous Data)
这是完全错误类型的数据。计算机预期是数字,但你却给了其他东西。
例子:输入“八十”而不是 80,或是输入“香蕉”。程序应该要能处理这种情况而不崩溃。
记忆口诀 - “NIBE”技巧:
Normal (正常)
Invalid (无效)
Boundary (边界)
Erroneous (错误)
5. 测试计划与修订
测试计划(Test plan)是一份文档(通常是表格),让程序员在开始测试前列出所有要检查的项目。它通常包含:
• 测试编号:方便追踪记录。
• 描述:我们正在测试什么?
• 测试数据:我们输入了什么数值?
• 预期结果:原本“应该”发生什么?
• 实际结果:“实际”发生了什么?
• 通过/失败:它成功了吗?
修订算法(Refining Algorithms)
当你测试完程序并发现错误后,必须进行修订(Refining)。这意味着修正错误并改进代码,使其更加稳健。如果你的测试计划显示“失败”,你就回到代码、修正逻辑,然后再次测试!
常见错误:学生经常会混淆无效(Invalid)和错误(Erroneous)数据。请记住:无效数据是类型正确但“数值不对”(例如年龄输入 -5)。错误数据则是完全错误的数据类型(例如年龄输入“你好”)。
总结:快速复习
1. 测试目的:找出臭虫并确保符合需求。
2. 迭代测试:边写边测。最终测试:最后阶段测试。
3. 语法错误:程序无法执行(文法错误)。逻辑错误:程序可执行但答案错误。
4. 测试数据:正常 (标准)、边界 (边缘)、无效 (数值错误)、错误 (类型错误)。
5. 测试计划:用来记录与检查结果的表格,以利修订程序。