开发与测试:确保我们的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,即修复问题)提供明确步骤。

优质测试计划的组成部分:

对于每一个测试用例,你必须定义四个关键要素:

  1. 测试数据(Test Data): 你将输入到系统中的数据。
  2. 预期结果(Expected Outcomes): 系统应该产生的结果。这是通过手动计算或事先预测得出的。
  3. 实际结果(Actual Outcomes): 输入测试数据后,系统实际产生的结果。
  4. 测试后的补救措施(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上线的路线图!