一、测试基础
Q1:测试流程包含哪些关键步骤?
-
答:需求分析→测试计划→用例设计→执行测试→缺陷管理→测试报告,需结合具体案例说明各阶段输出物。
需求分析案例题:给你一个带有logo的水杯,你会如何去测试?(测试思维)
分析:
功能:装水、是否漏水、装热水、冰水、茶水、饮料、是否保温
非功能:
界面:logo是否与原型图一致、是否美观、是否掉色、材质
易用性:防滑、防烫、带手把、会不会刺嘴巴、携带是否方便
兼容性:能否能装其他的液体
安全性:装热水的时候,会不会水有毒
性能:防摔
Q2:黑盒测试与白盒测试的区别?
-
答:黑盒关注功能实现(用户视角),白盒基于代码逻辑验证(开发者视角),灰盒介于两者之间(接口级测试)。
- 黑盒测试方法:
- 1.等价类划分法:把可能用到的数据划分为不同的类别,然后再从每一类中挑选有代表性的数据用以测试。如账户名登录,也就是取正则表达式,取6-18位长度,有效等价类与无效等价类。
- 2.边界值法:设置边界值也就是极值,是等价法的补充。
- 3.场景法:通过场景对系统的功能或业务流程进行测试。遍历所有的基本流和备选流来完成系统中的所有场景。也就是说流程图。
- 4.因果图法:分别列出需求中的因子(条件)和结果,当需求中存在多个条件,不同条件中存在不同的结果。
Q3:测试用例怎么写?
答:设置用例编号、用例标题、模块、优先级、前置条件、测试步骤、测试数据、预期结果。

Q4:基本介绍
1.测试行业
1>什么是软件?
控制计算机硬件工作的工具
2>什么是软件测试?
使用技术手段验证软件是否满足使用需求。
3>软件测试目的
减少软件缺陷(bug),保障软件质量
2.测试主流技能
1>功能测试:
测试主要验证程序的功能是否满足需求
2>自动化测试:
使用代码或工具代替手工,对项目进行测试
3>接口测试:
使用代码或工具验证程序中的接口是否访问正常
4>性能测试:
模拟多人使用软件,查找服务器缺陷。
3.测试分类
1>按阶段划分
- 单元测试:针对程序源代码进行测试
- 集成测试:针对程序接口进行测试
- 系统测试:针对程序功能、非功能进行测试
- 验收测试:使用不同用户(内测、公测)进行测试
2>按代码可见度划分
- 黑盒测试:不关注源代码,针对程序UI功能进行测试
- 灰盒测试:针对程序部分代码进行测试(接口)
- 白盒测试:针对程序源代码进行测试
3>其他
- 性能测试:归属专项测试
- 自动化测试:归属功能测试
4.质量模型
功能、性能、兼容、易用、安全、可靠性、移植性、维护性
5.测试流程
- 需求评审
- 编写测试计划
- 用例设计
- 用例执行
- 缺陷管理
- 测试报告
Q5:用例设计方法


Q6:练习案例:
微信发朋友圈
1、成功(1张图⽚)
2、成功(1段⽂字)
3、失败(内容为空)

等价类划分法

案例1(qq程序)
要求:6~10位⾃然数

案例2(电话)
要求:
- 区号:空或者是三位数字
- 前缀码:⾮“0”且⾮“1”开头的三位数字
- 后缀码:四位数字


边界值法
⼀、解决边界限制问题

步骤
1、明确需求
2、确定有效和⽆效等价
3、确定边界范围
4、提取数据编写⽤例
案例

边界值优化:开内闭外
10<a<=20 -->使用(10,20]
所以开内闭外:选择要测试的点 上点+内点=必测
为什么内点必须测?验证范围的连续性
优化:去除7和9.
判定表法

1、明确需求
2、画出判定表
1)、列出条件桩和动作桩
2)、填写条件项,对条件进⾏全组合
3)、根据条件项的组合确定动作项
4)、简化、合并相似规则(有相同的动作)
3、根据规则编写测试⽤例
场景法
练习流程图⼯具:
1、线上⼯具:https://processon.com/diagraming/605880af07912927bd71c388
2、离线⼯具:visio
3、其他⼯具:Excel
错误推荐法

Q7:缺陷管理
1.1 定义
软件中存在的各种问题,都为缺陷,简称bug;
1、少功能
2、功能错误
3、多功能
4、缺少隐性功能
5、易⽤性(软件测试⼈员专业⻆度)
1.2 缺陷产⽣的原因
1、需求⽂档
2、架构设计
3、编码实现
4、环境(硬件、软件)
1.3 缺陷的⽣命周期

1、回归测试:
①常规项⽬回归:项⽬本次发布新增2个模块,最基本要测新增模块功能及新增模块关联的旧模块。
②⾮常规项⽬(银⾏、部队、航天):新增功能,必须全部复测。
2、回归bug:上⼀个版本发现的缺陷,开发修复完毕,在下个版本进⾏重新验证。
⼯作流程(⼩结):
设计⽤例->执⾏⽤例(执⾏测试)->缺陷(提交、验证、关闭)
缺陷定义:任何问题(Bug)
缺陷标准:多功能、少功能、错误、缺少隐性功能、易⽤性
描述缺陷重点:缺陷标题、前置条件、复现步骤、预期结果、实际结果、附件备注
提交缺陷信息:指派⼈、缺陷等级、修复优先级、类型、状态(统计缺陷)
缺陷管理
excel示例
![]()
1.4 提交注意事项

1.5 缺陷管理⼯具
1、项⽬管理⼯具-管理缺陷 (禅道、JIRA、TFS)
2、Excel管理缺陷
1.6 禅道(项⽬管理⼯具)
地址:https://demo.zentao.net/user-login.html
使⽤禅道管理缺陷
创建缺陷

Q8:HTML入门
form标签
作⽤:提交⻚⾯输⼊的数据到指定⻚⾯或后台
<form action="10-接受数据.html" method="get">
⽤户名:<input type="text" name="username"/>
<br />
密码框:<input type="password" name="password"/>
<br />
<!--
单选效果:
1、相同⼀组的radio才能做单选。
2、设置相同(组名)name属性值为⼀组。
-->
性别:
<input type="radio" name="one"/>男
<input type="radio" name="one"/>⼥
<br />
您的爱好:
<input type="checkbox" />挣钱
<input type="checkbox" />吃饭
<input type="checkbox" />欣赏美
<input type="checkbox" />个⼈发挥
<br />
<input type="submit" />
<input type="reset" />
<input type="button" value="点我试试"/>
</form
⼤盒⼦:div、独占⼀⾏
⼩盒⼦:span、⼀⾏可以放多个
二、数据库基础
1、分类
常用关系型数据库
Oracle、MySQL、Microsoft SQL Server、SQLite
非关系型数据库
redis、mongodb、hbase
2.mysql使用
netstat -anptu | grep 3306
mysql -u root -p
主键:id(唯一标识)外键:book_id(与其他表相关联)
desc database;查看表结构
添加多行数据
insert into students (id, name) values(0,'张三');
修改数据
update students set name='ᇲՌ ',age=22 where id=5
删除数据
delete from students where id=6;
此方法为物理删除,工作中大部分使用逻辑删除
逻辑删除是指通过设定一个字段来标识当前记录已经删除,如is_delete
其他删除数据的方式:
truncate table studens; 清除表里面所有的数据,但是表结构会保留,自增长字段的值会从1开始。
drop table students; 删除数据表,包括数据和表结构
模糊查询:
select * from students where name like '孙%';
范围查询:
select * from students where hometown in ('北京','上海 ','广东');
排序:
select * from ᤒݷ order by 字段1 asc|desc, 字段2 asc|desc ........
求表的总的记录数
select count(*) from students;
分组查询:
select sex,count(*) from students group by sex;
分组加条件:
select sex,count(*) from students group by sex having sex='男';
分页查询:
select * from students limit (n-1)*m, m; (n为第n页数据,m为条数 )
3.连接查询

内连接 select * from 表名1 inner join 表名2 on 表1.列=表2.列;
查询的是两个表的交集的数据
表1的列与表2的列一定是存在关联关系
内连接连接时可以连接多个表
select * from 表1 left join 表2 on 表1.列=表2.列
左连接查询的是左表特有的数据,对于右表中不存在的数据用null来填充
右连接
select * from 表1 right join 表2 on 表1.列=表2.列
右连接查询的是右表特有的数据,对于左表中不存在的数据用null来填充
自关联
自连接的应用场景
省、市、区的信息,一般不会分开放在不同的表里面进行存储,而是放在同一个表当中。

要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
select * from 表名 as 别名1 inner join 表名 as 别名2 on 别名1.列=别名2.列
-- 查询出河南省所有的市
select * from areas as a1 inner join areas as a2 on a1.aid=a2.pid where a1.atitle='河南省';
子查询
将一条SQL查询的语句嵌入在其他的SQL语句中,被嵌入的SQL语句称之为子查询,其他的SQL称之为主查询
子查询select语句,要么是充当条件,要么充当数据源
子查询语句是一条完整的select语句,且可以单独执行
-- 例1:查询王昭君的成绩,要求显示成绩(标量子查询)
select studentNo from students where name='王昭君';
子查询充当条件
select * from scores where studentNo=(select studentNo from students where name='王昭君');
子查询充当数据源
-- 例1:查询数据库和系统测试的课程成绩
select * from scores as sc inner join (
select * from courses where name in ('数据库','系统测试')
) as co on sc.courseNo=co.courseNo;
牛客网sql基础题知识点
1.查询所有列
select * from 表名
2.查询结果去重
select distinct 关键字 from 表名
3.查询结果限制返回行数
select 关键字 from 表名 limit 行数
4.查找指定结果
select 关键字
from 表名
where 关键字条件;
5.查询中间值
where 关键字条件1 and 关键字条件2; 或 where 关键字 between 值1 and 值2
6.查找除了x的信息
where 关键字 != '值'; 或 where 关键字 <> ‘值’; 或 where 关键字 not in (“值”)
7.范围多值
where 关键字 in ('值1', '值2', '值3');
8.查看含**的结果
where 关键字 like '%**%';
9.查找最高值/ 计数 / 平均值 / 最小值
select max(关键字) / count(关键字) / avg(关键字) / min(关键字)
10.数字值保留*位小数
round(avg(值), *)
11.分组
group by 关键字;
12.分组过滤
group by 关键字
having 关键字(值) < 值1
13.排序升序/降序
order by 关键字 asc/desc ;
14.连接表内连接
inner join 表名 as up
on 表1属性 = 表2属性 and 表1.关键字 = '值1'
15.统计每个学校的答过题的用户的平均答题数
select
university,
count(qpd.question_id)/count(distinct qpd.device_id) as avg_answer_cnt
from user_profile as up
inner join question_practice_detail as qpd
on up.device_id = qpd.device_id
group by university ;
16. 统计每个学校各难度的用户平均刷题数
select
university,
difficult_level,
count(qpd.question_id)/count(distinct qpd.device_id) as avg_answer_cnt
from question_practice_detail as qpd
inner join user_profile as up
on qpd.device_id = up.device_id
inner join question_detail as qd
on qpd.question_id = qd.question_id
group by university, difficult_level
17.统计每个用户的平均刷题数
Select
university,
difficult_level,
count(qpd.question_id)/count(distinct qpd.device_id) as avg_answer_cnt
from question_practice_detail as qpd
inner join user_profile as up
on qpd.device_id = up.device_id and up.university = '山东大学'
inner join question_detail as qd
on qpd.question_id = qd.question_id
group by difficult_level
18.查找山东大学或者性别为男生的信息** **Union 不包含重复行,union 包含重复行
select
device_id, gender, age, gpa
from user_profile
where university='山东大学'
union all
select
device_id, gender, age, gpa
from user_profile
where gender='male'
19.划分为25岁以下和25岁及以上两个年龄段
if(age>=25, "25岁及以上", "25岁以下") as age_cut;
20.**将用户划分为***20岁以下,20-24岁,25岁及以上三个年龄段,分别查看不同年龄段用户的明细情况*
select
device_id,
gender,
case
• when age>=25 then '25岁及以上'
• when age>=20 and age < 25 then '20-24岁'
• when age<20 then '20岁以下'
• else '其他'
end as age_cut
from user_profile
21.年月日函数
where year(date)='2021' and month(date)='08'
22.计算用户的平均次日留存率*** *次日/ 三日/ 七日* *interval 1 / 2 / 6
想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。
select
count(t2.device_id)/count(t1.device_id) as avg_ret
from
(
• select
• distinct device_id,date
• from question_practice_detail
) as t1
left join(
select distinct device_id,date
from question_practice_detail
) as t2
on t1.device_id = t2.device_id and t2.date=date_add(t1.date, interval 1 day);
23.切分函数substring
substring('www.csdn.net',5) from web_info
24.获取子字符串:“csdn.net”,子串的位置必须从5开始
substring_index(blog_url, '/', -1) as user_name
***\*count\****:代表第几次出现;count为正数,代表取标识符出现第count次之前的子串;负数则相反,取标识符出现第count次之后的子串。
25.窗口函数
想要找到每个学校gpa最低的同学来做调研,请你取出每个学校的最低gpa。
select
device_id, university, gpa
from(
select device_id,university,gpa,
rank() over (partition by university order by gpa) rk
from user_profile
) up
where up.rk=1
三、Linux基础
Linux文件系统和目录

确定linux当中ssh的服务是否开通
netstat -anpt | grep ssh
-a(all)-n(numeric)-p(program)-t(tcp)
ls -lha /usr/bin # 查看/usr/bin文件夹里面的内容

rm -i 表示交互式执行删除操作,删除前会有提示
rm -f 表示强制删除,忽略不存在的文件
rm -r 表示删除目录及目录下所以的内容
文件或目录的复制:cp
命令格式:cp 源文件 目标文件
查看系统进程
ps -aux | grep top
进程号
kill -9 进程号
查看系统监听端口
netstat -anptu | grep mysql
netstat -anptu | gerp 3306
设root:
sudo passwd root
su
进程占用:
sudo lsof -i :8000
杀死进程
sudo kill -9 1234 # 其中 1234 是进程 ID
查询文件
sudo find / -type d -name "examples"
查询根目录下(包括子目录),名以b的目录和文件。
find / -name 'b'
查询根目录下(包括子目录),名以b开头的目录和文件。
find / -name 'b'
显示路由和ip地址
ip route show
ping baidu.com 有延迟
sudo vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
ip addr show 显示或配置网络接口
ip link show
sudo dhclient + usb 端口 连外网
sudo ifdown enp2s0 重启网络
sudo ifup enp2s0
tmux 虚拟终端模拟
chmod 777 demo3 -R 读写权限
df -lh 看容量
du -h 看日志大小容量
touch .sh 创建脚本
rm -rf file 强制删除文件
mv oldfile newfile 重命名
mv test1 test/test0 把当前目录下的test1移动到test文件下重命名为test0
tar -cvf start.tar a.java b.java 将当前目录下的a.java、b.java打包
tar -zxvf start.tar.gz -C usr/loca 解压start.tar.gz压缩包,到/usr/local目录下
ps -ef | grep ssh 查找指定ssh服务进程
ps -ef 查看所有正在运行的进程
netstat - an | grep 8080 搜索指定端口
service network restart 重启网络
四、功能测试
环境
环境定义:项目运行所需要的所有的软件和硬件组合
环境(服务器)的组成:操作系统+数据库+web应用程序+项目代码
测试环境:专门提供给测试人员使用
开发环境:开发人员使用
生产环境:提供给用户
预生产环境:设置和数据是一样
1.熟悉公司项目流程
信息来源:
新项目:需求文档+产品经理
已经存在的项目: 文档(需求文档\使用说明书\测试用例) 人(测试老员工\产品经理\开发) 项目软件
熟悉的思路:用户 + 用户如何使用
熟悉标准:核心业务 + 核心功能模块
用户是谁?
用户怎么用?
哪个功能缺失会导致用户无法正常使用?
2.1 商城项目的核心业务:
下单业务(登录--搜索-----加入购物车-----下单-----支付)
发货业务(登录----确认订单----填单号)
售后业务(用户登录----发起申请---商家登录----商家确认申请----用户退货----商家确认收货---商家打款)
查询订单(用户登录----我的页面----我的订单)
2.2 商城项目的核心功能模块:
注册
登录
购物车
搜索
轮播图
评论
抢购
三、【重点】测试流程的应用
流程的作用:让测试工作有条不紊的开展.
3.1 需求评审
前提:提前阅读需求文档,记录疑惑点
目的:知道有什么功能,规则是什么,最终各部门理解一致.
3.2 计划编写
测什么
怎么测
谁来测
重点关注
准入标准:研发提测标准,什么时候可以开始测试
业务能跑通:P0
准出标准:什么时候结束测试
数据化:用例(100%) \缺陷(解决率:S0 100%,S1:100% S2\S3 :95%)3.3 设计用例
先设计业务用例,后设计功能模块用例
3.4 用例执行
按优先级(推荐)
前提:写用例的时候标注清楚优先级并且明确优先级的定义
P0:最高级别.
按顺序执行
3.5 缺陷管理
提交时间:用例执行失败的第一时间
注意事项:
唯一性
可复现(明确复现步骤\问题发生时间\日志截图)
注明版本号
3.6 测试报告
四、【掌握】商城项目测试(业务流程)
方法:流程图法
如何编写用例:找路径;从开始到结束共有多少条路就有多少条用例.
4.1 发货业务(参考课堂用例)
- 需求分析
- 拆解测试点
- 编写用例
4.2 评论业务(参考课堂用例)
- 需求分析
- 拆解测试点
- 编写用例
4.3下单业务
- 需求分析
- 拆解测试点
- 编写用例
web项目抓包操作与测试报告
含义:客户端向服务器发送消息
组成:
请求行(请求方法 URL 协议/协议版本号)
url:
组成 URL(网址)=协议://主机地址(IP地址或域名):端口号/路径?参数名=参数值&参数名=参数值
http://hmshop-test.itheima.net/
http://hmshop-test.itheima.net/Home/Goods/search/q/%E6%89%8B%E6%9C%BA.html
http://hmshop-test.itheima.net/Home/Goods/search.html?q=%E6%89%8B%E6%9C%BA
面试题:介绍一下http和https的区别
共同点:都是协议,都可以用来传输数据
不同点:
http不加密,不安全;https加密协议(公网使用).
http端口号是80,https端口号是443
面试题:请求方法(get和post的区别)
相同点:都可以向服务器发起请求,并且携带参数
get:参数放在浏览器的地址栏,可以看到不安全.参数长度有限制(浏览器的地址栏有长度限制),没有请求体
post:参数放在请求体,需要抓包才可以看到.参数长度无限制
请求头
键值对的形式展示
客户端的属性信息
请求体(请求参数)
name=value
如果有多个参数,用&连接
1.2 响应
含义:服务器向客户端返回数据的过程
组成
响应行:协议/协议版本号 响应状态码 状态描述
(面试题)响应状态码:
2XX : 成功
3XX : 重定向
4XX : 客户端错误
5XX : 服务器错误
响应头: 服务器的属性信息
响应体: 服务器返回的结果(图片\HTML\JSON\txt等等)
JSON:{'name1':'value1'}
fiddler抓包工具的使用

删除数据:
方式一:点击Remove all
方式二: 黑窗口输入cls,回车
查看数据包内容
方式:选中数据包或者双击----点击Inspecters---请求内容点击Raw----响应内容点击Raw(行\头\体
弱网测试:
常见问题:上传文件时进度卡住不动
登录不上或者登录后立即掉线
响应过程中页面控件可点击,导致崩溃
搜索不响应,多次点击后结果显示总在刷新被替换
第一步:Rules----Customize Rules----Ctrl+F调起搜索-----Find what 输入300
开启网络延迟: Rules---Performance---Simulate Modem Speeds
设置断点(请求之前)
设置断点(响应之后)
五、接口测试
![]()
完整语法格式:协议 :// IP地址:端⼝号/资源路径?查询参数

HTTP响应
状态行:1xx、2xx、3xx
响应头:k:v对
响应体
接口规范
传统⻛格接⼝
接⼝统⼀采⽤ get/post 实现 所有操作。
URL 与 资源不是 ⼀⼀对应的。在 URL 中查看出,是何种操作
状态码统⼀ 返回 200
RESTful⻛格接⼝
接⼝使⽤的⽅法,与 http协议的 请求⽅法,⼀⼀对应。
get - 查、post - 增、put - 改、delete - 删
URL 与 资源 ⼀⼀对应!不能从 URL 中,看出 是 何种操作。 需要通过 结合 请求⽅法 来识别何种操作。
响应状态码 使⽤较为全⾯。
接⼝测试流程
1.需求分析(产品经理的需求⽂档)
- 接⼝⽂档解析(开发编写的 接⼝API⽂档)
- 设计 接⼝测试⽤例(编写 Excel 表格形式的⽤例)
- 准备接⼝测试脚本
-
- postman ⼯具 ⽣成脚本
- python 代码 编写脚本
- 执⾏测试⽤例,跟踪缺陷
- ⽣成 接⼝测试报告
- 接⼝⾃动化持续集成(可选)
系统路径+url

测试用例
注:模板一般公司会有提供,或者直接网上下一个,非固定
登录

业务场景测试⽤例
分析测试点
指导思想:模拟⽤户实际使⽤,⽤较少的测试⽤例,覆盖更多接⼝,测试正向即可。
登录 - 添加员⼯ - 查询员⼯ - 修改员⼯ - 删除员⼯ - 查询员⼯列表

Potman 断言
- 让 Postman工具 代替 人工 自动判断 预期结果 和 实际结果 是否一致
- 断言代码 书写在 Tests 标签页中。 查看断言结果 Test Results 标签页
// 断言响应状态码为 200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
注:新版本tests在Scripts里。
pm:postman的实例。
test() postman实例的测试方法。 这个方法 有 2 个参数。
参1:"Status code is 200"。 这个参数可以任意修改,不影响 断言。
作用:在断言结束后,显示给用户,断言结果的提示文字。
参2:是一个 匿名函数 调用。
pm.response.to.have.status(200); 的意思是:
postman的响应结果中,应该有 响应状态码 200。 ———— 这里的 200 是 预期结果。

例1
使用 postman 关联技术,实现 添加员工 接口。
登录成功,返回的 “令牌” 被 添加员工 接口依赖。
思路:
- 发送登录请求(必须登录成功),获取响应结果
- 从 json 响应结果中,提取 data 值。拼接上 “Bearer ” 前缀。
注意:Bearer单词不能拼错,首字母必须大写,只有一个空格
- 将拼接无误的 令牌,存入 环境变量。 从 “眼睛” 图标查看。
- 添加员工 接口,从 环境变量 中,提取 令牌。设置到请求头中,作为 Authorization 的 值。
- 填写 添加员工 接口 其他信息(post、URL、请求体),发送请求。



问题1:常⻅的请求⽅式?GET和POST请求的区别?
作⽤不同:GET⽤于从服务端获取资源,POST⼀般⽤来向服务器端提交数据 参数传递⽅式不同:GET请求的参数⼀般写在URL中,且只接受ASCII字符;POST请求参数⼀般放在请求体中,对于数据类型也没有限制安全性不同:因为参数传递⽅式的不同,所以两者安全性不同,GET请求的参数直接暴露在URL中,所以更不安全,不能⽤来传递敏感信息。 参数⻓度限制不同:GET传送的数据量较⼩,不能⼤于2KB;POST传送的数据量较⼤,⼀般被默认为不受限制。 HTTP 协议没有 Body 和 URL 的⻓度限制,对 URL 限制的⼤多是浏览器和服务器的原因。 编码⽅式不同:GET 请求只能进⾏ URL 编码(application/x-www-form-urlencoded);POST ⽀持多种编码⽅式(application/x-www-form-urlencoded 或 multipart/form-data。为⼆进制数据使⽤多种编码。)



注意:
适用场景:键名或字符串值中的双引号
1.错误示例:
{"platformOrderId":"MB20250429095604",
"displayOrderId":"111",
"itemList":[{"mskuId":1,"quantity":1}],
"shippingSpeedCategory":"Standard",
"updateToShipped":"1",
"fbaShopId":"12"
}
这里 itemList 是一个 数组类型,元素是对象。
这个写法在标准 JSON 中完全没问题。但——如果你的接口文档明确要求 itemList 是字符串类型(即 JSON 数组以字符串形式出现),那这样写就会报错。
2.修正后:
{"platformOrderId":"MB20250429095604",
"displayOrderId":"111",
"itemList":"[{\"mskuId\":1,\"quantity\":1}]",
"shippingSpeedCategory":"Standard",
"updateToShipped":"1",
"fbaShopId":"12"
}
这里 itemList 是一个 字符串,字符串的内容是一个 JSON 格式的数组(你把数组整个变成了字符串)。这在一些接口中是必须的格式,尤其是:
-
接口对
itemList的期望是 string 类型; -
后端再把它
JSON.parse()成数组来处理; -
通常见于一些较老系统或者对接外部平台时的特殊要求。
注:跟间隔也有关系,注意书写格式
附校验工具:在线JSON校验格式化工具(Be JSON)
六、性能测试

1.性能概念
1.1什么是性能?
时间:系统处理用户请求的响应时间
资源:系统运行过程中,系统资源的消耗情况
1.2什么是性能测试?
使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程。
1.3什么是性能测试的目的?
评估当前系统能力
寻找性能瓶颈,优化性能
评估软件是否能够满足未来的需要
2.性能测试分类
2.1基准测试
单用户测试,为系统/环境配置、系统优化前后的性能提升/下降提供参考指标
2.2负载测试
通过逐步增加系统负载,确定在满足系统的性能指标(如响应时间等)情况下,找出系统所能够承受的最大负载量的测试。系统最大负载量达到用户要求时,系统才能正式上线使用。
2.3稳定性测试
系统在用户要求的业务负载下运行达到规定的时间时,系统才能正式上线使用。
2.4压力测试
在强负载下的测试,查看系统在峰值情况下是否功能隐患、系统是否具有良好的容错能力和可恢复能力。
2.5并发测试
指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力,如特定活动场景:抢红包、秒杀、抢购等。
指标:







3.Jmeter使用


元件的作用域:是靠测试计划的树形结构中元件的父子关系来确定的。
压力测试,测试多用户并发请求。




要准备.csv数据文件



Tips:
1.在jmeter的聚合报告内文件需要创建一个result.jtl文件,然后执行,执行脚本会有一个弹框弹出、点击Overwrite existing file。
2.执行完毕后使用 jmeter -g 文件路径 -o 输入报告的地址:jmeter -g logs/result.jtl -o reports/my_report
3.打开index.html,解决
英文报告改中文:
下载汉化版模版,替换已安装的jmeter安装包下的report-template
七、自动化测试
1.介绍
自动化测试是软件开发和维护中非常重要的一部分,主要目的是提高软件质量、开发效率和测试覆盖率。
提高测试效率、提升测试准确性、支持持续集成/持续交付(CI/CD)、节省长期成本、增强回归测试能力、提高测试覆盖率、提升团队协作效率。
越高级的技术,越需要动脑子
- IT--不是一个靠体力的工作
- 体力活越少,反倒你的工资越高
工具
selenium 浏览器自动化操作框架
pytest 测试用例执行和管理框架
allure-pytest 生成漂亮的Allure测试报告
selenium
提供了丰富的元素操作方法。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 1. 启动Chrome浏览器
driver = webdriver.Chrome() # 如果驱动不在PATH,需要写路径,如 webdriver.Chrome(executable_path='/path/to/chromedriver')
# 2. 打开网页
driver.get('https://www.baidu.com')
# 3. 找到输入框,输入关键词
search_box = driver.find_element(By.ID, 'kw')
search_box.send_keys('自动化测试')
# 4. 模拟按回车键
search_box.send_keys(Keys.RETURN)
# 等待3秒,确保页面加载完成
time.sleep(3)
# 5. 关闭浏览器
driver.quit()
pytest-allure插件
安装 pip install allure-pytest
验证 pytest--alluredir=report
生成并查看allure报告:allure serve report
开始学习:
2.基础理论
UI:User Interface(⽤户接⼝-⽤户界⾯),主要包括:app、web
ui⾃动化测试:使⽤⼯具或代码执⾏⽤例的过程
什么样的项⽬适合做⾃动化:
- 1、需要回归测试项⽬(甲⽅⾃营项⽬、⾦融、电商)
- 2、需求变动不频繁:稳定的模块
- 3、项⽬周期⻓的项⽬:(甲⽅⾃营项⽬、6个⽉以上的外包)
⾃动化测试⽬的:提⾼测试效率
环境搭建
pthon解释器+pycharm+selenium+浏览器+浏览器驱动
pip install selenium
元素定位
id定位
- ⽅法: driver.find_element_by_id("id值")
- 前置: 标签必须有id属性
- 输⼊⽅法: 元素.send_keys("内容")
name定位
- ⽅法: driver.find_element_by_name("name属性值")
- 前置: 标签必须name属性
- 特点: 当前⻚⾯可以重复
- 提示: 由于name属性值可以重复,所以使⽤时需要查看是否为唯⼀。
class定位
- ⽅法: driver.find_element_by_class_name("class属性值")
- 前置: 标签必须有class属性
- 特点: class属性值可以有多个值
tag_name定位
- 说明:根据的标签名进⾏定位
- ⽅法: driver.find_elemet_by_tag_name("标签名")
- 提示: 如果⻚⾯存在多个相同标签,默认返回第⼀个。
ink_text定位
- 说明: 根据链接⽂本(a标签)定位
- ⽅法: driver.find_element_by_link_text("链接⽂本")
- 特点: 传⼊的链接⽂本,必须全部匹配,不能模糊
partial_link_text定位
- 说明: 根据链接⽂本(a标签)定位
- ⽅法: driver.find_element_by_partial_link_text("链接⽂本")
- 特点: 传⼊的链接⽂本,⽀持模糊匹配(传⼊局部⽂字)
扩展-查找⼀组元素
- 说明:返回列表格式,要使⽤需要添加下标或遍历。
- ⽅法: driver.find_elements_by_xxxx(),
- 提示: ⼋⼤元素定位⽅法,都可以使⽤⼀组元素定位,如果没有搜索到符合标签,返回空列表。
元素定位(xpath、css)
⽅便在⼯作⽤中查找元素,使⽤xpath和css⽐较⽅便(⽀持任意属性、层级)来找元素
xpath是xml path简称,使⽤标签路径来定位。
如百度
driver.find_element_by_xpaht("表达式")
如百度'//*[@id="kw"]'

案例:

css选择器

3、PO模式
Page Object 模式是将页面元素和操作封装为类,使测试代码更清晰、易维护。
Base层、Page层、Script层
base: 封装每个页面中相同的属性和方法 比如:元素定位、输入、点击
pageobject:每个页面定义一个类,类中包含元素及操作元素的方法
testcase:包含业务及测试数据
流程大概是
case_script/test_login.py
↓
business/login_business.py
↓
page/login_page.py
↓
base/base_page.py
↓
浏览器页面
-
run.py启动自动化测试 -
用例在
case_script/中调用business/ -
business/调用page/的操作方法 -
页面方法继承自
base/ -
运行中生成日志和报告(
logs/和case_report/)
使用markers标记测试用例
在 pytest 中,markers 是一种非常有用的功能,它可以对测试用例进行标记,以便实现更灵活的测试执行和分组等操作。

pytest中添加Fixture(测试夹具)
在介绍装饰器格式的Fixture前,先介绍conftest。
Conftest它是pytest的一个组件,用于配置测试环境和参数。
因此,conftest.py 文件是存放测试夹具(Fixtures)的理想场所。
测试夹具就像是测试用例执行时的得力助手,能够为测试提供各种必要的资源,如数据、对象、环境等。
通过在 conftest.py 中定义测试夹具,我们可以在多个测试模块中轻松地共享和复用这些资源,避免了在每个测试文件中重复编写相同
- 运行测试之前,pytest会自动识别并执行conftest.py文件中的配置。
运行测试之前,pytest 会默认读取 conftest.py里面的所有 fixture
conftest.py 文件名称是固定的,不能改动
conftest.py 只对同一个 package 下的所有测试用例生效
不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py
测试用例文件中不需要手动 import conftest.py,pytest 会自动查找
pytest中的fixtrue装饰器
我们可以在conftest.py中,或者是测试模块中定义fixtrue装饰器。
八、AI如何赋能软件测试?

案例1 登录需求
1、账号密码登录
- 系统验证账号和密码的正确性
- 验证通过,用户登录成功,进入个人中心;验证失败,提示错误信息并允许用户重新输入。
2、短信验证码登录
- 用户输入手机号,点击获取验证码,系统向用户手机发送验证码
- 用户输入验证码,点击登录,系统验证验证码的正确性。
- 验证通过,用户登录成功,进入个人中心;验证失败,提示错误信息并允许用户重新输入。
3、第三方授权登录
- 用户点击第三方按钮(如微信、QQ、支付宝),系统跳转至第三方授权页面,用户进行授权操作。
- 第三方返回授权信息至系统,系统验证授权信息的有效性,创建或绑定用户账号。
- 验证通过,用户登录成功,进入个人中心。
角色:你是一名测试工程师
指示:需要针对以下需求,设计测试用例
{xx需求}
输入:功能测试、兼容性测试、SQL注入
输出:使用Excel表格形式输出,并且格式参考用例设计八大要素,并且转换成typora能识别的格式
| 模块 | 测试项 | 优先级 | 前置条件 | 测试步骤 | 预期结果 | 实际结果 | 备注 | |
|---|---|---|---|---|---|---|---|---|
| FUNC-001 | 账号密码 | 正确登录 | 高 | 1.系统运行正常 2.测试账号:test/123456 | 1.输入用户名"test" 2.输入密码"123456" 3.点击登录 | 1.跳转个人中心 2.显示欢迎语 | ||
| FUNC-002 | 账号密码 | 错误密码 | 中 | 1.系统运行正常 2.测试账号:test/123456 | 1.输入用户名"test" 2.输入错误密码"111111" 3.点击登录 | 1.提示"用户名或密码错误" 2.密码框清空 | ||
| FUNC-003 | 账号密码 | SQL注入 | 高 | 1.系统运行正常 | 1.用户名字段输入:' OR 1=1-- 2.任意密码登录 |
1.拦截请求 2.提示"非法输入" | ||
| FUNC-004 | 短信验证 | 完整流程 | 高 | 1.手机号13800138000已注册 | 1.输入手机号 2.点击获取验证码 3.输入正确验证码 4.点击登录 | 1.收到6位短信 2.跳转个人中心 | ||
| FUNC-005 | 短信验证 | 错误验证码 | 中 | 1.已获取有效验证码 | 1.输入错误验证码 2.点击登录 | 1.提示"验证码错误" 2.允许重试 | ||
| FUNC-006 | 第三方 | 首次授权 | 高 | 1.网络畅通 2.未绑定账号 | 1.点击微信图标 2.完成授权 | 1.跳转授权页 2.创建账号并登录 | ||
| COMP-001 | 兼容性 | 多浏览器 | 中 | 1.Chrome/Firefox/Safari | 1.各浏览器执行FUNC-001 | 功能正常,UI无错位 | ||
| COMP-002 | 兼容性 | 移动端 | 低 | 1.iOS/Android设备 | 1.移动端执行FUNC-004 | 键盘适配,显示正常 |
根据程序的源代码可见程度划分:
黑盒测试:源代码不可见,UI功能可见,关注数据输入结果输出
灰盒测试:部分源代码可见,UI功能不可见,关注输入输出、数据访问通道
白盒测试:全部源代码可见,UI功能不可见,关注代码本身语法逻辑。




公司内主要是功能、性能、兼容、易用、安全测试。
1、客户端Web测试
案例:
需求分析
需求:
- 1.账号:必填,已经注册手机号或邮箱
- 2.密码:必填,注册账号的密码
- 3.验证码:正确且为过期
等价类划分法


练习1用xmind表示:



练习2用xmind表示:

边界值分析法




练习



非功能测试设计
非功能:除了软件功能测试,其他都是非功能测试。
- 兼容
- 易用
- 性能(专项)
- 安全(专项)
Web浏览器
兼容:Chrome浏览器、Edge浏览器、Firefox浏览器、Safari苹果浏览器
易用:参考竞品,主观感受为主。

测试用例介绍

测试用例编写


判定表



练习:

执行用例


缺陷管理
软件中存在的任何问题,也叫缺陷(bug)。

业务测试


编写用例:

练习:

编写测试用例

2、项目实战

步骤:
1、熟悉需求
2、确认下单流程
购车下单流程:选择商品->加入购物车->登录成功->提交订单成功->支付成功
3、确认流程图
工具:https://www.processon.com/

4、编写测试用例

练习:



上传bug:


单模块测试
功能模块
下单业务线中核心单功能
- 登录
- 购物车功能
- 下单功能
- 支付功能
单功能测试步骤:
① 熟悉需求
② 提取测试点覆盖需求
③ 测试点转执行测试用例
④ 缺陷管理
熟悉需求
- 需求从哪来?
l 需求文档
l 产品原型图
l 已存在的软件界面(不一定有)
- 怎么熟悉需求?
l 阅读并理解文档描述
l 操作或梳理业务规则及流程
1.登录功能


因太多,只举例三条

编写用例:

购物车功能



编写测试用例:
选了四条

支付
Web项目非功能测试
质量模型:功能性、兼容性、易用性、性能、安全、迁移性、维护性、可靠性
重点测试:功能性、兼容性、易用性、性能、安全
独立测试:安全、性能
测试目标:
兼容性:谷歌、火狐、Edge、苹果
易用性:主要参考依据产品原型设计或优秀竞品设计
九、测试报告+编写规范
1.什么是软件测试报告?
包含过程?结果,问题和改进内容的总结文档。
2.为什么编写测试报告?
汇报、评估、反思。
3.谁来编写测试报告?
测试负责人在测试结束时,参照模版进行编写。
4.软件测试的编写
核心内容、编写步骤。
1> 制作模版

2>收集资料

3>编写报告

4>表格优化

非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://blog.grover.top/2025/01/20/%e6%b5%8b%e8%af%95%e5%bc%80%e5%8f%91%e8%b7%af%e7%ba%bf/
共有 0 条评论