开发与测试:确保我们的ICT系统切实可行!(教学大纲 7.3 节)
未来的ICT专家们,大家好!欢迎来到系统生命周期中最关键的阶段:开发与测试(Development and Testing)。我们可以把系统开发比作制作一个复杂的蛋糕:分析阶段是挑选食材,设计阶段是编写食谱,而开发阶段则是实际烘焙的过程。
但在端出蛋糕供大家享用(系统实施)之前,你必须先亲自尝一尝(测试)!它熟了吗?味道对吗?会散架吗?在ICT中,测试就是我们在系统交付给真实用户使用之前,发现并修复所有错误(Bug)的过程。让我们深入探讨如何打造强大、可靠且零错误的ICT系统。
1. 测试的必要性
我们为什么要大费周折进行测试?教学大纲明确指出,在实施前必须对系统进行测试。
为何测试不可或缺:
- 捕捉错误(Bug): 所有的程序都难免会有错误。测试可以在这些缺陷造成严重后果之前将其找出来。
- 确保需求得到满足: 测试可以确认新系统是否完全实现了客户在分析阶段所提出的要求。
- 系统可靠性: 一个经过严格测试的系统,在正式上线时崩溃或产生错误数据的几率会大大降低。
- 提升用户信心: 如果系统从第一天起就运行完美,用户会迅速建立起对系统的信任。
你知道吗? 1996年阿里安5号(Ariane 5)火箭因软件故障导致价值1860万美元的发射失败,其根源竟是一小段代码未经过极值数据的正确测试。切记:一定要测试!
快速回顾:测试的目标
目标很简单:确保系统产生的实际结果(Actual Outcomes)与设计阶段定义的预期结果(Expected Outcomes)相吻合。如果不吻合,我们就修复缺陷!
2. 测试策略与范围
你不可能一次性测试所有内容。根据所处的开发阶段,我们采用不同的测试策略。
模块化测试(单元测试 / Unit Testing)
这种策略涉及对系统的每一个小部分或“模块”进行单独测试。
- 什么是模块? 它可以是一个界面、一段计算程序,或者一个特定的功能(如“登录”功能)。
- 优点: 因为测试的代码量很小,所以更容易准确定位Bug的位置。
打个比方:如果你在搭乐高城堡,单元测试就是确保在把所有部件连接在一起之前,每一个单独的墙体部分都组装正确。
全系统测试(集成测试 / Integration Testing)
当所有模块都能独立运行后,我们要测试它们在一起时是如何工作的。
- 这能确认数据是否能正确地从一个模块流向另一个模块(例如:数据输入表单是否正确地将用户信息传递给了数据库结构)。
- 这是一种更全面的测试,确保所有功能作为一个统一的整体协同工作。
核心要点: 先测试局部(模块),再测试整体(全系统)。
3. 设计测试计划
测试计划(Test Plan)是一份正式文档,详细说明了将要进行的每一项测试。它确保测试结构化、完整,并为补救措施(Remedial Action,即修复问题)提供明确步骤。
优质测试计划的组成部分:
对于每一个测试用例,你必须定义四个关键要素:
- 测试数据(Test Data): 你将输入到系统中的数据。
- 预期结果(Expected Outcomes): 系统应该产生的结果。这是通过手动计算或事先预测得出的。
- 实际结果(Actual Outcomes): 输入测试数据后,系统实际产生的结果。
- 测试后的补救措施(Remedial Action): 当实际结果与预期结果不符时所采取的行动(例如:“调整验证逻辑”或“检查文件结构定义”)。
记忆小窍门: 把测试计划想象成 T.E.A.R. 表:Test Data(测试数据)、Expected Outcome(预期结果)、Actual Outcome(实际结果)、Remedial Action(补救措施)。
4. 测试数据的类型:寻找极限
为了妥善检查系统(尤其是验证程序),我们必须使用不同类型的数据。
4.1 正常数据(Normal Data)
特征: 数据是有效的、符合预期的,且在规定的允许范围之内。
用途: 用于检查系统能否准确处理标准且正确的输入。
示例:如果表单要求年龄在16到60岁之间,正常数据可以是35。
4.2 极值数据(Extreme Data / Boundary Data)
特征: 数据是有效的,但刚好处于允许范围的上限或下限(边界)上。
用途: 确保系统能正确处理边界情况。程序员常犯“差一错误”(使用 < 而不是 <=)。极值数据能捕捉到这类错误。
示例:如果年龄范围是16到60岁,极值数据就是16和60。
4.3 异常数据(Abnormal Data / Invalid Data)
特征: 数据是无效的,系统验证检查应拒绝这些数据。这包括范围外数据、错误的类型或不正确的格式。
用途: 测试系统验证程序的健壮性及其错误提示功能。我们测试系统是否能有效防止错误数据被录入。
示例:
- 范围外: 年龄5岁或75岁。
- 类型错误: 在数字年龄字段中输入单词“三十五”。
- 长度不符: 对于要求十位数字的电话号码,只输入两位数字。
常见错误警示!
别把极值数据(有效的,会被接受)与刚好在边界之外的异常数据(无效的,会被拒绝)混淆了。
如果范围是10到20:
• 正常:15
• 极值:10, 20
• 异常:9, 21, “猫”
4.4 实时数据(Live Data)的使用
在测试阶段的末尾,特别是从旧系统迁移时,你可能会使用实时数据。
定义: 这是曾经在现有(旧)系统中被使用和处理过的真实数据。
用途: 它提供了一个高度逼真的测试环境,因为它模拟了系统完全投入运作后将会遇到的数据量、种类和复杂性。
注意: 使用实时数据时,必须确保新系统的运行不会影响现有系统的运行,也不会损坏真实且宝贵的数据。这通常发生在并行运行(Parallel Running)期间(一种实施方式,将在下一节讲解)。
5. 测试特定的系统组件
你的测试计划必须确保专门测试你在上一阶段设计的组件:
测试数据结构和文件结构
这能确保数据库或文件设置正确。你需要检查:
- 字段长度是否合适(例如:姓名输入框够长吗)?
- 数据类型是否正确(例如:“价格”是否设置为货币/小数类型)?
- 主键(Primary Key)和外键(Foreign Key)是否在正常维护表之间的关联?
测试输入和输出格式
这涉及检查系统中用户直接接触的部分。
- 输入格式: 检查数据录入表单是否易于使用,且包含所有必要字段。
- 输出格式: 检查报表、屏幕布局和发票的打印或显示是否正确,显示的信息是否准确且排版整齐。
测试验证程序
如测试数据部分所述,你必须系统地检查所有验证程序是否完美运行,包括:
- 范围检查(Range Check): 确保数据在规定限度内。
- 类型检查(Type Check): 确保数据格式正确(例如:仅限数字)。
- 存在检查(Presence Check): 防止用户将必填字段留空。
- 校验位/校验和(Check Digit/Sum): 检测意外的数据输入错误。
核心要点: 开发与测试相辅相成。开发一个模块,然后使用正常、极值和异常数据进行详尽测试。一份结构严谨的测试计划,就是通往成功且无Bug上线的路线图!