软件测试基础学习
注意:
各位同学们,今年本人求职目前遇到的情况大体是这样了,开发太卷,学历高的话优势非常的大,公司会根据实际情况考虑是否值得培养(哪怕技术差一点);学历稍微低一些但是技术熟练的话也不会缺少offer!
为了能拿到满意offer,努力学习吧!!!
基本概念
自动化测试,也叫软件测试自动化。要学习软件测试自动化,首先就需要清楚什么是软件测试。
软件测试
因为当局者迷,旁观者清的道理,软件开发是个复杂而周期性的过程,期间很容易产生或遗留下错误,而对于开发人员自己所编写与开发的应用程序(软件),往往有很多问题是他们自己发现不了,所以如果直接把存在不足的、有错误、有漏洞的应用程序直接运营上线提供给用户使用,那么很可能会给企业带来商业风险或影响企业受益,所以就需要软件测试人员进行软件测试了。
而软件测试(Software Testing)就是为了尽快尽早地发现软件的各种软件缺陷而展开的贯穿整个软件生命周期、对软件(包括阶段性产品)进行验证和确认的活动过程。这个过程是在规定的条件下对程序进行测试操作并对其是否能满足设计要求进行评估,以达到发现、纠正程序错误,衡量和提升软件质量的目的。通俗点说,软件测试就是通过各种各样的手段或工具来尽可能的找到软件的不足和错误。
软件测试只能查找出软件中的错误或不足,但不能证明程序中没有错误,而且软件测试不能完全消灭软件的错误,只能尽早尽量多的发现软件中的错误与不足。
软件生命周期是指从软件产品的可行性分析到软件不再使用而结束的时间。如果把软件看成是有生命的事物,那么软件的生命周期可分为6个阶段:需求分析、计划、设计、编码开发、测试、运行维护
测试分类
软件测试从不同的角度有着不同的分类方式。

在实际开发中,往往我们都是根据实际情况采用多种不同的测试手段、测试方式来对软件测试测试的。
软件缺陷
软件缺陷,通常又被叫做bug或者defect,即为软件或程序中存在的某种破坏正常运行能力的问题、错误,其存在的最终表现为用户所需要的功能没有完全实现,不能满足或不能全部满足用户的需求。
-
从产品内部来说,软件缺陷是软件产品开发或维护过程中所存在的错误、误差等各种问题。
-
从产品外部来说,软件缺陷是系统所需要实现的某种功能的没有或不足。
出现原因
bug出现的原因一般有如下几种情况,也就是说符合以下情况的问题都属于bug:
| 原因 | 描述 |
|---|---|
| 功能遗漏 | 软件未实现用户或产品需求要求的或应有的功能。 |
| 异常错误 | 软件出现了不应该出现的错误。 |
| 功能冗余 | 软件出现了用户或产品需求没有要求的功能。 |
| 体验度低 | 软件的使用过程过于复杂或难以理解、软件运行缓慢导致用户体验不好。 |
缺陷管理
缺陷管理也叫bug管理,一般会集成到项目管理工具中,常用的项目管理工具:Teambition、禅道、pingcode、飞书、钉钉等。大部分的项目管理工具内置的缺陷管理功能都会对缺陷划分成不同类型、严重等级、优先级别,以及不同的状态。
缺陷类型
| bug类型 | 描述 |
|---|---|
| 功能缺陷 | 软件中的功能没有实现或不完善而导致 使用过程出现异常错误、逻辑错误等问题。 |
| 界面缺陷 | 用户界面外观缺失或不足,影响了用户正常使用的问题。 如:名称过长时被遮挡、文字部分被遮挡、图片只展示部分等。 |
| 需求缺陷 | 需求规格说明书未明确或存在遗留需求的问题。 |
| 性能问题 | 不满足系统可测量的属性值,如执行时间、处理速度等。 如:一个功能被用户使用时没有响应,或需要用户等待时间过久等。 |
| 接口缺陷 | 与其他组件、模块或程序、调用参数或参数列表等不匹配、出现冲突问题。 如传参个数与接口不匹配、传参类型与接口不匹配等。 |
| 兼容性缺陷 | 软件运行环境不匹配的问题 如操作系统、浏览器、网络环境等不匹配 |
| 易用性缺陷 | 新用户对软件难以快速熟悉或难以快速上手使用的问题。 |
| 代码错误 | 不满足需求、功能实现错误;对产品或项目质量有影响的bug |
| 配置相关 | 由于提供的配置不当或者配置不能够满足实际要求而出现的问题 |
| 安装部署 | 由于部署安装引起的问题 |
| 安全相关 | 出现安全隐患问题,如存在SQL注入,xss攻击等。 |
| 标准规范 | 不符合相关的国际、国家标准规范或业界规范等 |
严重等级
| 等级 | 描述 |
|---|---|
| 致命缺陷(S1) | 软件任何一个主要功能完全丧失,用户数据受到破坏,软件崩溃、 悬挂或者危及用户人身安全。如软件崩溃造成硬件设备漏电等 |
| 严重缺陷(S2) | 软件的主要功能部分丧失,数据不能保存,软件的次要功能完全丧失, 系统所提供的功能或服务受到明显的影响。如软件的某个菜单不起作用 |
| 一般缺陷(S3) | 软件的次要功能没有完全实现,但不影响用户的正常使用。 如软件内的某些内容输入有误或无法输入。 |
| 较小缺陷(S4) | 用户体验不好或操作不方便,但不影响功能使用和运行。 如软件内出现错别字或排版有问题等。 |
优先级别
| 优先级 | 描述 |
|---|---|
| 立即解决(P1) | 针对软件的致命缺陷,往往需要立即修复。 |
| 优先解决(P2) | 针对软件的严重缺陷,影响了测试,需要优先修复。 |
| 等候解决(P3) | 针对软件的一般缺陷,需要正常排队等待修复。 |
| 建议解决(P4) | 针对软件的较小缺陷,可以在开发人员有时间时再进行修复。 |
生命周期
从发现bug到关闭bug的这个时间段,我们称之为缺陷(bug)的生命周期。

在整个bug处理的流程上,一般会把bug划分成多个不同状态。
| 状态 | 描述 |
|---|---|
| 新建(New) | 当bug首次被发现时,测试人员会确认并记录下来,并将bug的状态为New |
| 已指派(Assigned) | 当bug被指认为New之后,将其传递给开发组,开发组将确认这是否是bug,如果是则开发组的leader会将bug指派给某位开发人员处理,并将bug的状态 设定为“Assigned”。 |
| 重新指派(Reassigned) | bug被重新指派给某位开发人员处理处理。 |
| 已打开(Open) | 一旦开发人员开始处理bug,就将bug的状态设为“Open”。 |
| 已修复(Fixed) | 当开发人员进行处理(并认为已经解决)之后,就可以将bug的状态设置为“Fixed”并将其提交给开发组leader,然后leader将bug返还给测试组。 |
| 等待再测试(Pending Reset) | 当bug被返还到测试组后,会将bug的状态设置为“Pending Reset” |
| 再测试(Reset) | 测试组的leader将bug指定给某位测试人员进行再测试,并将bug的状态设置为“Reset”。 |
| 已关闭的(Closed) | 如测试人员经过再次测试之后确认bug已被解决,会将bug的状态设置为 “Closed”。 |
| 再次打开的(Reopen) | 如果经过再次测试发现bug仍然存在的话,测试人员将bug再次传递给开发组,并将bug的状态设置为“Reopen” |
| 拒绝中(Pending Reject) | 如果测试人员传递到开发组的bug被开发组认为不是bug时,这种情况下开发组可以拒绝,将bug的状态设置为“Pending Reject”并返还给测试组。 |
| 被拒绝的(Rejected) | 测试组的负责人接到拒绝的bug时,如果发现并不能算作bug时,测试组负责人将bug的状态设置为“Rejected”。当然,无法重现,bug信息不足或重复的bug,有时候也会被拒绝。 |
| 延期(Postponed) | 对于一些特殊的bug的测试需要搁置一段时间,这种情况下,bug的状态就被设置为“Postponed“。 |
缺陷报告
缺陷报告,也叫bug报告,是软件测试人员重要的产出物之一,也是主要工作之一。一份高质量的缺陷报告可以帮助开发人员快速定位问题,修复Bug;也便于测试人员对缺陷进行统计、分析和跟踪管理,是测试人员和开发人员重要的沟通工具。开发中针对需求,测试bug,最怕的就是口口相传。
缺陷报告的基本组成:缺陷ID,缺陷标题,发现者,前置条件,是否可重现,操作系统,发现时间,所属项目,所属模块,所属版本,缺陷状态,严重等级,优先级别,附件描述,重现步骤,预期效果,实际效果等。注意:加粗部分为BUG六要素。
参考模板:

缺陷报告就是软件测试的结果产出物,而如何验证和测试缺陷?那就要继续往下学习更多内容了。
测试原则
| 原则 | 描述 |
|---|---|
| 测试显示软件存在缺陷 | 测试只能证明软件中存在缺陷,但并不能证明软件中不存在缺陷,即零缺陷是不可能的。 软件测试是为了降低存在缺陷的可能性,即便是没有找到缺陷,也不能证明软件是完美的。 |
| 穷尽测试是不可能的 | 现在软件的规模越来越大,复杂度越来越高,想做到完全性的测试是不可能的。 测试人员可以根据严重等级、优先级、场景、目的来分类别进行集中和高强度的测试,从而保证软件的质量。 |
| 测试尽早介入 | 测试人员越早介入软件开发流程越好,最好在需求阶段就开始介入,使缺陷在需求或设计阶段就被发现, 缺陷发现越早,修复的成本就越小,反之,越晚发现修复成本就越高。 |
| 缺陷存在集群现象(二八定律) | 80%的缺陷往往存在于20%的模块中。一般项目复杂功能往往会占据所有功能的20%左右,而这20%的复杂功能往往有可能会包含大部分的缺陷。一个功能模块发现的缺陷频率越高,那存在的未被发现的缺陷出现频率也越高,故发现的缺陷与未发现的缺陷成正比。 |
| 杀虫剂悖论 | 反复使用相同的杀虫剂会导致害虫对杀虫剂产生免疫而无法杀死害虫,软件测试也一样。如果一直使用相同的测试方法或手段,可能无法发现新的bug。为了解决这个问题,测试用例应当定期修订和评审,增加新的或不同的测试用例帮助发现更多的缺陷。 |
| 测试依赖于环境 | 测试在不同环境(操作系统,浏览器,解释器)下是不同的。所以不应该以完全相同的⽅法去测试两个不同的系统。 |
| 不存在缺陷的谬论 | 与第一条类似,期望仅仅发现并修复⼤量缺陷就能确保系统的成功,这是⼀个谬论。 |
测试自动化
著名的敏捷开发布道师 Mike Cohn(迈克·科恩) 在他的着作《Succeeding with Agile》(中文名:《Scrum敏捷软件开发》)一书中提出了测试金字塔的概念。
根据 Mike Cohn 的测试金字塔,测试的组合应该至少由以下三层组成 (自下往上分别是):
-
单元测试(Unit Tests)
-
服务测试(Services Tests)
-
用户界面测试(UI Tests)
意思是,应该把测试不同粒度的测试分布到整个软件不同层次中,而随着层次越高,编写的测试内容应该越少,也就是写许多小而快的低层次单元测试,适当写一些更粗粒度的中层次接口测试或集成测试,写很少的高层次UI测试、系统测试或验收测试。
所以,根据测试金字塔理论,接下来我们按部就班对测试自动化的内容进行学习。
代码示例(昨天刚学的断言语句):
# 以下是要测试的函数,这个函数将两个数字相加
def add_numbers(a, b):return a + b# 以下是单元测试的示例
import unittestclass TestAddNumbers(unittest.TestCase):# 在setUp中进行一些初始化操作,如果需要的话def setUp(self):# 在这里可以添加一些准备工作,例如设置测试环境pass# 编写测试用例:测试两个正整数相加是否正确def test_add_positive_numbers(self):result = add_numbers(3, 5)self.assertEqual(result, 8) # 使用assertEqual断言来检查结果是否等于预期值# 编写测试用例:测试负数相加是否正确def test_add_negative_numbers(self):result = add_numbers(-2, -4)self.assertEqual(result, -6)# 编写测试用例:测试零相加是否正确def test_add_zero(self):result = add_numbers(0, 0)self.assertEqual(result, 0)# 在tearDown中进行一些清理操作,如果需要的话def tearDown(self):# 在这里可以添加一些清理工作,例如关闭测试环境passif __name__ == '__main__':unittest.main()
运行结果:

相关文章:
软件测试基础学习
注意: 各位同学们,今年本人求职目前遇到的情况大体是这样了,开发太卷,学历高的话优势非常的大,公司会根据实际情况考虑是否值得培养(哪怕技术差一点);学历稍微低一些但是技术熟练的…...
移动手机截图,读取图片尺寸
这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下,我们都曾遇到过这样的情况:相机拍摄出来的照片、网络下载的图片,尺寸五花八门,大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片,让它们更…...
服务器应用程序不可用的原因是什么引起的
服务器应用程序不可用的原因是什么引起的 服务器应用程序不可用的原因是什么引起的?其实服务器应用程序不可用可能是由多种原因引起的。主要包括软件故障、网络问题、硬件故障、安全问题、配置错误、容量不足、数据库问题等,具体详细服务器应用程序不可用的原因如下…...
使用SPY++查看窗口信息去排查客户端UI软件问题
目录 1、使用SPY++查看窗口的信息 2、使用SPY++查看某些软件UI窗口用什么UI组件实现的...
Flink CDC MySQL同步MySQL错误记录
1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1:Encountered “(” 处理方法:去掉int(11),改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…...
深入了解 Linux 中的 AWK 命令:文本处理的瑞士军刀
简介 在Linux和Unix操作系统中,文本处理是一个常见的任务。AWK命令是一个强大的文本处理工具,专门进行文本截取和分析,它允许你在文本文件中查找、过滤、处理和格式化数据。本文将深入介绍Linux中的AWK命令,让你了解其基本用法和…...
【RuoYi项目分析】网关的AuthFilter完成“认证”,注意是认证而不是权限
文章目录 1. 功能介绍2. AuthFilter的配置3. AuthFilter实现分析4. 资料参考 过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。 注意是“认证检查”,而不是“权限” 1. 功能介绍 1、在用户完成登录后,程序会把用户相关…...
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中
excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中 import pandas as pd import ositems os.listdir("./") sheetname"" for item in items:if item.__contains__(xls):dfpd.read_exc…...
IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了
找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性,找到其位置 管理员模式打开cmd命令行,并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因:由于某…...
使用VBA实现快速模糊查询数据
实例需求:基础数据保存在Database工作表中,如下图所示。 基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。 在Search工作表B1单元格输入查询关键字Title和Genre字段中搜索关键字,包…...
spring boot flowable多人前加签
1、前加签插件 package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser; import com.xxx.commons.ApplicationContextHolder; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.co…...
结构体运算符重载
1.降序 struct Point{int x, y;//重载比较符bool operator < (const Point &a) const{return x > a.x;//当前元素大时,是降序} };2.升序 struct Point{int x, y;//重载比较符 // bool operator < (const Point &a) const{ // return x…...
幽默直观的文档作者注释
注释是程序中非常重要的一部分,在不同的编程语言中,注释的风格和语言描述会有所不同。以下是一些常用的注释风格和语言描述: 直观注释:这种注释使用简洁、明了的语言,帮助读者快速地理解代码。例如,代码中…...
前端开发网站推荐
每个人都会遇见那么一个人,永远无法忘却,也永远不能拥有。 以下是一些可以用来查找和比较前端框架的推荐网站: JavaScript框架比较: 这些网站提供了对不同JavaScript框架和库的详细比较和评估。 JavaScripting: 提供了大量的JavaS…...
【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录 目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...
python自动解析301、302重定向链接
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下: import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...
【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO
opencv 打不开视频的原因 在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…...
Python实用技术二:数据分析和可视化(2)
目录 一,多维数组库numpy 1,操作函数: 2,numpy数组元素增删 1)添加数组元素 2)numpy删除数组元素 3)在numpy数组中查找元素 4)numpy数组的数学运算 3,numpy数…...
24Hibench
1. Hibench 官网 HiBench is a big data benchmark suite that helps evaluate different big data frameworks in terms of speed, throughput and system resource utilizations. It contains a set of Hadoop, Spark and streaming workloads, including Sort, WordCou…...
VC++父进程交互式操作子进程标准输入输出
父进程接管子进程的标准输入输出和错误,实现对子进程的交互操作。比如子进程是一个类似mysql这种可以交互的命令,执行操作后输出结果,父进程根据结果分析决定执行下一步的命令,从而替代人工的输入。 通过父进程创建子进程,使用管道重定向子进程的输入输出错误可以实现 在 …...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...
