6.5.3 系统测试
系统测试是在真实系统工作环境下或系统仿真环境下检验完整的软件配置项能否和系统正确连接,并满足系统设计文档的要求。
系统测试原则表现在如下两个方面。
(1)独立性原则。从系统测试的过程来看,需要进行更加深入详细的设计,这样才能够保障当前的系统测试过程和实现的过程更具有可靠性。一般情况下,系统的测试包括对软件和硬件的测试,由于本书中的仓储物流教学管理系统主要是测试软件完整信息的安全和稳定的性能,因此只需要对开发的软件进行测试即可。单元测试主要是针对系统的每一个子模块,对比实际功能与需求功能之间的符合程度,并测试每个模块的功能完成情况,目的在于测试系统各模块功能与需求之间的相符程度,以及各个模块的功能实现是否完整流畅。它还要测试这些模块之间的相互关系,以及系统整体运作时可能出现的问题等。
(2)全面性原则。单元测试对系统的各个子模块进行测试,组合之后再进一步测试系统。集成测试的步骤如下。
①将对系统各个子模块测试结果进行组合,组合后的系统大部分功能可以顺利执行;
②将测试结果与需求分析时的要求进行对比,看系统是否实现了需求中的基本功能;
③对代码中的数据结构、变量等进行测试,以及系统组合后功能执行的误差等能否达到要求进行测试。
系统测试的对象包括源程序、需求分析阶段到详细设计阶段中的各技术文档,管理文档,提交给用户的文档,软件所依赖的硬件、外设,甚至包括某些数据、某些支持软件及其接口等。
随着测试概念的发展,当前系统测试已逐渐侧重于验证系统是否符合需求规定的非功能指标。本书将从功能测试、性能测试、安装测试、可用性测试、压力测试、容量测试、安全性测试、健壮性测试、图形用户界面测试和文档测试这10个方面进行介绍。更多的测试类型及详细内容,建议读者阅读一些专门讲解系统测试的书籍。
(1)功能测试。功能测试是系统测试中最基本的测试,它不管软件内部是如何实现的,而只是根据需求规格说明书和测试需求列表,验证产品的功能是否符合需求规格。
(2)性能测试。性能测试用来测试软件系统在实际的集成系统中的运行性能。因为无论是在单元测试,还是集成测试中,都没有将系统作为一个整体放入实际环境中运行,因此,只有在性能测试阶段,才能真正看到系统的实际性能。
对于实时系统和嵌入式系统,提供符合功能需求但不符合性能需求的软件是不能接受的。性能测试的目的是度量系统相对于预定义目标的差距。需要的性能级别针对实际的性能级别进行比较,并把其中的差距文档化。
(3)安装测试。安装测试用来确保软件在正常情况和异常情况的不同条件下都不丢失数据或者功能,具体测试活动包括首次安装、升级、完整安装、自定义安装和卸载等。测试对象包括测试安装代码及安装手册。安装代码提供安装一些程序能够运行的基础数据,安装手册提供如何进行安装。
(4)可用性测试。所谓可用性测试,即是对软件的“可用性”进行测试,检验其是否达到可用性标准。目前的可用性测试方法超过20种,按照参与可用性测试的人员划分,可以分为专家测试和用户测试;按照测试所处的软件开发阶段,可以将可用性测试划分为形成性测试和总结性测试。形成性测试是指在软件开发或改进过程中,请用户对产品或原型进行测试,通过测试后收集的数据来改进产品或设计,直至达到所要求的可用性目标。形成性测试的目标是发现尽可能多的可用性问题,通过修复可用性问题实现软件可用性的提高。总结性测试的目的是横向测试多个版本或者多个产品,输出测试数据进行对比。(https://www.daowen.com)
(5)压力测试。压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单,不是在常规条件下运行手动或自动测试,而是长时间或超大负荷地运行测试软件来测试被测系统的性能、可靠性和稳定性等。通俗地讲,压力测试是为了发现在什么条件下应用程序的性能会变得不可接受。
性能测试和压力测试常常被人混淆,认为二者是同种测试。其实性能测试和压力测试的测试过程和方法没有太大区别,二者主要的区别在于它们不同的测试目的。
软件性能测试是为了检查系统的反应、运行速度等性能指标,它的前提是要求在一定负载下,例如检查一个网站在100人同时在线的情况下的性能指标,每个用户是否都还可以正常地完成操作等。概括来说就是在负载一定时,测试获得系统的性能指标。
软件压力测试是为了测试系统在异常情况下执行可重复的负载测试,以检查程序对异常情况的抵抗能力,找出性能瓶颈和隐藏缺陷。异常情况主要指峰值、极限值和大量数据的长时间处理等。比如,某个网站的用户峰值为500,则检查用户数为750~100时系统的性能指标。所以概括来说就是在异常情况下,测试获得系统的性能指标。
(6)容量测试。在进行压力测试时,如果发现了被测系统在可接受的性能范围内的极限负载,则在一定程度上完成了容量测试。
容量测试的目的是通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大并发用户数、数据库记录数等),系统在该极限值下没有出现任何软件故障或还能保持主要功能正常运行。或者说容量测试是为了确定测试对象在给定时间内能够持续处理的最大负载或工作量。例如,对于一个从数据库中检索数据的测试,在功能测试阶段,只需验证能够正确检索出结果即可,数据库中的数据量可能只有几十条。但进行容量测试时,就需要往数据库中添加几十万甚至上百万条数据,测试这时的检索时间是否在用户可接受的范围内,并找出数据库中数据数量级达到多少时性能变得不可接受。
容量测试的完成标准可以定义为:所计划的测试已全部执行,而且达到或超出指定的系统限制时没有出现任何软件故障。
(7)安全性测试。安全性测试的目的是验证系统的保护机制是否能够在实际的环境中抵御非法入侵、恶意攻击等非法行为。任何包含敏感信息或能够对个人造成不正当伤害的计算机系统都会成为被攻击的目标。入侵的内容非常广泛,包括仅仅为了练习技术而试图入侵的黑客,为了报复而试图破坏系统的内部雇员,以及为了获取非法利益而试图入侵系统的非法个人,甚至组织。
(8)健壮性测试。健壮性是指在故障存在的情况下,软件还能正常运行的能力。有些人认为健壮性测试就是容错性测试,或者认为容错性测试与恢复测试相同。其实容错性测试与恢复测试是有区别的,而健壮性测试包含这两种测试。健壮性有两层含义:一是容错能力,二是恢复能力。
容错性测试通常依靠输入异常数据或进行异常操作,以检验系统的保护性。如果系统的容错性好,系统只给出提示或内部消化掉,而不会导致系统出错甚至崩溃。
恢复测试通过各种手段,让软件强制性地发生故障,然后验证系统已保存的用户数据是否丢失,系统和数据是否能尽快恢复。
(9)图形用户界面测试。图形化用户接口(Graphic User Interface,GUI)测试包含两方面内容,一是界面实现与界面设计是否吻合;二是界面功能是否正确。为了更好地进行GUI测试,一般将界面与功能分离设计,比如分成界面层、界面与功能接口层、功能层。这样GUI的测试重点就可以放在前两层上。
(10)文档测试。文档的种类包括开发文档、管理文档和用户文档。这三类文档中,一般主要测试的是用户文档,因为用户文档中的错误可能会误导用户对软件的使用,而且如果用户在使用软件时遇到的问题没有通过用户文档中的解决方案得到解决,用户将因此对软件质量产生不信赖感,甚至厌恶使用该软件,这对软件的宣传和推广很不利。