Skip to content
🗂️ 文章分类: 软考  
🏷️ 文章标签: 软考  
📅 文章创建时间: 2026-08-27
🕘️ 文章最后更新时间:2026-08-27

[toc]

系统分析师笔记14_软件实现与测试 ​

该笔记内容来自《系统分析师教程》第2版。

软件实现阶段是将软件设计结果付诸实施的过程。这一阶段的任务包括计算机等设备的购置、设备安装和调试、程序编写与调试等。这个阶段的特点是几个互相联系、互相制约的任务同时展开,因此,必须精心安排、合理组织。软件实现是按实施计划分阶段完成的,每个阶段应写出实施进展报告。

软件测试是软件开发生命周期中的重要阶段之一,旨在检查和验证软件系统的各个方面,以确保其质量、可靠性和功能完整性。

软件测试阶段是确保软件质量和稳定性的关键阶段,可以帮助发现并修复潜在问题,从而为用户提供可靠的产品。

软件实现概述 ​

在信息系统建设中,软件实现的主要任务是进行程序设计,就是把软件设计结果翻译成用某种程序设计语言书写的程序。

作为软件生命周期过程的一个阶段,程序设计是对软件设计的进一步具体化。

程序设计方法 ​

程序设计方法是软件工程方法学的主要内容之一,主要有结构化程序设计、面向对象程序设计和可视化程序设计。

结构化程序设计 ​

结构化程序设计采用自顶向下、逐步求精的设计方法和单入口、单出口的控制结构。在设计一个模块的实现算法时,先考虑整体后考虑局部,先抽象后具体,通过逐步细化,最后得到详细的实现算法。

面向对象程序设计 ​

面向对象程序设计(OOP)是面向对象方法学从诞生、发展到走向成熟的第一片领地,也是使面向对象方法最终落实的重要阶段。

现在,在“00A -> 0OD -> 0OP”的软件工程过程中,0OP的分工就比较简单了。认识问题域和设计系统成分的工作已经在O0A和OOD实现,0OP的工作就是用一种面向对象的程序设计语言把OOD模型中的每个成分书写下来。

由于面向对象程序设计语言具有支持类、对象、继承、多态和消息通信等00概念的机制,OOP可以显著提高软件的可靠性、可维护性和可复用性。

可视化程序设计 ​

目前,程序员可以利用程序设计工具所提供的各种控件,像搭积木一样地构造应用程序的各种界面,这种程序设计方法称为可视化程序设计(Visual Programming,VP)。

VP最大的优点是程序员可以不用编写或只需编写很少的程序代码,就能完成应用程序的设计,从而极大地提高设计人员的工作效率。能进行VP的工具很多,比较常用的有Eclipse、VisualStudio等。

程序设计语言和风格 ​

程序设计语言是人机通信的基本工具,其特点必然会影响人的思维和解题方式,会影响人机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,在进行程序设计之前的一项重要工作,就是选择一种适当的程序设计语言。

良好的程序设计语言能使程序员根据软件设计说明书完成程序设计时困难最少,可以减少所需要的程序测试量,并且可以得出更容易阅读和更容易维护的程序。

编码规范 ​

应用编码规范对于软件本身和软件开发人员而言尤为重要,有以下几个原因:

  • (1)好的编码规范可以尽可能地减少一个软件的维护成本,并且几乎没有任何一个软件在其整个生命周期中均由最初的开发人员来维护。
  • (2)好的编码规范可以改善软件的可读性,可以让开发人员尽快并彻底理解新的代码。
  • (3)好的编码规范可以最大限度地提高团队开发的合作效率。
  • (4)长期的规范性编码还可以让开发人员养成好的编码习惯,甚至锻炼出更加严谨的思维方式。

常见的编码规范有命名规范、格式化规范、注释规范、函数长度规范、错误处理规范、冗余代码规范和通用开发模式规范等。

代码生成 ​

代码生成的实现步骤如下:

  • (1)准备模板:生成文件的模板文件。
  • (2)准备数据:生成文件所需要的关键数据。
  • (3)定义合成机制:使用数据置换模板中的占位符,即生成新的文件的机制。
  • (4)遍历所有的数据文件,在遍历数据的同时加载所有的模板文件。
  • (5)模板+数据=生成的代码文件。

代码重用 ​

软件重用可以分为三个层次,代码重用、设计结果重用和分析结果重用。

其中,代码重用是对现有(已经写好的)代码进行重用,这些代码来自外部资源或过往项目,并用之开发新软件。程序员这样做是为了实现相同或相似的功能。然而,只有高质量的代码(无错或不复杂)才能被重用。

常用的实现代码重用的方法有:

  • (1)使用函数:将代码抽象成函数,这样只需在多个地方调用该函数即可。
  • (2)使用对象:在软件中,将复杂的代码封装成一个个对象,这样代码就可以被重复使用。
  • (3)使用模块:将代码抽象成模块,这样使用者只需调用模块即可实现相同的功能,提高子程序的可重用性。
  • (4)使用类:利用面向对象的思想,将代码封装成类,通过继承和多态可以实现高度复用,把代码封装成复用性高的单元。
  • (5)利用算法:采用解构和分解组合算法可以减少代码重复使用的损耗。

软件测试概述 ​

软件测试的概念 ​

IEEE对软件测试的定义是:使用人工或自动的手段来运行或测量软件系统的过程,目的是检验软件系统是否满足规定的需求,并找出与预期结果之间的差异。

软件测试的发展趋势如下:

  • (1)测试工作将进一步前移。软件测试不仅是单元测试、集成测试、系统测试和验收测试,还有对需求的精确性和完整性的测试,以及对系统设计的测试。
  • (2)软件架构师、开发工程师、质量保证人员、测试工程师的工作将更好地融合。
  • (3)测试职业将得到更充分的尊重。
  • (4)设置独立的软件测试部门将成为未来软件公司的共识。
  • (5)测试外包服务将快速增长,和软件开发外包一样,软件测试外包将呈现全球化的趋势。

软件测试基本问题 ​

软件测试的基本问题是验证功能的实现和可用性,检查程序的错误,最终目的是提高用户体验,以较少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正各种错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患所带来的商业风险。

软件测试的对象及其目的 ​

软件测试的对象包括:源程序/目标代码;各开发阶段的文档(需求规格说明、概要设计说明、详细设计说明及其他相关文档)配置数据。

软件测试的目的包括:

  • (1)从用户角度看的目的:通过软件测试发现隐藏的错误和缺陷,考虑是否可以接受该产品。
  • (2)从开发者角度看的目的:表明软件产品不存在错误,验证软件实现了所有用户的要求。
  • (3)从测试人员角度看的目的:发现错误,预测错误,提供软件可靠性错误,对软件做出评价。

软件测试的原则 ​

软件测试的原则包括以下几个方面:

  • (1)测试用例的一个必要部分是预期输出和结果的定义。用例必须包括程序输入数据的两部分描述和输入数据下程序正确输出的准确描述。
  • (2)程序员应该避免测试他们自己的程序。因为程序员很难以一种“破坏性”的视角来审查自己的程序,就如文档作者在编辑或校对自己的文档时一般无法找出错误的道理是一样的,程序员也存在同样的问题。
  • (3)编写软件的组织不应当测试自己编写的软件。这类似于先前的一个论点,即软件项目或编程组织是一个与单个程序员有相似心理的有机组织,因此需要由更客观和独立的第三方进行测试。
  • (4)应当具有足够的耐心及细心检查每一个测试结果。
  • (5)测试用例不仅应基于有效和预期的输入,而且还应基于通常不会执行的无效和意外输入。当程序以新的或意想不到的方式运行时,软件产品中突然暴露出来的许多问题都会被发现。因此,有必要对不可预见的和无效的输入情况进行测试。
  • (6)应避免重新设计测试用例。当软件需要重新测试时,重新设计用例需要投入大量的工作,所以测试用例的复用性及保留测试用例是有必要的。
  • (7)计划测试工作不应默认假定不会发现错误,这是使用了不正确的软件测试定义的一个迹象。
  • (8)测试不要穷举。穷举是指测试时考虑所有可能的输入值,若在测试过程中穷举所有数据组合需要耗费大量的时间。测试人员需要考虑程序逻辑的全覆盖,并确保程序中使用的所有条件都是可能的,并且以最少的用例达到最大的覆盖率。
  • (9)软件测试要尽早执行。软件生命周期包括软件开发、测试、维护的整个流程,主要包括需求阶段、设计阶段、编码阶段、单元测试阶段、验收阶段和维修阶段。实践证明,在大多数情况下,需求分析阶段会出现缺陷,但维修成本很低,因此软件测试应尽快进行并贯穿整个软件生命周期。
  • (10)软件测试应追溯到需求。软件测试的目标是发现问题。当然,满足用户的需求更为重要。

软件测试方法 ​

按被测程序是否可见,可将软件测试方法分为黑盒测试、白盒测试和灰盒测试;

按是否需要执行被测程序,可将软件测试方法分为静态测试和动态测试。

按被测程序是否可见分类 ​

黑盒测试 ​

黑盒测试又叫功能测试、数据驱动测试或基于需求规格说明书的功能测试。

该类测试注重于测试软件的功能性需求。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。

黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

白盒测试 ​

白盒测试又称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,“盒子”指的是被测试的软件,“白盒”指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。

白盒测试法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。白盒测试法是穷举路径测试。在使用这一方法时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中,逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和修改条件判断覆盖。这6种覆盖标准发现错误的能力呈由弱到强变化。

  • (1)语句覆盖:每条语句至少执行一次。
  • (2)判定覆盖:每个判定的每个分支至少执行一次。
  • (3)条件覆盖:每个判定的每个条件应取到各种可能的值。
  • (4)判定/条件覆盖:同时满足判定覆盖条件覆盖。
  • (5)条件组合覆盖:每个判定中各条件的每一种组合至少出现一次。
  • (6)修改条件判断覆盖:每一个判断的所有可能结果都出现过、每一个判断中所有条件的所有可能结果都出现过、每一个进入点及结束点都执行过、判断中每一个条件都可以独立影响判断的结果。

灰盒测试 ​

灰盒测试是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。

灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。

按是否需要执行被测程序分类 ​

静态测试 ​

静态测试是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,通过对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来发现错误。

静态测试方法通过对程序静态特性的分析,找出欠缺和可疑之处,例如,不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步查错,并为测试用例选取提供指导。

动态测试 ​

动态测试方法是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能。这种方法由三部分组成:构造测试用例、执行程序、分析程序的输出结果。

动态测试的主要目的是确保软件在安装期间和之后都能正常运行,从而确保稳定的应用程序没有任何重大缺陷。

自动化测试 ​

自动化测试(Automated Testing)指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。

自动化测试是将人为驱动的测试行为转化为机器执行的过程。常见的自动化测试包括单元自动化测试、接口自动化测试、UI自动化测试等。

软件测试类型 ​

按测试对象划分 ​

功能测试 ​

功能测试又称为数据驱动测试,只需要考虑要测试的各种功能,不需要考虑整个软件的内部结构和代码。

功能测试一般从软件产品的界面、架构出发,根据需求编写测试用例,输入期望结果和实际结果之间的对比,从而提出使产品更加贴近用户使用的要求。

功能测试的6个步骤为:

  • (1)需求分析人员根据需求对功能进行预期编写。
  • (2)测试工程师在需求分析师给出的执行预期的基础上编写测试案例。
  • (3)测试工程师根据需求分析师给出的执行预期,准备与预期结果相关的必要数据,包括测试所需数据。
  • (4)测试工程师在测试用例的基础上执行测试用例。
  • (5)测试工程师对实际结果与预期结果是否一致,并给出报告报告。
  • (6)需求分析人员根据测试工程师提供的报告来判断一个应用是否满足了用户的需要。

性能测试 ​

性能测试是指测试在不同的情况下软件响应的时间,检查系统是否满足需求规格说明书中规定的性能。

性能测试通过自动化测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。

性能测试又包括负载测试(Load Testing)、压力测试(Stress Testing)、并发测试、容量测试(Volume Testing)、可靠性测试等。注意,负载测试和压力测试可以结合进行。

安全测试 ​

安全测试是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程,主要是测试应用程序层的安全,包括以下两个层面。

  • (1)应用程序本身的安全性
  • (2)应用程序的数据安全

兼容性测试 ​

兼容性测试主要是测试软件之间能否很好地运作,会不会相互影响,软件和硬件之间能否协调发挥出很好的效率来工作,会不会相互影响导致系统崩溃。

兼容性测试的核心内容包括:

  • (1)测试软件能否在不同的操作系统平台上兼容。
  • (2)测试软件是否能在同一操作系统平台的不同版本上兼容。
  • (3)软件本身能否向前或向后兼容。
  • (4)测试软件能否与其他相关软件兼容。
  • (5)数据兼容性测试,主要指数据能否共享。

最常见的兼容性测试是浏览器的兼容性测试,不同浏览器在.css、js解析上的不同会导致页面显示的不同。

界面测试 ​

界面测试主要测试用户界面的功能模块的布局是否合理、整体风格是否一致、各个控件的放置位置是否符合客户使用习惯,此外还要测试界面操作的便捷性、导航是否简单易懂、页面元素的可用性、界面中的文字是否正确、命名是否统一、页面是否美观、文字与图片组合是否完美等,即检查界面是否美观,从风格是否统一、布局是否合理、配色是否合适等方面来进行测试。

易用性测试 ​

易用性是交互的适应性、功能性和有效性的集中体现,又叫用户体验测试。

稳定性测试 ​

稳定性测试是通过长时间运行软件来测试软件是否会出现问题。软件在长时间运行后,是否会出现崩溃、响应慢、内存泄漏等问题。

按测试阶段划分 ​

单元测试 ​

单元测试是指对软件中的最小可测试单元进行检查和验证。

对于单元测试中的单元,要根据实际情况去判定其具体含义。例如,C语言中单元指一个函数,Java中单元指一个类,图形化的软件中单元可以指一个窗口或菜单等。

总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

集成测试 ​

集成测试是指将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。

集成测试主要是针对软件高层设计进行测试,一般来说是以模块和子系统为单位进行测试。

系统测试 ​

系统测试是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。

验收测试 ​

验收测试是部署软件之前的最后一个测试操作,是在软件产品完成了单元测试、集成测试和系统测试之后、产品发布之前所进行的软件测试活动。

它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,并且可以让最终用 户将其用于执行软件的既定功能和任务。

按被测软件划分 ​

App测试 Web测试 物联网测试 车联网测试 大数据测试 AI测试 小程序测试

其他分类 ​

回归测试 ​

回归测试是指修改了旧代码后重新进行测试,以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。

回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行得更加频繁,而在极限编程方法中,更是要求每天都进行若干次回归测试。

冒烟测试 ​

冒烟测试这一术语源自硬件行业,它是对一个硬件或硬件组件进行更改或修复后,直接给设备加电,如果没有冒烟,则该组件就通过了测试。

在软件中,冒烟测试这一术语描述的是在将代码更改嵌入产品的源树之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性。

软件测试的组织 ​

测试过程 ​

软件测试过程主要包括以下几个阶段:

  • (1)项目需求分析阶段:项目需求是整个测试过程的前置条件,也是任何一个测试工作开始前的第一步。所谓项目需求分析,是指测试员分析和确定被测试的项目的测试工作安排,也就是该项目需要测哪些模块,什么样的结果是符合产品需求的预期结果。
  • (2)制订测试计划阶段:测试计划制订阶段的主要任务就是编写完整的测试流程安排,测试哪些模块,用什么方法测试(例如,常见的冒烟测试、随机测试、黑盒测试、性能测试等),以及不同测试阶段的测试人员的工作安排、工作目标等。这个阶段对测试主管的整体测试调控能力有很高的要求。
  • (3)设计测试文档阶段:这个阶段是整个软件测试的基础,也是核心阶段。这个阶段的主要工作是参考项目的设计原型图、产品的设计需求和详细设计标准等编写测试用例。
  • (4)搭建测试环境阶段:不同的产品对测试环境有着不同的要求。能做好软件测试工程师这门工作的一个指标就是能独立搭建项目的测试环境。
  • (5)执行测试阶段:这个阶段就开始正式的测试工作了。一般包括单元测试、集成测试、系统测试、验收测试以及回归测试等。每个阶段对应了不同的测试具体执行细节。
  • (6)缺陷管理:缺陷管理主要是用于收集、管理和沟通项目缺陷的过程,重点考察的是缺陷的识别和缺陷的解决。这个阶段一般会用到一些系统化的缺陷管理工具。

测试管理 ​

软件部署 ​

软件部署环节是指将软件项目本身,包括配置文件、用户手册、帮助文档等进行收集、打包、安装、配置、发布的过程。在信息产业高速发展的时代,软件部署工作越来越重要。

部署目标 ​

软件部署工作的目标具体如下:

  • (1)保障软件系统的正常运行和功能实现。
  • (2)简化部署的操作过程,提高执行效率。
  • (3)必须满足软件用户在功能和非功能属性方面的个性化需求。
  • (4)最重要的是要支持软件运行,满足用户需求,使得软件系统能够被直接使用。

部署步骤 ​

环境准备 软件安装 数据库和文件配置 测试和验证