jmeter 做接口自动化测试的这些技巧你都掌握了吗
Posted 软件测试凡哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jmeter 做接口自动化测试的这些技巧你都掌握了吗相关的知识,希望对你有一定的参考价值。
前言
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
jmeter 这个工具既可以做接口的功能测试,也可以做自动化测试,还可以做性能测试,其主要用途就是用于性能测试。但是,有些公司和个人,就想用这些 jmeter 来做接口自动化测试。
下面我就给大家讲讲
jmeter 如何做接口自动化测试。
如果要你用 jmeter 来做接口自动化测试,你是不是把几乎每一个测试用例,都是用一个取样器来实现的?
相信很多人都是这么想的,也是这么干的。
但是,很遗憾,你这种,是初级入门做法。你能实现所有的测试用例都被执行,但是,你写脚本和维护脚本的时间,可能比你用手工执行所有的测试用例时间还要长,而且还可能长很多。因为,只要开发人员改了接口一个地方,你得从所有取样器中,找出与这个接口相关的所有取样器,然后一一修改,万一有遗漏,哪出现的失败,不是 bug,而是你脚本的问题。所以说,这是入门级的人干的事情。
使用 jmeter 的 CSV 数据文件读取功能
平时写功能测试用例的时候,习惯用 Excel 的同学,可能就会想,我能把自动化测试用例每个信息都写在 Excel 表格中,然后,使用 jmeter 的 CSV 数据文件读取功能,把它读取出来执行,是不是就可以呢?
这种方法,就比前面的方法好了很多,但还是用 Excel 来维护,只是使用 jmeter 来读取,执行就可以了。整体的可维护性要好很多很多,工作量也要少很多。
但是,在真正动手去做的时候,我们又会发现,困难重重。
写过自动化测试用例的同学,应该会有这样的经历,就是做接口测试时,我们通常会先对某个接口的各种参数进行测试,这样,接口地址相同,但是参数不一样,校验的接口也一样。
在做完单个接口之后,我们还会做由多个接口构成的业务测试,这个时候,每个接口地址都不一样,接口请求的方法也可能不一样,最后的校验点,也可能变化,这样的自动化脚本,应该要怎么写呢?
第一个对单接口
编写自动化测试脚本,可能还好实现,因为接口相同,那么他的请求方法肯定相同,虽然,请求头、请求体、校验信息可能不同,但是,至少还有共同点。
第二个
对业务编写自动化测试脚本,那就很难了,因为几乎所有的都可能不同,请求的协议、方法、请求头、请求体,全都可能不同,而且请求头和请求体还可能要有动态值,这个怎么做呢?
万事开头难,只怕要去实践。只要你想好了,真正去动手做了,这很多问题,就不那么难了。
有很多事情,我们可以根据条件判断,和循环控制等逻辑控制器,就可以实现的。
靠我一篇文章,就把它全部写出来,这是不现实的,所以,我今天,主要讲一个,被很多同学问到,难倒了一大片好汉的问题。
看到这个问题,你想到什么方法?
如果你在 jmeter 中,每个接口写一个取样器,这个问题很好解决,直接使用参数引用就可以解决,但是,这个同学的做法是把测试用例写在 CSV 文件中,然后使用 jmeter 去读取 CSV 文件,执行测试用例,如何来实现动态参数呢?
肯定,有的同学已经想到了,使用变量引用,在 CSV 中,按照 jmeter 的写法,写引用变量。
好了,给大家一个看一个参考:
这个 CSV 文件中,有两个不同的接口,说明是做的业务场景自动化测试,第一个接口,是注册,那么每次注册的账户肯定不能相同,如果相同了,那么第二次肯定失败,所以,就使用了随机函数,让注册的账户自动生成。第二个接口是登录,当然,可以用固定账户登录,但是,我们在全面进行注册,最好还是用前面注册的账户来登录,这样更加真实,body 中使用了变量引用,显然,这是用到了关联。
我们用 jmeter 写个脚本,来运行下,看能否成功
从脚本来运行情况来看,我们可以取到名称,地址,和请求体,但是,因为请求体在 CSV 中写了 jmeter 函数,结果读取出来运行时,还是原样运行,并没有对请求题中的函数进行执行。
怎么办呢?
很多人,就卡在这了,不知道怎么办了。
其实,我们想一下,现在是内容读取出来了,但是内容是原样进行请求,没有对内容中的函数进行执行,现在的问题,只需要解决 body 中的函数,能被运行就可以了。
我们再想下,在 jmeter 中,有哪些可以运行函数的方法?jexl3 函数可以,groovy 函数可以。
jexl3 函数,是要运行一段代码,返回代码结果,我们的 body 是 JSON 格式,显然不能直接运行,要想运行,还得写 Java 代码调用 JSON 运行才可以,非常复杂。
groovy 函数,是要运行一个表达式,显然,也不行。
那还有没有其他的函数呢?
eval 函数,这个函数,返回的是字符串表达式运行的结果。
此时,我们修改下我们 jmeter 中取样器的请求体
看,运行结果,函数被执行了,注册的账号动态变化了。
接下来,我们就把第一个 2 条用例,使用了关联,也写出来。
现在,我们已经实现,在 jmeter 中,使用一个取样器执行任务 2 各个不同接口,并且动态参数值的自动化运行了。
现在,我们再把断言加上。
注意: 断言中,如果有中文,就要特别注意文件编码
现在,我们再加大难度,在 CSV 文件中写个 GET 接口。
我们发现,多个接口请求方法不一样,jmeter 肯定不能用 1 个取样器了, get 请求没有 body 参数,但是,请求头要添加一个 Token 参数。
是不是一下懵圈了,不知道怎么动了?看懂下面的视频,你就知道怎么做了。
在取样器的前面增加一个条件判断,判断是请求方法,根据请求方法,执行 POST 取样器或 GET 取样器
然后,把循环次数设置为 CSV 文件条数一致,其他的地方,应该就比较容易理解了。
看最后,多条测试用例,只用 2 取样器就搞定了。以后,改动 CSV 文件,可能都不用动 jmeter 脚本,增加测试用例,改下循环控制器数量就可以了。
注意:这篇文章的技术,只适合在自动化中,不能用这个脚本进行性能测试
结语
这篇帖子到这里就结束了,当然,这还不是最完美的,里面还有诸多不足。给想用 jmeter 做接口自动化测试的同学开了个头,更多的,还需要同学们自己动手,最后,希望看这篇帖子的朋友能够有所收获,也欢迎同学们,在文章后面留言讨论和我交流。
软件接口测试工具Jmeter使用核心详解
用Jmeter做接口测试只需要掌握几个核心功能就可以了。
并不一定要把它所有的功能都掌握,先掌握核心功能入行,然后再根据工作需要和职业规划来学习更多的内容。这篇文章在前面接口测试框架(测试计划—>线程组—>请求—>查看结果树)的前提下,来介绍必须要掌握的几个核心功能,力求用最短的时间取得最大的成果。
在前面的文章中我提到,用Jmeter做接口测试的核心是单接口测试的参数化和关联接口测试的参数传递,这两个点将会是这篇文章介绍的重点。此外,由于测试过程中会涉及到数据库的连接和对执行结果的查看,所以有关于利用Jmeter连接数据库和断言也会做必要的介绍。
一、Jmeter核心功能之参数化
所谓参数化,其实就和python里面的函数一样,把框架模型搭建好,然后把不一样的数据用变量来替代,最后把成批量的数据依次传入变量进行测试,并反馈结果。参数化主要用于批量执行请求的场景下,比如要新增50条数据,依靠人手工一次次执行太慢了,而执行的流程和框架又是统一的,只是数据不一样而已。在这种情况下,就可以使用参数化来提高效率了。
在Jmeter中,可以实现参数化需求的方法有四种,但是最常用的两种是CSV和函数。这篇文章里我们将只介绍CSV。所谓CSV,其实就是Jmeter中的一个组件,是用来实现参数化的,具体怎么用我们下面再说。
还是以新增50条数据为例吧,执行的思路是怎样的呢?还记得我们在前面文章里介绍的接口测试框架吗?测试计划—>线程组—>请求—>查看结果树。
在实现这个需求的时候,还是要按照这样的框架来执行的,只不过需要在线程组下,添加一个CSV组件。其全称是CSV Data Set Config,配置路径是 线程组—>配置元件—>CSV Data Set Config。根据接口清单,查看是否需要设置content-type、charset等决定是否需要使用http信息头管理器。
如上图所示,在设置好CSV组件以后,就可以看到这样的界面了。上面红框就是名称和注释,没有什么好介绍的。重点是下面的红框,有比较多的注意事项。
从文件名来说,这里就是把已经准备好的存放50条数据的txt文件导入进来。这里有一个问题:文件首行是不是要有字段名呢?有也可以,没有也可以。我的建议是文件里不要设置字段名,响应地,在下面红框里的忽略首行里选择false。文件编码的话就是导入的文件是采用什么格式编码的,一般选择utf-8。那么如何txt文件不是utf-8怎么办呢?
如果编码不对,可能会出现乱码的情况。所以还是要确保编码方式对得上,如果txt文件不是utf-8编码的话,可以使用notepad++来将该文件的编码方式改成utf-8。这里记得要保存。
接下来是变量名称,即,在这里设置文档中的字段,后续在引用这里的变量的时候会用到变量名称。所以最好不要乱搞,并且要注意使用英文状态输入法下的逗号来分隔。忽略首行的选项,前面也说过了,保持默认值即可。
分隔符是要根据txt文件里来设置的,如果txt文件里同一条数据的不同字段是用逗号分隔的,那这里也填逗号即可。注意符合的中英文输入法。后面的设置保持默认设置即可。记得在往txt文档里填数据的时候别给数据加引号就成。
等等,怎么净是在说csv怎么设置,可是到底要怎么用,怎么进行参数化呢?别急,接下来就来介绍怎么进行参数化的内容。你还记得上面提到的变量名称吗?这里的变量名称与txt文件里的N条数据的每一条的每一个字段一一对应,那么也就意味着,只需要调用这里的变量名称,并且设置线程组里的循环次数就ok了。
循环次数设置是很简单的呀,只需要把数字改一下就可以了。那么怎么引用变量名称呢?引用的规则是什么呢?
在Jmeter中,引用参数化的格式是 参 数 名 , 比 如 说 参数名,比如说 参数名,比如说apart_id,即,一个美元符号加一个大括号,然后在大括号里引用设置好的参数名即可。
比如说,在接口清单中规定,请求体中传入的数据格式是json格式,并且给了一个示例,如下图所示:
那么我们就知道应该怎么引用变量了,将上图的代码粘贴到body中,其他的方法之类根据接口清单填写,然后将需要设置的T01、test学员等几个数值分别用在csv中设置好的变量来替代就行了。替代的格式是美元符号加大括号,然后在大括号里填写设置好的变量。注意外部的双引号不要省略,这是和python不同的一点。
变量放进去以后,参数化就完成了。其实在正常的操作过程中,这个顺序是反过来的。一般是先搭建测试框架,即前述介绍的最后一步,然后设计测试用例并存储到txt文档中,然后根据测试框架里面需要的参数来设置CSV。即,整个过程到了个个,不过不管顺序是怎么样的,只要能够完成需求,实现测试任务就ok。
二、Jmeter核心功能之参数传递(关联)
所谓参数传递(关联),其实就是说如果有多个接口的话,如何让上一个接口中获得的变量值自动传递到下一个接口中去。实现的思路其实也是设置变量,给变量赋值,引用变量的这么一个过程。明白了思路,具体怎么操作呢?
我们如果将一个请求看做一个任务的话,任务前需要做一定的准备工作,任务后也需要做一定的善后工作。对应到参数传递这块,就是需要我们做一点善后工作,即,将任务完成后获得的值拿出来再给另外一个任务。在Jmeter里,做善后工作的组件都集中在后置处理器中,如下图所示:
我们常用的两个是xpath提取器和正则表达式提取器。下面我们来详细说说怎么使用,先为当前的请求添加一个xpath提取器吧。
一些基本的东西就不说了,第一个红框记得勾选,它代表当前处理的是html或者xml格式的数据。然后第二个红框里是需要说明一下的。所谓引用名称其实就是命名变量,和参数化过程中的变量名称是一个道理,xpath query则是基于xpath的提取表达式了。
有关于xpath的语法这里做一个简单的介绍,主要是/、//、[]、@这么几个,百度一下xpath语法然后搞清楚就可以了。使用xpath的场景为xml或者html格式的数据。匹配数字这一栏,-1代表全部,0代表随机,1代表匹配第一个,2代表匹配第二个,3代表匹配第三个,以此类推……
发现了吗?到这里变量已经被命名,并且命名的值也会由xpath提取表达式赋予,只要引用就可以了。引用的方法和参数化过程中的引用方法是一样的,即美元符号,大括号,然后大括号里面填上引用的变量名即可。
怎么样,是不是感觉超级简单呢?其实Jmeter这个软件,看着庞大,但是等自己真正了解了要执行过程的逻辑以后,操作是很简单的。
介绍完了xpath提取器来实现参数传递,我们就知道,正则表达式提取器来实现参数传递的过程也是差不多的。命名变量,通过正则表达式提取值并赋予变量,然后在需要引用的时候引用。用同样的方法为当前请求添加一个正则表达式提取器,得到的界面如下图所示:
其他的东西都类似,就不介绍了,重点还是红框里的几个选项。可以看到,红框里引用名称、正则表达式、匹配数字、缺省值等和xpath里面的都差不多,所以我们这里只重点介绍一下正则表达式和模板。
正则表达式主要是用到+、.、*、?这四个符号。其中?代表右侧匹配到第一个结果为止,不加?号右侧匹配至符合条件的最后一个结果。其中+号代表匹配一次或者多次。然后在要正则表达式里要提取的内容两侧加小括号。公式的模板是这样的:前缀识别()后缀识别。至于说模板的话,采用的是 一 个 数 字 一个数字 一个数字,比如说 1 1 1代表全部取值, 0 0 0代表随机取值。
看下来是不是感觉很简单呢,就是在书写正则表达式和xpath表达式的时候麻烦一些,但那并不是Jmeter的问题,而是xpath和正则表达式的问题。稍微花点时间是可以搞定的。那么在什么情况下用xpath,在什么情况下用正则呢?
一般来说,对于提取页面内元素的属性值的话,可以考虑用xpath;对于提取其他内容的话,建议使用正则表达式。从上面的图片里可以看出,除了这两个提取器,还有很多提取器,其实使用的逻辑都是类似的,无非就是一些赋值变量的表达式不同罢了。如果需要用到的话,借鉴模仿一下就可以了。
到这里,Jmeter中最重要的单接口测试的参数化和关联接口测试的数据传递就介绍完了,你学会了吗?当然,这些都是比较基础的用法,重要的学会了内在的逻辑,其他的一通百通。接下来再来介绍一下数据库连接方法和断言。
三、Jmeter核心功能之直连数据库
之所以要介绍连接数据库,主要是有时候测试是需要和数据库里的数据进行比对的,所以还是要知道,要了解。当然,连接的操作也是很简单的,记住流程和几个注意点就行。
第一步:首先要加载一个数据库驱动。还记得我们在测试计划里提到的 添加目录或jar包到classpath 吗?就是要在这里用的。
这个包是需要自己下载的,可以百度搜索JDBC驱动包,然后合适的包下载。下载以后通过上图中红框里的浏览功能添加即可。
第二步:添加JDBC连接配置。第一步只是加载了驱动,还需要连接,这里就要用到Jmeter的一个名叫JDBC Connection Configuration的组件了。如下图,基于测试计划,一步步选择添加。
添加完毕以后,可以看到这样的一个界面,这就说明需要设置了:
屏幕有限,这里没有截全图,下面有一部分省略了。我把参数的含义列举到这里,自行对照吧:
Variable Name:数据库池名称【JDBC请求时要引用】;
Database URL: jdbc:mysql:C:\\……(其中jdbc:这是通过jdbc驱动连接数据库的固定格式,一般公司都用的是mysql,所以这里也就用mysql,其他的数据库大差不差,到时候百度一下即可,然后mysql:后面跟的是数据库的地址。这里需要注意的是由于Jmeter是用java开发的,而在java中\\代表转义字符,所以路径里需要用双反斜杠)。
JDBC Driver class:根据自己所用的选择即可
Username:连接数据库用户名
Password:数据库密码
好,到这里就设置完了。设置正确的话,在执行过程中就可以连接到数据库了。接下来就是要写sql命令去对数据库进行查询了,怎么写呢?在哪里写呢?这就需要用到Jmeter中的另一个请求了,注意,是请求。在前面我们主要介绍的都是http请求,这里在介绍一个jdbc request请求,这是请求是和数据库一块来用的。
基于线程组添加JDBC Request,可以得到如下图所示的界面,仍旧是需要做一些设置的。
由上至下,红框1里填我们在connection组件里面添的那个变量名称。红框2里是做选择的,如果是select则选择select,如果是update、delete、insert则选择update。红框3里面是填写sql语句的,书写的方法基本和我们在nvaicat里面书写是一致的,放心大胆地写就行了。红框4里面的variable name是定义一个变量并且将从数据库里返回的值赋值给这个变量,有的参数化和关联的基础,这里应该很好理解了。
只是有时候,数据库里返回的值是很多个,那他们是怎么存储在一个变量里的呢?存储的格式是这样的:变量名_N ,N代表返回的第N个结果。在引用的时候直接引用变量名_N 即可。那么如果自己忘记了怎么办呢?其实还可以添加调试取样器来查看返回的结果。
到这里直连数据库的使用方法就介绍完了,接下来介绍一点有关于断言的知识。所谓断言,就是判断请求执行的结果是否和预期结果吻合的一种判断。
四、Jmeter核心功能之断言
说实话,我感觉Jmeter里面的断言功能要比postman里面的断言功能好用多了。Jmeter中常用的断言形式有响应断言(如返回的状态码是否为200、返回的文本里是否有XXX等)、大小断言(主要用于返回的数据的大小)、持续时间断言等等。断言组件有很多,如下图所示:
但其实常用的就那么几个,而且用法都很简单。这里就不介绍了,如果后面有时间,再来介绍吧。
到这里,Jmeter中基本的接口测试过程中要用的核心功能和组件就介绍完了。记得点赞收藏关注偶~
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
最后也为大家准备了一份配套的学习资源,你能在 公众号:豆子熊!免费获取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中资料包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
以上是关于jmeter 做接口自动化测试的这些技巧你都掌握了吗的主要内容,如果未能解决你的问题,请参考以下文章