#################################
接口测试清单
1,接口清单不是现成的,需要自己提取,
2,接口无外乎增删改查,接口分功能模块,每一个模块有几个接口,
接口有三要素
url
提交数据
响应数据,
api文档,
文章中描述了,程序的功能,以及功能描述,访问路径,和提交响应的数据,
开发和测试都要遵守这个文档,
接口清单就是从api文档提取整理的,
怎么写api文档,
1,写的时候,遵守restful规范,一般都是开发写的,
描述性文本占到50%以上,就是一个小白也能看懂,这就是一个好文档,
业务逻辑设计的时候,全面,合理,
怎么提取接口清单?
提取三要素,
1,url,提交数据,响应数据,
################################
测试学生管理系统
1,功能测试,
2,自动化测试
让程序代替人工做测试,
提交的数据是程序生成的,
还有断言是程序自动判断的,
3,性能,压力测试,
响应时间,
高并发,高负载,
4,生成html格式的测试报告,
使用柱状图和饼状图的方式,
###############################
功能测试
1,测试各个接口,功能是否正常运行,
测试数据分成,正向的和逆向的,这是基本的两大方向,用户的操作是多样性的,看接口响应是否符合预期,
比如注册,有正常的和不正常的,合法的和非法的,
怎么用?
1,搭建测试框架,
2,设计测试用例
2.1 正确的账号,正确的密码,所有的都是正确的,
2.2 必填项都填写了,选填的没填写,
2.3 客户没有录入必填项,或者格式不对,
3,参数化覆盖测试用例,
把上面的每一个场景,设计测试数据
############################
功能测试,
1,搭建框架,测试计划,线程组,查看结果树,http请求默认值,http请求信息头,
这样框架就搭建完了,
注意,有多少数据,线程组的线程数,就填写多少,
2,学生管理系统添加学生信息,
线程组添加一个http请求,输入json格式的数据,
{
id = "",
name = "",
age = ""
}
3,将数据保存在外部文件,
新建一个文本文档,比如test.txt
1,andy,11
2,merry,22
4,添加csv data setconfig
文件路径:
文件格式:utf-8
字段名:id,name,age
5,json数据中引入
{
id = "${id}",
name = "${name}",
age = "${age}"
}
#########################
功能测试;----------设计测试用例 1,上面是基本的正向的测试
我们要设计测试用例
用例分类,就是用户操作分类:
一种是正向,一种是逆向的,
用例的设计原则:
1,覆盖所有的必选参数,比如账号,密码,邮箱等,
2,组合可选参数,账号,密码,邮箱等+地址,+昵称等,这就是排列组合,这是一个覆盖率的问题,有时候覆盖率100%,不是最好,要考虑人力成本和时间成本,
可选参数可能会有几十个,,
3,参数的边界值,比如年龄1-180之间是合法的,可能有的人乱写就不行,比如字母,数字,负数,大于180等,1,180,这种边界要特别注意,
4,如果参数的取值是枚举,需要覆盖所有的枚举值,比如状态,流程,这样的,都要覆盖到,
5,空数据,逆向,不输入,
6,包含特殊字符,逆向,乱七八糟的支付,
7,越界数据,长度的限制,比如密码,过长,过短,
8,错误的数据,比如手机,邮箱等,
写测试用例可以使用Excel文档
1,列
接口名称__正向,url,提交方式,这是第一行,
第二行,提交数据, 预期结果,
数据1:格式都正确,且所有字段都添加: 200,添加成功,返回添加数据,
数据2:添加必填数据,组合可选数据, 200,添加成功,返回添加数据,
...
接口名称__逆向__必填数据不填写,url,提交方式,这是第一行,
第二行,提交数据, 预期结果,
数据1:id不正常,其余正常, 200,错误提示:id不能为空,
数据2:name不正常,其余正常, 200,错误提示:name不能为空,
数据3:age不正常,其余正常, 200,错误提示:age不能为空,
...
接口名称__逆向__特殊字符,url,提交方式,这是第一行,
第二行,提交数据, 预期结果,
数据1:id特殊字符 200,错误提示:id不能有特殊字符,
数据2:name特殊字符 200,可以有特殊字符,添加成功, 具体的和需求人员确定是否可以
...
接口名称__逆向__长度,url,提交方式,这是第一行,
第二行,提交数据, 预期结果,
数据1:id超长 200,错误提示,id过长
数据1:name超长 200,错误提示,name过长
...
接口名称__逆向__错误数据,url,提交方式,这是第一行,
第二行,提交数据, 预期结果,
数据1 : id重复 200,错误提示,id重复
数据2,pwd格式错误, 200,密码格式错误,
######################################
功能测试-------参数化覆盖测试用例
1,把所有的测试用例里面设计到的数据设计成为数据,进行参数化,
2,所以测试用例就是一个大纲,
########################################
jmeter自动化测试
1,由程序生成测试数据
2,有程序代替人工判断相应结果,
为什么要自动化测试?
安全高效啊
怎么用?
自动化测试原则:
1,测试的是程序的主要功能,经常被复用的功能,
自动化测试往往是对功能测试的补充,比如更新上线,我们验证回归之前的功能是否正常,
2,自动化测试数据,一般只考虑正向的,
自动化测试是对功能测试的补充,当然也是程序生成多样的测试数据有困难,
3,你自动化测试之后,数据库数据要恢复成为测试之前的样子,优点:可以重复使用,
4,线程组之间不要有关联,不要有业务逻辑,优点:可以单独测试某一个功能,
实现流程,
1,搭建框架,测试计划, setup和teardown线程组,http请求默认值,http信息头,查看结果树,
2,setup和teardown线程组,最后把测试数据都删除,
添加setup线程组,新增数据操作,
在setup线程组添加http请求:
输入json数据:
使用counter计数器,计数器使用的时候,第一个字段写false,因为需要全局唯一,计数器是全局的,
{
id = "id_${__counter(FALSE,)}",
name = "name_${__counter(FALSE,)}",
age = "age_${__counter(FALSE,)}"
}
在该http请求添加断言L:添加--断言-响应断言,
断言响应文本,
添加:id_
也就是只要返回数据出现了id_这就是添加成功了,
teardown线程组,最后把测试数据都删除,
这是要拿到setup线程组的字段值,然后到这个teardown线程组来删除数据,这就是涉及到了跨线程组传值的问题,
使用什么?放到共享空间,使用的函数,__setProperty(),,,__property()
setup线程组要使用__setProperty()线程组来设置,
怎么获取id的值呢??
需要对响应结果进行处理,可以使用xpath,和正则表达式提取,这里使用正则表达式处理,
teardown线程组要使用,__property()线程组来引入,
添加----后置处理器----正则表达式处理器,
第一个字段,变量名:myid,
第二个字段,正则表达式,"id":"(.*?)"
第三个字段:$1$
匹配数字,1
添加__setProperty()
第一个字段:out
第二个字段,${myid}
添加--取样器,beanshell sampler 调用这个函数,
把调用的格式,粘贴进来,${__setProperty(out,${myid},)}
teardown线程组
添加----http请求
url是删除的api地址,
添加一个函数,__property()
第一个参数,out,
url:/api/dept/${__property(out,,)}/
http请求-添加-断言
使用状态码
添加:204,
3,数据生成可以使用counter函数,数据格式,使用自定义前缀_counter计数器函数
4,使用到断言组件,让程序代替人工,判断结果,
#################################
自动化测试------修改和查询
继续上面的,
添加01,setup线程组
删除04,teardown线程组,
修改02,普通线程组,
查询03,普通线程组,
普通线程组的执行顺序是不一定的,
添加修改线程组,
添加http请求,
url:/api/dept/${__property(out,,)}/
json数据:
{
id = "${__property(out,,)}",
name = "修改后_name",
age = "修改后_age"
}
添加断言:
断言类型:文本
添加:修改后,
添加查询线程组,
这个url是查询指定,
url:/api/dept/${__property(out,,)}/,
因为你查询所以可能会有分页,你不知道在那一页,查所有数据也太多了,
也可以加断言,
################################
自动化测试-----直连数据库
1,jmeter不具备直连数据库,需要整合第三方
添加一个jar包,
2,配置连接信息
添加-配置元件---jdbc connection config,
配置连接信息,数据库路径,
3,添加线程组,添加一个jdbc请求,
添加----取样器,jdbc request,
使用jdbc发送sql语句,操作数据,
select * from user_info where id like "id_%";
赋值给一个变量,myjdbcid 如果是多个值,即使变量名_1,变量名_2.。。。。
注意sql语句有类型,select update,
4,将数据传递给http请求,
赋值给一个变量,myjdbcid 如果是多个值,即使变量名_1,变量名_2.。。。
######################################
性能,压力测试
模拟多种场景,测试程序的,响应时间,出错率等,
性能直接关系到用户体验
原则:
1,参数化:尽量避免,采用从外部读取参数,使用固定参数+函数格式,
为什么避免外部读取,因为外部读取参数,会影响性能,所以性能测试尽量避免
2,查看结果树,必须清楚单个接口内查看结果树,
如果不去掉,会非常的占用测试机的性能,在测试计划下添加一个查看结果树,
3,报告,性能测试报告,建议添加聚合报告,
性能测试一般都是几百上千次,结果树看不过来,聚合报告好点,
4,线程组:增删查改每一个功能点,都需要建立单独的线程组,避免在同一个线程组内添加,
方便对这个功能进行单独的测试,
这些请求都是不一样的,
5,分布式:
如果并发量比较大,建议使用分布式,
6,新增和删除,建议不要采用时间模式来压测,建议使用线程数和循环数,
时间模式就是定时器,一个集合点,还有一个常量吞吐定时器,QPS,
查是多常见的,
#########################################
性能测试------1区间多用户操作
场景1:
模拟300秒内开启100个虚拟用户,每个用户循环访问服务器资源10次,要求平均响应时间在30ms内,且错误率为0
300秒就是线程组的时间期限
100个虚拟用户,就是线程组的线程数,
循环访问10,就是循环次数是10,
平均响应时间和错误率,是通过聚合报告判断,
怎么实现:
1,搭建框架,测试计划,线程组,http请求默认值,http信息头管理器,聚合报告,
2,线程组,添加一个http请求,
300秒,就是rampup period
100用户,线程数,
10次循环,循环次数,
#####################################
性能测试2-----高并发访问,
场景2:
模拟100个用户同时访问数据库,要求平均响应时间在30ms内,且错误率为0
100个用户,线程数,
同时访问,就是集合点,
怎么实现:
1,搭建框架,搭建框架,测试计划,线程组,http请求默认值,http信息头管理器,聚合报告,
2,添加线程组,http 请求,添加一个定时器,同步定时器,
第一个字段,100
第二个字段,0,就是无限等待的意思,
3,看聚合报告,
########################################
性能测试3------高频率访问,
场景3:
模拟,2个用户,都以20QPS的频率访问服务器资源,持续10秒,要求平均响应时间在30ms内,且错误率为0
用到了定时器,常量吞吐
20QPS,就是每年20次的访问,
怎么实现:
1,搭建框架,搭建框架,测试计划,线程组,http请求默认值,http信息头管理器,聚合报告,
2,线程组:
两个用户,就是线程数是2
每一个线程组独立运行,
循环次数,是循环200次,因为2个线程组,秒20次,持续10秒, 就10*20,每一个用户循环200次,
添加定时器,常量吞吐定时器,换算成为分钟,1200次每分钟,
3,看聚合报告,
#################################
生成测试报告
以html文档,结合柱状图,饼状图显示
为什么?
更加友好,更加直观,
怎么用?
1,dos命令下,执行测试脚本,生成html格式的测试报告
Jmeter -n -t 测试计划03_性能测试.jmx -l test.txt -e -o ./outhtml
-n 是说not GUI,
-t 脚本文件,
-l 日志文件,
test.txt 这是执行中的日志文件,这个文件一定是唯一的,
-e 生成
-o 输出,
/outhtml 这是文件夹,执行之后会有一个index.html文件,
这种转换成
2,先使用jmeter运行测试脚本,生成日志文件,再将日志文件,转换成为html的报告。
#############################