1. 创建测试计划—线程组—HTTP请求(填入协议 ip 端口号 get/post 路径)—查看结果树,运行看看结果树是否调用接口,返回页面显示的内容,大多数以json的形式展示返回结果。
  2. 对于接口调用完毕后响应结果判断,使用断言。比如:json断言,既判断json数据中是否存在,又可以判断具体的值。json格式{key:value}。表达key,用JsonPath语言引用 :$.key  如果此key1下面还有嵌套key2,则表示为$.key1.key2。json断言中:①Assert JSON Path exists:$.key1.key2  (这里假设了这个键有一次嵌套)  ②Additionally assert value✓  ③Expected value: value(填入key2应对应的值),这里也可以使用变量。    可以创建多个JSON断言,运行后通过查看结果树查看断言结果。
  3. 如果被测数据会变动(动态数据),每一次测试之前都去数据库校对数据,显得比较低效。这时可以用Jmeter连接数据库,将数据库最新数据的查询结果导入Jmeter,加载入断言中的Expected value与接口返回的结果进行比对和判断。(Jmeter虽然是用java写的,但它本身不具备直接连接数据库的能力,因为没有数据库的驱动,要先下载数据库对应的驱动。驱动jar包添加到TestPlan界面下:添加目录或jar包到ClassPath-浏览-选择数据库jar包-添加)
  4. Jmeter连接数据库:线程组中添加-配置元件-JDBC Connection Configuration(数据库连接配置,作用不是查数据,而是定义了数据库相关连接)-Variable Name for created pool:为在jmeter创建的数据库命名。页面中4个必填:①Database Connnection Configuration-Database URL:填入java的jdbc url,里面包含mysql地址、端口号、数据库名称、编码;②JDBC Driver class:选择com.mysql.jdbc.Driver(根据所需连接的数据库类型选择);③Username:数据库连接名;④Password:数据库密码。
  5. 添加数据库命令请求:线程组中添加-取样器-JDBC Request(执行SQL,把数据从数据库里面加载到jmeter内存,以变量保存)-Variable Name of Pool declared in JDBC Connection Configuration:刚刚定义的数据库名称-Query Type:选择将进行的数据库操作,增删改查等-在Query区域中输入SQL语句-Variable names中定义SQL返回的变量名称,多个可以用英文逗号隔开。
  6. 将步骤5最后定义的变量赋值到步骤2中json断言的Expected Value中,用引用的方式:比如${id}、${name},这样定义变量执行后HTTP请求(步骤1)会报错。报错原因是执行SQL语句返回的数据和访问接口返回的数据不一致,这时候需要debug调试看看是哪里出现的问题。
  7. 添加调试取样器:线程组中添加-取样器-Debug Sampler,这个调试取样器可以打印变量/属性,下面3个栏位中将Jmeter变量置为True,其他默认为False。这样可以打印我们在Jmeter中自己定义的变量,既我们定义执行SQL后返回的变量。(步骤5中的Variable names)重新运行测试计划后,可在debug取样器响应的数据中看到jmeter从数据库中获取到的变量名不太一样。我们定义的是id ,name,而数据库查询到返回的是id_#=1,id_1=xxx; name_#=1,name_1=xxx;(xxx表示实际上查询返回的值),即Jmeter给变量名加上了序号,Jmeter改了变量名的原因:Jmeter内置机制是预计测试人员执行的SQL结果是可能有多条数据,动态生成多个变量,所以给保存的变量挂上了序号,也不会因为SQL最终只返回一条数据而不用这个变量保存规则。
  8. 针对步骤7,可以将步骤6中json断言的预期变量相应地改为${id_1},${name_1},这样就不会报错。不过这样只能保证这条案例不报错,若后续执行的SQL语句会返回多条结果数据,则序号1就不够表达那么多条数据了。比如说SQL语句SELECT 字段1,字段2 FROM 表 ORDER BY rand() limit 2,这时候需要用到DDT数据驱动。HTTP请求中的路径尾部的变量也跟着变,所以要将尾部决定接口响应数据的变量参数化。JSON变量表达式可以用在很多地方,比如JMETER名称,注释等。
  9. 当有多个http请求,且要求每个http请求循环的次数不同时,可使用循环控制器进行单独设置。这里需要添加一个循环控制器,线程组-添加-逻辑控制器-循环控制器,循环次数填写数字,如果是要循环2次,就填入2,数据库SQL执行会返回2条。
  10. 尝试执行一下,会发现结果数中2个请求返回的结果都是同一个,因为接口变量用的是${id_1},所以Jmeter只会访问第一个id。要使第一次循环执行的是id1,第二次执行的是id2,就是把这个${id_1}中的数字变成动态化。这里需要给循环控制器添加一个计数器(一般这两个都是配套使用,将每次的循环进行迭代)。循环控制器-添加-配置元件-计数器,Starting value:从哪个值开始,这里填入1;递增:每次增加几个,填入1;引用名称:指的是哪个变量要进行递增,这里我们要id_1的数字进行递增,数字姑且设置为变量n,也就是执行几次,n的数字会动态变化。
  11. 变量的嵌套使用,本来id_1就是个变量,因为它被我们定义在${}中,所以直接用${id_n},jmeter是无法解析到里面的n就是变量,也无法用${id_${n}}这种写法嵌套。需要用到jmeter里的一个函数value:__v(A${N})  前面是2个下划线。套用进去就是${__V(id_${n}),定义好了之后,HTTP请求中,url地址引用的变量、JSON断言中使用的id_1变量都要改成${__V(id_${n})},如果是name,就对应改成${__V(name_${n})}。