反骨仔

一个业余的 .NET Core 攻城狮

0%

19 JMeter 天气接口自动化测试

本章通过“查询天气接口”的例子,来讲述 JMeter 中参数化、断言、关联、正则表达式的用法 。

19.1 天气查询的例子

手动查询天气 的步骤:

  1. 打开浏览器,打开 http://www.weather.com.cn/
  2. 在“城市名称”中输入“上海”,单击查询,就能查询到上海的天气 。接下来我们把这个天气查询的例子做成自动化。

19.2 天气查询网站抓包

启动 Fiddler,单击菜单栏中 Rules -> Hide Image Requests 。 抓包的时候,如果抓了 太多不相干的包,干扰会很大,所以我把图片的包都隐藏了。

打开浏览器,打开 http://www.weather.com.cn/,在“城市名称”中输入“上海“,单击查询按钮。

通过 Fiddler 抓包,会抓到几十个包。

19.3 抓包分析

通过上面的抓包,我们经过分析可以知道实际上是做了 2 步。

image-20210111003646994

  1. 第一步 :获取城市代码

    发送一个 GET 请求到 http://toyl.weather.com.cn/search?cityname=上海(注意 , “上海”被 URLEncode 后变成了“ %E4%B8%8A%E6%B5%B7“)。

    从这个响应中可以得到上海的地区代码,比如上海的地区代码是 101020100 。

    【注意 】这个请求必须带上一个 叫“ Referer ”的 Header,Referer 的作用 就是用来追踪来源的。

  2. 第二步:获取城市的天气数据。

    发送一个 GET 请求到 http://www.weather.eom.cn/weatherld/101020100.shtml,可以得到该城市 的天气数据 。

    另外,我们还需要做把城市参数化,这样就可以查询任何一个城市的天气 。 第一个请求查询到的数据要传给第二个请求使用,我们称之为关联。

19.4 获取城市地区代码

现在我们用 JMeter 来发包,实现整个过程,具体的操作步骤如下。

  1. 启动 JMeter,新建一个线程组( Thread Group )
  2. 在线程组下面新建一个 HTTP 请求,将其命名为 GetCityCode。发送一个 Get 方法的 HTTP 请求到 http://toyl.weather.com.cn/search?cityname=上海

image-20210111004139998

添加一个 HTTP 信息头管理器,添加一个 Referer。

image-20210111004203257

再添加一个察看结果树,就可以运行查看结果了,如图 19-4 所示 。 注意这里的汉字变成乱码了 。

image-20210111004232183

19.5 处理 JMeter 中 HTTP 响应乱码

为什么中文会显示为乱码呢?

当响应数据或响应页面没有设置编码时,JMeter 会按照 jmeter .properties 文件中的 sampleresult.default.encoding 设置的格式解析 。 默认是 IS0-8859-1,所以解析中文时肯定会出错 。jmeter.properties 文件在 \apache-jmeter-3.2\bin 下面,内容如下:

image-20210111004336147

重新启动 JMeter,打开脚本,重新运行。

image-20210111004626057

19.6 添加验证点

选择 GetCityCode 这个 HTTP 请求,用鼠标右键选择添加->断言->响应断言。

image-20210111004652397

选择线程组,用鼠标右键选择添加,>监听器”>断言结果 。

运行后,如果 HTTP 响应中没有包含期待的宇符串,那么断言就会失败。

image-20210111004947109

19.7 使用用户自定义变量

我们还可以在几1eter 中定义变量。 比如我们定义一个变量叫 city,调用这个变量的时候用 ${city}。
选择线程组,用鼠标右键选择添加 ->配置元件·>用户定义的变量。

我们添加一个变量 city ,其值设为“上海”。

image-20210111011128382

然后在 GetCityCode 中使用这个变量。

image-20210111011152330

这样我们就实现了参数化,以后修改城市的时候,只要修改用户自定义变量就可以了 。

19.8 正则表达式提取城市地区代码

如果你不熟悉正则表达式,请去百度搜索“正则表达式 30 分钟入门教程”。 正则表达式的教程和工具可以到 https://deerchao.ne/torials/regex/regex-1.htm 下载 。

推荐先使用 一个正则表达式测试器测试一下你的正则表达式字符串是否正确。方法是把 GetCityCode 的 HTTP 响应复制到正则表达式工具中,测试一下正则表达式字符串是否正确 。

例如,我们的正则表达式字符串是(\d{9}?~.*~上海

image-20210111011247190

选择 GetCityCode 这个 HTTP 请求,用鼠标右键选择添加 –> 后置处理器”>正则表达式提取器

image-20210111011402224

所谓关联 , 就是一个 HTTP 请求使用了另一个 HTTP 请求中的数据,两个请求之间发生了关联。

通过正则表达式提取器,我们把城市代码提取出来,并且存到变量 citycode ,然后把这个变量提供给第二个 HTTP 请求使用。

19.9 获取天气

现在新建第二个 HTTP 请求,命名为 GetWeather。发送一个 GET 请求到 http://www.weather.com.en/weather1d/${citycode} .shtml 。

${citycode} 中的数据是从正则表达式中提取来的。

现在 ,脚本全部写好了。运行后,在“察看结果树”中查看结果。

image-20210111011556119

image-20210111011607192

参考

《HTTP 抓包实战》