一、计算机软件的发展与分类

软件作为现代信息技术的核心,其发展历程见证了计算机行业的迭代升级。从早期的简单程序到如今复杂的系统,软件的分类也逐渐清晰。

系统软件的发展里程碑

  • 1955-1965 年,典型的操作系统是 FMS 和 IBYS,开启了系统软件的雏形阶段。
  • 1969 年,UNIX 研发推出,为后续操作系统发展奠定了重要基础。
  • 1975 年,UNIX 走出贝尔实验室,开始在更广泛的领域应用。
  • 1981 年,MS-DOS 1.0 发布,推动了个人计算机操作系统的发展。
  • 1984 年,苹果公司发布世界上第一个黑白图形界面操作系统 System 1,改变了人机交互方式。
  • 1985 年,windows 1.0 正式推出,开启了微软在操作系统领域的征程。
  • 1994 年,Linux 1.0 正式发布,开源操作系统开始崭露头角。

应用软件

应用软件是指以操作系统为基础运行的各种 app,它们满足了用户在不同场景下的具体需求,如办公软件、社交软件、游戏软件等。

二、软件测试简介

软件测试并非一蹴而就,而是经历了漫长的发展过程,其概念和内涵也在不断丰富和完善。

早期测试状况

在软件发展早期,软件规模小,复杂程度低,开发过程不规范。当时的测试等同于调试,目的是纠正软件已经知道的故障,投入小且介入晚。

重要发展节点

  • 1957 年:明确测试不等于调试,测试成为一种发现软件缺陷的活动。
    • 调试:在已知错误的情况下,对软件程序代码做出一系列检查、校正的过程。
    • 测试:在未知错误的情况下,检查程序代码是否有问题的过程。
    • 两者区分:软件测试从软件质量保证的角度检查程序代码是否有误,而调试是为了解决当前已知的错误,调试活动无法代替软件测试活动。
  • 1972 年:首届软件测试正式会议召开;Bill 博士对软件测试做出定义,认为测试是建立一种信心,证明程序能按预期设想运行,以正向思维方式验证功能点正确性,被称为第一类方法。
  • 1975 年:软件测试被确定为一种研究方向。
  • 1979 年:Glenford J. Myers (格伦福德・迈尔斯) 提出逆向思维:
    • 测试是为了证明程序有错误,而不是证明程序无错误。
    • 一个好的测试用例在于它能发现至今未发现的错误。
    • 一个成功的测试是发现了至今未发现的错误的测试。
  • 1980 年:质量的概念融入软件测试,测试不再单纯是发现错误的过程,还包含软件质量评价的内容。
  • 1983 年:IEEE 对软件测试的定义为,使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。

软件测试的概念

软件测试是为了发现错误而审查软件文档、检查软件数据和执行程序代码的过程。它应该是对软件形成过程的文档、数据以及程序进行的测试,而不仅是对程序进行的测试。有数据表明,60% 以上的软件错误并不是程序错误,而是分析和设计的错误,因此提倡软件全生命周期测试的理念。

软件测试的意义和目的

  • 意义:为了防止事故,避免造成重大财产损失和人身损失。
  • 目的:
    • 对于软件开发:找到开发过程中存在的问题,包括开发工具、模式、技术等方面的问题与不足,预防下次缺陷的产生。
    • 对于软件测试:使用最少的人力、物力、时间等找到软件中隐藏的缺陷,保证软件的质量,为以后软件测试积累丰富经验。
    • 对于客户需求:检验软件是否符合客户需求。

三、软件测试分类

软件测试可以从不同角度进行分类,常见的分类方式如下:

按照开发阶段分类

  • 单元测试:又称为模块测试,针对软件设计的最小单位 —— 程序模块进行正确性检验。目的是检查每个程序单元能否满足详细设计说明中的模块功能、性能、接口和设计约束等要求,发现各模块内部可能存在的各种错误。单元测试需要从程序的内部结构出发设计测试用例,多个模块可以平行地独立进行单元测试。
  • 集成测试:又叫做组装测试,通常在单元测试的基础上,将所有程序模块进行有序的、递增的测试。集成测试检验程序单元或部件的接口关系,使它们逐步集成为符合概要设计要求的程序部件或整个系统。

图3-1  集成测试示例图

  • 系统测试:将经过测试的软件在实际环境中运行,并与其他系统成分(如数据库、硬件和操作人员等)组合在一起进行测试,用于评估整个系统的行为并确保系统行为符合用户需求。
  • 验收测试:主要是对软件产品说明进行验证,逐行逐字地按照说明书的描述对软件产品进行测试,确保其符合客户的各项要求。

按照测试环境分类

  • α 测试:由一个用户在开发环境下进行的测试,也可以是开发机构内部用户在模拟实际操作环境下进行的测试(只要是模拟的环境测试就是 α 测试)。
  • β 测试:在软件的一个或多个用户的实际使用环境下进行的测试。

按照测试技术分类

  • 白盒测试:通过程序内部结构的分析、检查来寻找问题。它将测试看成一个透明盒子,清楚了解程序结构和处理过程,以此检查软件内部动作是否按照设计说明的规定正常进行。
  • 黑盒测试:通过软件外部表现来发现其缺陷和错误。它把测试对象看成一个黑盒子,完全不考虑程序内部结构和处理过程。黑盒测试是在程序界面处进行测试,检查程序是否按照规格说明书的规定正常运行。
  • 灰盒测试:介于白盒测试与黑盒测试之间的测试。灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种内部关注不像白盒测试那样详细、完整,只是通过一些表现性现象、事件、标志来判断内部的运行状态。

按照软件质量特性分类

  • 功能测试:检查实际软件是否符合用户的需求。一般分为逻辑功能测试、界面测试、易用性测试、安装测试、兼容测试。
  • 性能测试:
    • 一般性能测试
    • 稳妥定性测试
    • 负载测试:通过测试系统在资源超负荷的情况下的表现,来验证系统的负载能力。
    • 压力测试:以设计的最大负载或超过最大负载来运行软件,用于确定系统运行的负载界限。

其他分类

感兴趣可以自己查找,还有例如这些

  • 回归测试
  • 冒烟测试
  • 随机测试

四、软件测试原则

软件测试需要遵循一定的原则,以保证测试的有效性和准确性:

  1. 所有测试的标准都建立在用户需求之上。
  2. 软件测试必须基于 “质量第一” 的思想去开展各项工作,当时间和质量冲突时,时间要服从质量。
  3. 事先定义产品的质量标准,只有有了质量标准,才能根据测试的结果,对产品的质量进行分析和评估。
  4. 软件项目一启动,软件测试就开始,而不是等程序写完才开始进行测试。
  5. 穷举测试是不可能的。即使是一个大小适度的程序,其路径排列的数量也非常大,因此,在测试中不可能运行路径的每一种组合。
  6. 第三方进行测试会更客观、更有效。
  7. 软件测试计划是做好软件测试工作的前提。
  8. 测试用例是设计出来的,不是写出来的,因此需要根据测试的目的,采用相应的方法去设计测试用例,从而提高测试的效率,更多地发现错误,提高程序的可靠性。
  9. 对发现错误较多的程序段,应进行更深入的测试。一般来说,一段程序已发现的错误数越多,软件存在错误的概率也就越大。
  10. 重视文档,妥善保存一切测试过程文档(测试计划、测试用例、测试报告等)。
  11. 回归测试的关联性一定要引起充分的注意,修改一个错误而引起更多错误出现的现象并不少见。
  12. 测试应从 “小规模” 开始,逐步转向 “大规模”。
  13. 不可将测试用例置之度外,排除随意性。
  14. 必须彻底检查每一个测试结果。
  15. 一定要注意测试中的错误集中发生的现象,这和程序员的编程水平和习惯有很大的关系。
  16. 对测试错误结果一定要有一个确认的过程。

通过以上对软件测试的介绍,相信大家对软件测试有了一个较为全面的认识。软件测试在保证软件质量方面起着至关重要的作用,随着软件行业的不断发展,软件测试也将不断完善和发展。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐