jmeter 不务正业,干起了可变接口、动态参数自动化测试

本贴最后更新于 1204 天前,其中的信息可能已经物是人非

jmeter这个工具既可以做接口的功能测试,也可以做自动化测试,还可以做性能测试,其主要用途就是用于性能测试。但是,有些公司和个人,就想用jmeter来做接口自动化测试。

你有没有想过呢?

下面我就给大家讲讲,用jmeter如何做接口自动化测试。

如果要你用jmeter来做接口自动化测试,你是不是把几乎每一个测试用例,都是用一个取样器来实现?

相信很多人都是这么想的,也是这么干的。

但是,很遗憾,你这种,是初级入门做法。你能实现所有的测试用例都被执行,但是,你写脚本和维护脚本的时间,可能比你用手工执行所有的测试用例时间还要长,而且还可能长很多。因为,只要开发人员改了接口一个地方,你得从所有取样器中,找出与这个接口相关的所有取样器,然后一一修改,万一有遗漏,哪出现的失败,不是bug,而是你脚本的问题。所以说,这是入门级人干的事情。

哪有没有更好的办法呢?

平时写功能测试用例的时候,习惯用Excel的同学,可能就会想,我能把自动化测试用例每个信息都写在Excel表格中,然后,使用jmeter的csv数据文件读取功能,把它读取出来执行,是不是就可以呢?

这种方法,就比前面的方法好了很多,用例还是用Excel来维护,只是使用jmeter来读取,执行就可以了。整体的可维护性要好很多很多,工作量也要少很多。

但是,在真正动手去做的时候,我们又会发现,困难重重。

写过自动化测试用例的同学,应该会有这样的经历,就是做接口测试时,我们通常会先对某个接口各种参数进行测试,这样,接口地址相同,但是参数不一样,校验的接口也一样。

在做完单个接口之后,我们还会做由多个接口构成的业务测试,这个时候,每个接口地址都不一样,接口请求的方法也可能不一样,最后的校验点,也可能变化,这样的自动化脚本,应该要怎么写呢?

第一个对单接口,编写自动化测试脚本,可能还好实现,因为接口相同,那么他的请求方法肯定相同,虽然,请求头、请求体、校验信息可能不同,但是,至少还有共同点。

而第二个,对业务编写自动化测试脚本,那就很难了,因为几乎所有的都可能不同,请求的协议、方法、请求头、请求体,全都可能不同,而且请求头和请求体还可能要有动态值,这个怎么做呢?

万事开头难,只怕去实践。只要你想好了,真正去动手做了,这很多问题,就不那么难了。

有很多事情,我们可以加条件判断,和循环控制等逻辑控制器,就可以实现的。

靠我一篇文章,就把它全部写出来,这是不现实的,所以,我今天,主要讲一个,被很多同学问到,难倒了一大片好汉的问题。

jmeter20210804174933.png

看到这个问题,你想到什么方法?

如果你在jmeter中,每个接口写一个取样器,这个问题很好解决,直接使用参数引用就可以解决,但是,这个同学的做法是把测试用例写在csv文件中,然后使用jmeter去读取csv文件,执行测试用例,如何来实现动态参数呢?

肯定,有的同学已经想到了,使用变量引用,在csv中,按照jmeter的写法,写引用变量。

好了,给大家一个看一个参考:

jmeter20210805142231.png

这个csv文件中,有两个不同的接口,说明是做的业务场景自动化测试,第一个接口,是注册,那么每次注册的账户肯定不能相同,如果相同了,那么第二次肯定失败,所以,就使用了随机函数,让注册的账户自动生成。第二个接口是登录,当然,可以用固定账户登录,但是,我们前面进行注册,最好还是用前面注册的账户来登录,这样更加真实,body中使用了变量引用,显然,这是用到了关联。

我们用jmeter写个脚本,来运行下,看能否成功

jmeterautotest1.gif

从脚本来运行情况来看,我们可以取到名称,地址,和请求体,但是,因为请求体在csv中写了jmeter函数,结果读取出来运行时,还是原样运行,并没有对请求体中的函数进行执行。

怎么办呢?

很多人,就卡在这了,不知道怎么办了。

其实,我们想一下,现在是内容读取出来了,但是内容是原样进行请求,没有对内容中的函数进行执行,现在的问题,只需要解决body中的函数,能被运行就可以了。

我们再想下,在jmeter中,有哪些可以运行函数的方法?jexl3函数可以,groovy函数可以。

jexl3函数,是要运行一段代码,返回代码结果,我们的body是json格式,显然不能直接运行,要想运行,还得写java代码调用json运行才可以,非常复杂。

groovy函数,是要运行一个表达式,显然,也不行。

那还有没有其他的函数呢?eval函数,这个函数,返回的是字符串表达式运行的结果。

jmeter20210805155720.png

此时,我们修改下我们jmeter中取样器的请求体

jmeter20210805155910.png

jmeterautotest2.gif

看,运行结果,函数被执行了,注册的账号动态变化了。

接下来,我们就把第2条用例,使用了关联,也写出来。

jmeterautotest3.gif

现在,我们已经实现,在jmeter中,使用一个取样器执行2个不同接口,并且动态参数值的自动化运行了。

现在,我们再把断言加上。

jmeterautotest4.gif

注意: 断言中,如果有中文,就要特别注意文件编码

现在,我们再加大难度,在csv文件中写个GET接口。

jmeter20210805165305.png

我们发现,多个接口请求方法不一样,jmeter肯定不能用1个取样器了, get请求没有body参数,但是,请求头要添加一个Token参数。

是不是一下楞圈了,不知道怎么动了?看懂下面的视频,你就知道怎么做了。

jmeterautotest5.gif

在取样器的前面增加一个条件判断,判断是请求方法,根据请求方法,执行POST取样器或GET取样器

然后,把循环次数设置为csv文件条数一致,其他的地方,应该就比较容易理解了。

看最后,多条测试用例,只用2个取样器就搞定了。以后,改动csv文件,可能都不用动jmeter脚本,增加测试用例,改下循环控制器数量就可以了。

当然,这还不是最完美的,里面还有诸多不足。给想用jmeter做接口自动化测试的同学开了个头,更多的,还需要同学们自己动手,也欢迎同学们,在文章后面留言讨论。

注意,这篇文章的技术,只适合在自动化中,不能用这个脚本进行性能测试

1 操作
Allen 在 2021-08-05 18:45:34 更新了该帖
6 回帖
请输入回帖内容 ...
  • Fell

    ? 又get到一个函数,和python里一样的eval 函数。

  • CTwo

    牛逼啊

  • zaizai

    直接人看傻了。

  • my7292030

    有没得的这一节的全套视频啊,这动态图看不清楚 又不能暂停。话说,这一招,简直绝了。我们都是单个接口加单个取样器,你这一两个取样器可以执行N个接口,一个字,牛逼!

  • xiaoyuer

    厉害了,学到了

  • mufeng
    该回帖仅作者和楼主可见
请输入回帖内容 ...