作者:禅与计算机程序设计艺术
1.简介
为什么写这个系列
最近越来越多的人开始关注程序员的职业生涯、收入水平以及成长速度等指标。但是,另一个很重要的方面却不被重视——软件质量和可靠性问题。究其原因,主要是缺乏相关技能的软件工程师普遍认为自己的工作压根就没有考虑到这一点。所以,笔者希望通过教授这些基础的软件测试知识技能,让更多的软件工程师能够保障自身业务的顺利运行,并能够更好地提升个人能力。
什么是软件测试?
软件测试(Software Testing)是指对计算机软件或硬件产品等系统进行测试,目的是为了发现、改善、优化软件在使用过程中的功能、性能、稳定性及安全性。它包括但不限于功能测试、回归测试、冒烟测试、单元测试、集成测试、验收测试、系统测试等。 软件测试是一个持续性的过程,包括计划、设计、执行、报告等环节。它的目的在于检查软件是否满足需求、性能标准、合规要求、健壮性、兼容性等标准。如果软件测试成功,将产生一份详细的测试报告。该报告应包括针对每个用例的测试结果、错误类型、严重程度、修复措施、相关人员等信息。
为什么需要软件测试?
1.防止软件开发出现大范围故障或意外 2.提高软件开发质量 3.保证软件可靠性和可用性 4.降低软件开发成本 5.维护产品的质量和服务水平
怎么做?
软件测试分为手动测试和自动化测试两种方式。
1.手动测试:这种方法较简单直接,一般只需参加现场测试人员的培训或导师指导,根据产品的特点,制作测试计划、任务、脚本、环境配置、测试工具等,然后由测试人员按照计划独立完成测试。
2.自动化测试:自动化测试也称为自动测试、离线测试、无界面测试等,这种方法使用专门的测试工具,自动读取、处理数据、调用接口,通过判断测试条件是否满足,确定测试结果,从而提升软件测试效率。
其中,自动化测试又分为四个阶段:编码、构建、测试、部署。
1.编码:编写测试用例和测试计划。 2.构建:利用自动化框架搭建测试环境、构建测试用例执行环境。 3.测试:自动化测试工具自动运行测试用例,获取测试结果。 4.部署:测试报告生成、部署上线前的bug跟踪和问题分析。
软件测试的重要组成部分是测试策略、测试方案、测试工具、测试流程和测试环境。其中,测试策略是指对测试对象、测试范围、测试的目标和难点等进行综合规划,形成一整套测试方案;测试方案是指对测试用例、测试脚本等细致入微的规划和设计;测试工具是指测试过程中需要使用的各种自动化测试工具、测试框架;测试流程是指测试组织结构、测试方法、测试步骤等;测试环境是指测试设备、测试工具的安装位置、网络拓扑情况等。
2.基本概念术语说明
1.单元测试(Unit Test)
单元测试是指对软件中的最小可测试单元进行测试,是最基本的测试形式。单元测试可以帮助我们验证某个函数、模块或者类中各个分支的正确性。如,我们写了一个函数add_numbers(x,y)用来计算两个数字的和,那么可以定义几个单元测试用例,比如:
- add_numbers(2,3) 的输出应该是 5
- add_numbers(-1,2) 的输出应该是 1
- add_numbers(0,-5) 的输出应该是 -5
- ...
这样,我们就可以保证函数的正确性。
2.集成测试(Integration Test)
集成测试是指多个模块、组件或者子系统的集合体进行集成测试,目的是发现不同模块、组件之间的交互作用以及组合后系统的行为。如,我们要开发一个电商网站,包括了订单模块、商品模块、支付模块等。我们可以通过集成测试的方式,把三个模块整合起来,确认它们之间是否能正常交互。
3.自动化测试(Automation Test)
自动化测试是指通过脚本语言、编程框架等方式,让测试人员用少量的代码就能完成大量的测试。相对于传统的手工测试,自动化测试可以大大减少测试的时间,提高测试效率。如,你可以使用Python语言编写自动化脚本,调用Selenium WebDriver框架进行UI自动化测试,让测试人员不需要手动点击按钮,即可完成测试。
4.自动化测试框架
自动化测试框架是指一些开源项目或商业公司提供的自动化测试解决方案。它们往往已经帮你封装好了常用的测试用例,你只需要根据文档和示例代码添加少量代码,就可以快速开始测试。如,你可以选择使用JUnit、TestNG、Robot Framework等测试框架。
5.端到端测试(E2E Test)
端到端测试是指整个系统的输入-输出路径都进行测试,而不是只测试某个小功能。端到端测试可以确保系统的所有功能按预期工作。例如,你想测试一款手机APP,你需要模拟器进行端到端测试,包括用户注册、登录、购物、交易等场景,确保手机APP的各项功能都正常工作。
6.白盒测试(White Box Test)
白盒测试,也叫结构测试,是一种测试方法,用于评估软件内部结构和功能,是基于代码实现的。白盒测试的目的是找到程序中的缺陷,以便随时保持软件的可靠性和安全性。白盒测试是全面的测试,它可以在很大程度上了解代码的运行机制。它首先需要设计测试计划,明确测试目标,制定测试方案。然后,编写测试脚本,进行测试,再根据测试结果反馈问题,迭代更新测试方案。如,你可以用Java编写测试用例,调用Mockito框架模拟输入输出,再执行测试用例,查看测试结果是否符合预期。
7.黑盒测试(Black Box Test)
黑盒测试,也叫功能测试,是一种测试方法,用于评估软件外部表现,是基于功能特性的。黑盒测试主要通过观察程序运行的结果,来判断程序是否满足某些特定功能要求。黑盒测试是半结构化的测试,因为它无法知道程序的内部工作原理。它只需要关注功能需求和边界条件,并且不会改变代码的任何功能。如,你需要测试一款手机APP,你也可以进行黑盒测试。即,用真实设备(真机或模拟器)进行测试,观察APP的响应时间、页面跳转、登录逻辑是否正常,等等。
8.负载测试(Load Test)
负载测试是一种性能测试方法,其目的在于衡量软件系统在特定负载下的性能、稳定性及资源消耗等。如,你需要测试一款手机APP的稳定性,你就可以进行负载测试。这里,我们可以指定不同数量的用户访问相同的APP,看看它是否能够承受住高并发请求。
9.压力测试(Stress Test)
压力测试是一种性能测试方法,其目的在于发现软件在压力下会发生什么样的问题。压力测试可以让软件在极端情况下表现出异常,找出系统最大瓶颈。如,你想要测试一款手机APP的弹性,你就可以进行压力测试。
10.冒烟测试(Smoke Test)
冒烟测试是一种单元测试方法,主要用于发现程序运行中的错误。冒烟测试在开发周期初期,进行程序的简单测试,以保证关键功能的完整性。如,你要发布一款新应用,进行冒烟测试就是比较好的做法。
11.功能测试
功能测试是在给定输入情况下,观察程序的输出是否正确。如,你需要测试一个电商网站的功能,你就可以设计相应的测试用例,比如登录、注册、搜索商品、加入购物车、结算订单、支付等。
12.回归测试(Regression Test)
回归测试是对已经存在的功能、模块、软件等进行测试,目的是查找之前的错误和漏洞,确保软件的稳定性和可靠性。如,你需要测试一款手机APP的质量,你就可以设计回归测试用例,比如登录页、首页、详情页的正常显示,商品列表页的筛选排序,购物车的同步、结算等。
13.负面测试案例
- “功能不正确”:产品经理向你提出了一个新的功能需求,但你觉得不足以体现产品的价值。
- “功能缺失”:产品经理突然说道“我们需要增加一项功能”,但你觉得哪里还有功能没写呢。
- “界面布局混乱”:产品经理向你展示了一个新的网页设计,但当你打开后发现结构又混乱了。
- “产品缺陷”:客户向你反映了一个严重的软件问题,但你觉得不是你的问题,因为你觉得是他们的问题。
- “设计缺陷”:设计师花了很大的心思设计了一张好看的图片,但它并不能实现想要的效果。
- “接口规范不一致”:开发人员的API设计人员说服了你们一起协同开发,但最后导致系统接口混乱,无法实现需求。
- “兼容性问题”:你修改了一些代码,但由于依赖关系导致其他功能不能正常运行。
以上几种问题都是负面测试案例。正面测试案例则有:
- “功能正确”:产品经理向你提出了一个新的功能需求,你觉得这是一项重要功能,并且你已完成对功能的实现。
- “界面美观”:产品经理向你展示了一个新的网页设计,你一眼就认出来这是一个漂亮的界面。
- “解决客户问题”:客户向你反映了一个严重的软件问题,你回复他是因为你修正了这部分代码,现在就可以正常运行了。
- “产品稳定性”:你一天天地在写代码,使得软件的性能、稳定性得到持续提升。
- “接口规范统一”:开发人员的API设计人员按照共同的协议来设计接口,最后所有的功能都能正常运行。
- “功能实现完整”:设计师精心设计了一张漂亮的图片,而且按照要求实现了所有功能。