一、接口测试步骤:
- 第一步:我们要分析出测试需求,并拿到开发提供的接口说明文档;
- 第二步:从接口说明文档中整理出接口测试用例,里面要包括详细的入参和出参数据以及明确的格式和检查点。
- 第三步:和开发一起对接口测试用例进行评审。
- 第四步:结合开发库,准备接口测试案例中的入参数据和出参数据,并整理成csv格式的文件。
- 第五步:结合接口测试案例文档和csv格式的数据文档,做接口测试案例的自动化案例开发
二、接口自动化适用场景:
目前设计的自动化接口测试案例有两个运行场景:
- 测试前置、开发自测:
一个新的自动化接口测试案例开发完成后,直接发给接口对应的开发,安排在开发本地环境执行,一旦开发确认完成接口开发,就开始执行接口测试案例,基本上可以实时拿到测试结果,方便开发快速做出判断。【开发本地运行的方式就是打开Jmeter工具,导入JMX文件,开始执行可。】
- 回归测试:
开发本地测试通过后,或整个需求手工测试通过后,把自动化的接口测试案例做分类整理,挑选出需要纳入到回归测试中的案例,在持续集成环境重新准备测试数据,并把案例纳入到持续集成的job中来,这些用于回归的接口测试案例需要配置到持续集成平台自动运行。
三、实战一:
- 接口信息:
登录接口
接口地址:http://192.168.239.3:80/freshO2O/login.action
请求方法:POST
输入参数
URL参数 | ||||
名称 |
类型 |
长度 |
选项 |
描述 |
account |
string |
11 |
必填 |
登录用户账号 |
password |
string |
32 |
必填 |
密码 |
verifycode |
string |
12 |
可选 |
eg:http://192.168.3.223:8080/freshO2O/login.action?account=fu&password=123456
输出结果
Result | ||||
名称 |
类型 |
长度 |
选项 |
描述 |
account |
string |
16 |
必填 |
用户账号 |
addr |
string |
20 |
必填 |
用户地址 |
msg |
string |
32 |
可选 |
状态信息 |
password |
string |
11 |
必填 |
用户密码 |
result |
string |
16 |
必填 |
返回结果,ok或 error |
eg:
{"account":"fu","addr":"深圳市宝安区中南花园","msg":"账户名不存在","password":"123456","result":"ok"}
- 操作步骤
1)添加线程组:
右键点击“测试计划” -> “添加” -> “线程(用户)” -> “线程组”
2) 添加Http请求
右键点击“线程组” -> “添加” -> “Sampler” -> “HTTP请求
3) 填写Http请求参数
- Web服务器 的协议:向目标服务器发送HTTP请求协议,可以是HTTP或HTTPS,默认为HTTP
- 服务器名称或IP :HTTP请求发送的目标服务器名称或IP
- 端口号:目标服务器的端口号,默认值为80
- Http请求方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
- 路径:目标URL路径(URL中去掉服务器地址、端口及参数后剩余部分)
- Content encoding :编码方式,默认为ISO-8859-1编码,这里配置为utf-8
同请求一起发送参数 ,在请求中发送的URL参数,用户可以将URL中所有参数设置在本表中,表中每行为一个参数(对应URL中的 name=value),注意参数传入中文时需要勾选“编码”
4) 添加察看结果树
右键点击“线程组” -> “添加” -> “监听器” -> “察看结果树”
5) 运行Http请求,检查结果树
运行Http请求,修改响应数据格式为“HTML Source Formatted”,可以看到本次搜索响应结果
6) 配置线程组(测试性能)
线程组名称,线程数,准备时长(Ramp-Up Period(in seconds))循环次数,调度器等参数
- 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
- Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
- 环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
- Delay Thread creation until needed:直到需要时延迟线程的创建。
- 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)
- 持续时间(秒):测试持续时间,会覆盖结束时间
- 启动延迟(秒):测试延迟启动时间,会覆盖启动时间
7) 添加用户自定义变量
- 可以添加用户自定义变量用以Http请求参数化,右键点击“线程组” -> “添加” -> “配置元件” -> “用户定义的变量”
- 新增两个参数,存放登录帐号和密码:
- 并在Http请求中使用该参数,格式为:${wd}
8) 添加断言
右键点击“HTTP请求” -> “添加”-> “断言” -> “响应断言”
校验返回的文本中是否包含帐号信息的词,添加参数到要测试模式中
右键点击“HTTP请求” -> “添加”-> “监听器” -> “
9) 查看断言结果
运行一次脚本就可以看到断言结果是成功还是失败,如果失败,则会出现断言找不到的提示信息,如图:
10) 添加聚合报告
右键点击“线程组” -> “添加” -> “监听器” -> “聚合报告”,用以存放性能测试报告
一般而言,性能测试中我们需要重点关注的数据有: #Samples 请求数,Average 平均响应时间,Min 最小响应时间,Max 最大响应时间,Error% 错误率及Throughput 吞吐量。
11) 聚合报告参数详解
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
- #Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
- Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,以Transaction 为单位显示平均响应时间
- Median:中位数,也就是 50% 用户的响应时间
- 90% Line:90% 用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:错误率——错误请求数/请求总数
- Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数 (按请求个数来展示的,比如说1.9/sec,就是每s发送1.9个请求)
- 最后面两个就是每秒接收数据量和发送数据量,不过这两个值,有些情况下会没有
备注:
- 右上角,小框框里面显示的是脚本的运行时间,小三角形前面的数字,代表jmeter运行过程中的异常数,这个异常数和脚本里的错误是两码事。比如连接不上服务器,这里就会有异常。小圈圈前的0/1代表当前正在运行的线程数和脚本运行中的最大线程数,因为现在脚本已经停止运行了,所以没有线程在运行,所以前面就是0。而且我的脚本运行时,只启了一个线程,所以最大线程数就是1。在察看结果树里,没有结果输出,代表没有错误的请求,重点看聚合报告
- 使用Jmeter工具开发的接口测试案例,一个子系统建议放在同一个“测试计划”中,流程测试可以通过“线程组”来区分,这样也便于设定不同的测试数据个数。比较独立的接口,可以统一放在一个线程组内,顺序完成测试。
- 流程性接口的测试:如果要测试的接口可以组成一个流程,只需要顺序添加多个“HTTP 请求”的Sampler,各请求之间可以提取需要在上下文传递的数据作为参数,以保证流程中数据的一致性。
四、实战二 :
- 接口信息:
名称 |
用户登录 |
描述 |
用户登录接口 |
URL |
http://192.168.3.223:8080/freshO2O/login.action |
方法 |
post |
参数 |
account 用户账号 password 密码 |
返回结果 |
{ "account": "fu", "addr": "深圳市宝安区中南花园", "msg": null, "password": "123456", "result": "ok"} |
- 操作步骤
1) 设计测试用例
- 正常参数
account=fu password=123456
- 异常参数,比如用户密码错误。
account=admin password=123456
2) jmeter 设置
- 新建测试计划,名字为:菜篮子接口测试。
- 在测试计划上添加线程组,名字为:用户登录接口测试。
- 在线程组上添加2个采样器,即2个测试用例,类型选择HTTP请求。
第一个名字为:正常用户登录,
第二个为异常用户登录,分别输入IP地址,端口号与路径,方法选择POST,并添加对应的参数。
- 添加断言,选择响应断言,正常用户登录用例包含关键字: "result":"ok"
- 异常用户登录用例包含关键字:"result":"error"添加查看结果树 添加->监听器->察看结果树 添加聚合报告 添加->监听器->聚合报告
3) 运行测试并查看结果:
点击绿色小三角图标,通过察看结果树与聚合报告确认结果,察看结果树是绿色表示测试成功,红色表示测试失败。如下图,测试成功。
4) 测试用例参数化(两种)
以上的例子不管IP地址还是具体的参数都是直接赋值,这样如果服务器地址或者接口的参数有变化,维护起来比较麻烦,最好用参数化的方式来编写测试用例。参数化的方式有两种:
- (1). 添加CSV Data Set Config参数化设置。(逗号分隔值:Comma-Separated Values)
比如接口用例的地址中的IP地址,有可能服务器的IP地址会修改,最好做参数化,以下以用户登录的例子来讲解如何做参数化设置。
- 编辑文件host.txt,内容包含IP地址与端口号,比如以下内容。192.168.142.143, 80把文件保存到D盘。
- 添加 CSV Data Set Config
由于IP地址与端口号每个测试用例都用到,故在整个测试计划下面添加CSV Data Set Config
- 右击测试计划->添加配置元件->CSV Data Set Config -> 修改配置如下:
名称:改成一个有意义的名称,比如IP地址。filename:指定为上面编辑的文件,并带路径,d:\host.txt 。变量名:定义2个变量,host获取文件中的IP地址,port获取文件中的端口号。Delimiter:变量分隔符,随便指定一个标点符号,这里用逗号,文件中IP地址的值与端口号之间也需要是逗号。
- 变量引用格式:${}
- (2). 利用函数助手完成参数化。
通过界面操作直接设置参数,比如要设置用户登录接口的account与password的值。
- 同样需要编辑一个文件,文件内容包含account的值与password的值。内容为:fu,123456 保存文件为jmeter_account.txt,保存到D盘。点击 选项-->函数助手 调出函数助手对话框 选择 _CSVRead 函数(下图第一个框)函数参数:第一个参数:填写文件路径,如:d:\jmeter_account.txt第二个参数:文件列号是从0开始的,第一列为0、第二列为1、第三列为2、依次类推,然后点击【生成】按钮,则会自动生成我们需要的参数化函数。
- 复制生成的参数化参数到需要使用的地方即可。比如把生成的账号参数拷贝到用户登录用例的account,值为${__CSVRead(d:\jmeter_account.txt,0)}
函数参数 |
描述 |
名称 |
设置从哪个文件读取(或者*ALIAS) |
列数 |
从文件的哪一列读取。 0=第一列, 1=第二列,依此类推。“next”为走到文件的下一行。*ALIAS为打开一个文件,并给它分配一个别名 |
5)参考答案截图:
五、实战三:
- 接口信息:
百度搜索接口
接口地址: http://www.baidu.com/s?ie=utf-8&wd=jmeter性能测试
请求参数:
- ie:编码方式,默认为utf-8
- wd: 搜索词
返回结果:
- 搜索结果,我们可以通过校验结果中是否含有搜索词wd来判断本次请求成功或失败
- 操作步骤
1) 添加线程组:
右键点击“测试计划” -> “添加” -> “线程(用户)” -> “线程组”
2) 配置线程组
线程组名称,线程数,准备时长(Ramp-Up Period(in seconds))循环次数,调度器等参数
- 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线
程数。
- Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备
时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
- 环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。 Delay Thread creation until needed:直到需要时延迟线程的创建。 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远) 持续时间(秒):测试持续时间,会覆盖结束时间 启动延迟(秒):测试延迟启动时间,会覆盖启动时间
3) 添加Http请求
右键点击“线程组” -> “添加” -> “Sampler” -> “HTTP请求
4) 填写Http请求参数
- Web服务器 的协议:向目标服务器发送HTTP请求协议,可以是HTTP或HTTPS,默认为HTTP
- 服务器名称或IP :HTTP请求发送的目标服务器名称或IP
- 端口号:目标服务器的端口号,默认值为80
- Http请求方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
- 路径:目标URL路径(URL中去掉服务器地址、端口及参数后剩余部分)
- Content encoding :编码方式,默认为ISO-8859-1编码,这里配置为utf-8
同请求一起发送参数 ,在请求中发送的URL参数,用户可以将URL中所有参数设置在本表中,表中每行为一个参数(对应URL中的 name=value),注意参数传入中文时需要勾选“编码”
5) 添加察看结果树
右键点击“线程组” -> “添加” -> “监听器” -> “察看结果树”
6) 运行Http请求,检查结果树
运行Http请求,修改响应数据格式为“HTML Source Formatted”,可以看到本次搜索响应结果标题为“jmeter性能测试_百度搜索”
7) 添加用户自定义变量
可以添加用户自定义变量用以Http请求参数化,右键点击“线程组” -> “添加” -> “配置元件” -> “用户定义的变量”
新增一个参数wd,存放搜索词:
并在Http请求中使用该参数,格式为:${wd}
8) 添加断言
右键点击“HTTP请求” -> “添加”-> “断言” -> “响应断言”
校验返回的文本中是否包含搜索词,添加参数${wd}到要测试模式中
右键点击“HTTP请求” -> “添加”-> “监听器” -> “断言结果”
9) 查看断言结果
运行一次脚本就可以看到断言结果是成功还是失败,如果失败,则会出现断言找不到的提示信息,如图:
10) 添加聚合报告
右键点击“线程组” -> “添加” -> “监听器” -> “聚合报告”,用以存放性能测试报告
这样,我们就完成了一个完整Http接口的JMeter性能测试脚本编写。
11) 执行性能测试
- 配置线程组
点击线程组,配置本次性能测试相关参数:线程数,循环次数,持续时间等,这里我们配置并发用户数为10,持续时间为60s
- 执行测试
点击绿色小箭头按钮即可启动测试,测试之前需要点击小扫把按钮清除之前的调试结果。
- 分析测试报告
待性能测试执行完成后,打开聚合报告可以看到:
一般而言,性能测试中我们需要重点关注的数据有: #Samples 请求数,Average 平均响应时间,Min 最小响应时间,Max 最大响应时间,Error% 错误率及Throughput 吞吐量。
六、总结:
- 压力测试
- 压力测试分两种场景:
第一种是单场景,压一个接口的;
第二种是混合场景,多个有关联的接口。
- 压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。
- 压测任务需求的确认
压测前要明确压测功能和压测指标,一般需要确定的几个问题:
- 固定接口参数进行压测还是进行接口参数随机化压测?
- 要求支持多少并发数?
- TPS(每秒钟处理事务数)目标多少?响应时间要达到多少?
- 压服务器名称还是压服务器IP,一般都是压测指定的服务器
- 压测设置线程数:并发数量,能跑多少量。具体说是一次存在多少用户同时访问Rame-Up Period(in seconds):表示JMeter每隔多少秒发动并发。理解成准备时长:设置虚拟用户数需要多长时间全部启动。如果线程数是20,准备时长为10,那么需要10秒钟启动20个数量,也就是每秒钟启动2个线程。循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。压测结果查看
- 聚合报告
运行完后,聚合报告会显示压测的结果。主要观察Samples、Average、error、Throughput。
Samples:表示一共发出的请求数
Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms)
Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因
Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好。
- 压测结果的分析有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。