原文: What is Software Testing? A Beginner's Guide

软件测试在软件开发全流程中占据重要地位,协助生产过程降本增效。

同时软件测试又是一个复杂且难懂的话题。

在本文中,我将介绍软件测试的主要环节,以及这些环节如何协助开发。

目录

什么是软件测试?

软件测试就是确保软件或者应用程序正常运行的过程,测试方法种类繁多,方法不同需求也不同。

例如,单元测试需要编写测试用例验证代码是否存在缺陷;β测试需要回测历史版本确保既有功能的正常使用。

软件测试是软件开发生命周期的重要组成部分,协助提升开发效率和产品性能,打造符合要求的优质产品。

此外,测试还能降低缺陷率,降低开发成本投入,缩短开发时间。

软件测试分类

软件测试主要有两类:

功能测试

功能测试是验证系统是否按照客户需求或者规范运行。

这类测试旨在验证每个功能正确输入后会有对应的正确输出。

例如,编写一条测试创建用户的测试用例,用例中包含邮箱地址、姓名和密码等格式正确的输入内容,验证成功创建用户。

功能测试就是根据功能需求,模拟业务场景,验证功能的正常使用。

非功能测试

非功能测试是验证终端用户的使用体验,如压力测试下的性能表现与稳定性,这对用户体验至关重要。

用户可能无法直观感知到非功能测试发现的代码问题,但也是系统中的重点问题。

非功能测试就是测试加压后软件会如何响应。

本文中,我们将聚焦阐述功能测试的内容。

功能测试类型

功能测试有很多类型,每一个都对应具体的目标,下文会简要介绍所有的类型。

单元测试

最小可测试代码称为一个单元,单元测试是验证每一个可独立运行的代码块如何运行及运行的准确性。

目的是测试软件中的每一单元准确运行出所需要的结果。单元测试由开发人员在软件开发过程中自主完成。

单元测试可以发现独立代码模块内可能存在的各种缺陷。独立的函数、方法、过程、模块及对象都可作为一个单元。

使用Python编写的单元测试的代码片段
使用Python编写的单元测试的代码片段
使用Java编写的单元测试的代码片段
使用Java编写的单元测试的代码片段

集成测试

软件测试的第二阶段,即完成单元测试后,需要进行集成测试,验证软件中的各个组件或者功能可以准确地联动运行。

测试独立单元或者组件组合成的完整功能,主要关注各单元或组件的交互中是否存在缺陷。

系统测试

系统测试是测试整个完整的系统,旨在验证软件是否按照具体需求运行。

系统测试时,质量保证(QA)团队在真实的集成环境中验证APP或软件的每个部分运行是否正常。

验收测试

验收测试是测试软件是否已达到可验收的标准,验证已完成的功能是否符合业务需求并且评估是否可交付。

在正式环境测试系统功能是否符合用户的需求、要求以及业务流程,目的是判断软件是否满足验收标准,用户或者客户是否愿意使用。

验收测试是在完成系统测试后,在产品发布之前的测试步骤,是软件测试的最后一项流程。

回归测试

回归测试是软件增加新功能后,验证现有功能按照既定需求运行。当相关代码产生变动,如在项目中新增一个模块后,需要回归测试。

回归测试使用所有已执行的历史测试用例再次测试,验证现有功能依然能够准确运行。

α测试与β测试

α测试是验收测试的一个环节,属于交付客户前的初次验证测试,通常由QA(质量保证)测试人员或者团队在公司内部完成。

β测试是验证测试的第二环节,将会在外部公网完成测试。

这一阶段将会把β测试版本发到真实生产环境,仅限部分特定人员可以点击查看。例如,freeCodeCamp的数据课程点击这里可以获取。

软件测试原则

每个技术工作都有原则,这些条例将会有利于你打造更好的软件产品,减少缺陷的产生。

下面列出的几个写测试用例时需要遵循的软件测试原则:

测试是证明存在缺陷,而不是确保没有缺陷

软件测试的目的是指出软件的缺陷,尽量减少缺陷存在的可能性。

各种类型的测试都无法保证软件不再存在缺陷,只是协助开发人员知道并定位缺陷,减少缺陷的保有量。

无法做到穷举测试

穷举测试测试是指列出所有可能的输入或者前提条件测试软件

这个方法是不现实的,因为所有的测试用例都是以软件是正确的为基础,验证每一条测试用例的输入条件都会得到正确的输出结果。如果想要测试软件的所有内容,需要耗费大量的时间与精力,实用性并不高。

尽早介入测试

尽早测试有利于避免小缺陷(bug),而且在软件开发生命周期的早期找到的缺陷,往往修复缺陷的成本比较低,所以测试应该从软件项目伊始就介入。

缺陷聚集效应

缺陷聚集效应是指大部分的缺陷集中在应用程序或者软件的几个功能中。如果找到了问题集中出现的功能模块,你可以重点测试该模块。

在测试时需要牢记二八法则:80%的缺陷往往集中于20%的功能模块。

警惕杀虫剂悖论

该原则的理论背景是在农作物上使用的杀虫剂越多时,农作物上的害虫抗药性就会越强,最终杀虫剂就会失效。

同理,如果一直使用既有的测试用例,发现的新缺陷只会越来越少,所以需要不断地更新测试用例并使用最新的测试用例验证软件。

测试与需求文档高度关联

测试的基础是关联各类文档,根据功能需求文档验证测试软件的功能是否符合需求。

测试时需要根据软件的功能目的选择测试方法,因为不同的应用程序会有不同的功能,所以并不是所有的软件共用同一套测试方法。

例如,当测试电商网站的APP时,功能侧重商品展示,所以需要重点测试终端用户的商品页展示;当测试接口时,测试的重点是服务端被请求时,接口的响应返回情况。

这两种情况肯定不能使用相同的测试用例,这就是测试与需求文档高度关联。

无错误谬论

一款基本完美无缺陷但不符合用户需求的软件,对终端用户来说,是不适用的。

所以,测试时要明确一点,基本完美无缺陷的软件需要匹配用户需求,测试用例不仅是测试代码的问题,而且应该是以用户使用习惯或者潜在使用可能为导向测试软件,这在测试环节中非常重要的原则,

而满足这个原则的最佳方式就是进行β测试。

为什么需要软件测试?

软件测试既可以确保软件无缺陷以及达到用户需求,还有另外的优势。

优化安全性能

网络安全是在构建软件时是非常重要的环节,因为黑客可以恶意攻击存在安全漏洞的软件窃取相关信息,用户信息就可能泄露。

经历过测试的产品会让终端用户觉得这是一款安全可靠的产品,他们的信息不会被泄露。所以用户会更倾向于通过软件测试的无安全漏洞问题的软件。

改善产品质量

在构建软件产品代码阶段就引入测试用例和其他测试方法,找到潜在问题,打造无缺陷、低风险、长期稳定运行的软件或者产品。

而且在测试时才会知道产品质量如何,通过测试可以发现非稳定复现的缺陷或者痛点问题,然后修复这些缺陷,在发布正式环境前尽可能打造一个最佳的产品版本。

提高客户满意度

这就像你下载一个新APP后,结果使用时出现了报错,没有办法继续使用,最终可能导致你不会再使用这个APP。

这就是软件测试重要性的实际体现,软件发布正式环境交付用户使用前,通过测试可以发现类似的缺陷,同时也是给开发人员一次机会避免出现这样的问题。

早期开发阶段引入软件测试,也是给用户展示你重视用户体验的一种方式,有助于建立稳定长久的客户关系。

节省成本

软件测试可以帮助你节省很多成本,开发环节的每个阶段都包含了许多事情,比如多团队间的明确沟通与合作,每一步都会有非常长的代办清单,随时都有可能出现混乱。

如果在产品周期内出现了这样的问题是非常棘手的,因为需要你同时处理人员关系,重新分配任务并且定位问题的本质。

同时,在修复问题时用户是没有办法使用APP的,不但违背了产品初衷而且还造成了不良的用户体验。软件测试可以解决这一系列的问题,并且持续测试的话,用户可以体验到最佳的产品。

总结

总的来说,软件测试是开发环节中非常重要的一环,不仅可以让团队避免很多问题,还可以让用户使用到体验感良好且没有缺陷的产品。

如果你对软件测试感兴趣的话,可以点击这里查看freeCodecamp的质量保证课程学习更多的质量保证(QA)内容。QA人员就是专注测试软件或者APP缺陷的科技工作者。