接口自动化测试第三天,利用类的动态方法设置全局变量

发布时间 2023-12-28 15:29:16作者: xuhao2008

今天的注意知识点是学会使用jsonpath,利用类的动态方法设置全局变量

我们大多数情况下,接口都需要使用到登录时获取的token,为了方便使用,我们需要将登录后的token使用jsonpath表达式提取出来然后设置为全局变量

首先提前下载好第三方库,jsonpath,这里给一个jsonpath官方地址和在线练习平台

官方地址:https://goessner.net/articles/JsonPath/

在线检验jsonpath是否正确:https://www.jsonpath.cn/

然后我们需要在我们的测试数据文档里面多加一列,用来设置全局变量以及jsonpath提取表达式。如下图。需要注意的是,这一列的填写格式是”{全局变量名:jsonpath表达式, 全局变量名:jsonpath表达式}“

 

我们先编写设置全局变量的工具脚本

```python
class GlobalData:

token = None

#设置全局变量
#setattr(GlobalData,"全局变量名称","提取全局变量的jsonpath表达式")
#获取全局变量
#getattr(GlobalData,"全局变量名称")
```

然后这里我们需要编写提取的工具脚本了

```python
import json
from jsonpath import jsonpath

from tools.handle_global_data import GlobalData


def extract_value_from_resp(excel_data,resp_dict):
"""

:param excel_data:excel中的extract列的值.字符串类型的
:param resp_dict: 响应数据,字典类型
:return: None,提取的值都设置为全局变量了
"""
#将excel中的值转换为字典格式
excel_dict = json.loads(excel_data)

#遍历这个excel的值,提取出全局变量名和提取表达式
for key,value in excel_dict.items():
print("全局变量名称是:",key)
print("jsonpath提取表达式是:",value)
#从响应结果中,根据jsonpath表达式提取出来值
#提取到的值是列表形式,没提取到就是False
result = jsonpath(resp_dict,value)
if result:
#如果有值的话,设置为全局变量
setattr(GlobalData,key,result[0])
```

准备好工具之后,就写测试用例脚本

提前导入需要的第三方库和自己的工具类方法,然后再一步步编写。

```python
import os
import json

import pytest
import requests

from tools.handle_excel import MyExcel
from tools.handle_req import Handle_req
from tools.handle_global_data import GlobalData
from tools.handle_extract import extract_value_from_resp
from tools.handle_path import basedir,testdata_dir,img_dir

 

#实例化发送请求对象
hrq = Handle_req()

#读取测试数据
me = MyExcel(os.path.join(testdata_dir,"cases.xlsx"),sheet_name="上传图片")
all_datas = me.read_all_data()


class TestUploadFile:
@pytest.mark.parametrize("case",all_datas)
def test_upload_file(self,case):
#调用封装的请求方法,会自行转换格式,不用多次处理
resp = hrq.send_req(case.get("method"),case.get("url"),json_data=case.get("req_data"),files=case.get("file"),token = getattr(GlobalData,"token"))

#有的请求返回的不是json格式,所以需要转换成字典格式
try:
resp_dict = resp.json()
except:
resp_dict = {"data":resp.text}

#excel中的extract列不是都有值的,如果有值,则提取出来设置为全局变量
if case.get("extract"):
extract_value_from_resp(case.get("extract"),resp_dict)

```

这里闹了一个乌龙,报错了告诉我,文件不存在,让我检查文件是否正常,然后我查看了一下目录下的文件,确定文件是没问题的,又去检查一下我写的handle_path工具类里面定义的图片文件路径,也没有问题,后面发现,原来是我的文件路径离我的项目路径还隔一层,于是修改img_dir路径重新发送请求。结果如下: