HttpRunner使用中的一些问题记录

背景:在了解接口自动化框架的过程中,看到有介绍说HttpRunner是一款不错的开源框架。所以,简单试用了一下。虽然有中文使用手册的帮助,但在结合自己项目接口的使用中还是遇到一些问题。在解决这些问题之后,也对这一框架的使用有了更深的了解。

环境:Python3.6 + HttpRunner1.5.13 + har2case 0.1.10

问题:

1. 录制脚本时,保存成 HAR 格式的文件。

1)使用Fiddler4抓包,并接口的请求和响应结果保存为 .har 格式的文件。选中接口,然后点击 Decode。

2)选择菜单栏中,File-》Export Sessions-》Selected Sessions,选择HTTPArchive v1.1类型。

HttpRunner使用中的一些问题记录_第1张图片

3)保存文件类型如图所示。

2. 文件格式的转换

上述步骤中保存的.har文件,需要转换成yaml或json文件。在文件所在目录,使用cmd,执行命令: har2case xx.har xx.json

3. 认识JSON文件。引用中文手册中的例子

[
  {
    "config": {
      "name": "testset description",
      "variables": [],
      "request": {
        "base_url": "",
        "headers": {
          "User-Agent": "python-requests/2.18.4"
        }
      }
    }
  },
  {
    "test": {
      "name": "/api/get-token",
      "request": {
        "url": "http://127.0.0.1:5000/api/get-token",
        "headers": {
          "device_sn": "FwgRiO7CNA50DSU",
          "user_agent": "iOS/10.3",
          "os_platform": "ios",
          "app_version": "2.8.6",
          "Content-Type": "application/json"
        },
        "method": "POST",
        "json": {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}
      },
      "validate": [
        {"eq": ["status_code", 200]},
        {"eq": ["headers.Content-Type", "application/json"]},
        {"eq": ["content.success", true]},
        {"eq": ["content.token", "baNLX1zhFYP11Seb"]}
      ]
    }
  }

]

  • test: 即一个用例
  • name:在report中显示的名称
  • request:包含请求的url,headers,method,body
  • validate:期望值,也就是要验证的值。根据这里的key,取出响应中的值与期望做比较。如,{"eq": ["status_code", 200]}。会取出响应中"status_code"的值,与200比较。

4.响应体中有数组,如何提取值。

1)首先,在validate之前,request之后,添加提取响应体的代码格式如:"extract": [{"变量名": "变量的取值路径"}]。如,"extract": [{"token": "content.token"}]

2)项目中接口返回的层级结构是这样的:响应体-》res-》token(列表)。因此这里,需要这样写:"extract": [{"token": "content.res.token.0"}]

  • content:响应体
  • res:响应体第一层
  • token:响应体第二层。且为一个列表
  • 0:表示取该列表的第一元素

5.全局变量。请求中有一些值是每个接口都要用到的,例如,ip,port,headers。因此可以提取出来作为全局变量,放在"config"中。

{
    "config": {
      "name": "testset description",
      "variables": [],
      "request": {
        "base_url": "",
        "headers": {
          "User-Agent": "python-requests/2.18.4"
        }
      }
    }
 }
  • base_url:存放ip,port等信息。
  • headers:存放共有的headers信息。

修改如下:

{
    "config": {
      "name": "testset description",
      "variables": [],
      "request": {
        "base_url": "http://127.0.0.1:5000/api",
        "headers": {
          "User-Agent": "python-requests/2.18.4",   # 注意这里的 ,
          "Content-Type": "application/json;charset=UTF-8"
        }
      }
    }
 }

去掉用例中的相同部分。变为:"request": { "url": "/get-token"...  , headers中的“Content-Type”去掉。

6.关联变量。

1)登录接口返回的token,在后面其他接口中都需要使用。除了在登录接口中提取外,还需要在其他接口中添加。这里token需要放到其他请求的headers中。因此在其他请求的request中添加如下公式:

"request": {
        "url": "http://127.0.0.1:5000/api/get-token",
        "headers": {
          "x-auth-token": "$token"   #这里$为引用变量的意思,"token"即在登录接口中extract里定义的变量名
        }

2)从前面的请求中提取响应体中的值,作为下一个请求的输入。

      a)提取值的部分与前面提取token相同。例如这里需要提取的变量为:"extract":[{"regionIds": "content.res"}]。这里的res是一个列表,在下一个接口中,只需要该列表中的某一个元素。因此,需要格外增加判断。regionIds后面的接口会引用该变量。

      b)HttpRunner中,支持“debugtalk.py”这样的热插拔。

            i. 在用例,即JSON文件同级目录下,新建 debugtalk.py。

            ii. 根据业务逻辑增加代码。如

            SECRET_KEY = "DebugTalk"

            def get_region_id(args):

                   for i in range(len(args)):

                        if "myRegion" == args[i]["regionName"]:    # 找到指定的regionName,然后获取其id

                            regionId = args[i]["id"]

                            return regionId

       c)在下一个请求中使用。这里是在uri中引用的regionId。

"request": {
        "url": "/${get_region_id($regionIds)}" #格式:${fun($var)}。fun为.py中的函数名,var为前一接口提取的变量名
        "headers": {
          "x-auth-token": "$token"
        },

参考资料:

http://cn.httprunner.org/quickstart/

你可能感兴趣的:(测试工具)