接口自动化复习第四天利用正则和faker提取替换变量值

发布时间 2024-01-06 12:39:40作者: xuhao2008

在做接口自动化测试的时候,我们经常会遇到,有些字段利用随机生成数据就行了,不需要自己去构造测试数据。今天我就是要python中的第三方库faker来构造随机数,其次使用正则表达式来提取变量。

首先在接口数据中构造变量名,像postman和apifox都是使用{{变量名}},这里我使用的是#变量名#

接口数据如下:

{ "prodName": "py59#random_str#", "brief": "", "video": "", "prodNameEn": "py59#random_str#", "prodNameCn": "py59#random_str#", "contentEn": "", "contentCn": "<p><img src="http://img30.360buyimg.com/popWareDetail/jfs/t1/93610/13/36623/126712/63f833c0Fdb5a886c/45aa553e45c8e01a.jpg.avif" alt="" /></p>", "briefEn": "", "briefCn": "py59给力", "pic": "#pic#", "imgs": "#pic#", "preSellStatus": 0, "preSellTime": null, "categoryId": 329, "skuList": [{ "price": 66, "oriPrice": 100, "stocks": 100, "skuScore": 1, "properties": "", "skuName": "", "prodName": "", "weight": 0, "volume": 0, "status": 1, "partyCode": "#cur_time#", "prodNameCn": "py59#random_str#", "prodNameEn": "py59#random_str#" }], "tagList": [2], "content": "", "deliveryTemplateId": 1, "totalStocks": 100, "price": 66, "oriPrice": 100, "deliveryModeVo": { "hasShopDelivery": true, "hasUserPickUp": false, "hasCityDelivery": false } }

可以看到我这接口数据中构造了3个变量,#random_str#,#pic#,#cur_time#。

这里random_str是使用faker随机生成的,cur_time是用python中的time进行生成的时间戳,pic是上一个接口返回的数据将它设置为全局变量,后面进行调用。

封装工具类

这里需要封装两个工具类,一个是生成随机数和时间戳的工具类,类名是handle_gen_data(类名自己随便取);另一个是替换的工具类,类名是:handle_replace

handle_gen_data

import time
from faker import Faker

fk = Faker("zh-CN")

def random_str():
return fk.pystr(8,10)

def cur_time():
return str(int(time.time() * 1000))

handle_replace

"""
替换的步骤
1.在excel中填写需要替换的地方 #全局变量名#
2.使用正则提取
3.获取到这几个全局变量之后再进行替换

数据的来源:可能是从python的函数,也可能是全局变量类里面
占位符太多的情况使用,hasattr和getattr来判断和获取
"""

import re
from tools import handle_gen_data
from tools.handle_global_data import GlobalData

def replace_mark_by_data(req_str):
"""

:param req_data: 从excel中提取出来的数据
:return:替换完成之后的字符串
"""
#从excel的请求数据里面提取占位符
res = re.findall("#(\w+)#",req_str)

#提取出来之后去重
if res:
to_be_replace_mark = list(set(res))
print(f"要被替换的占位符是{to_be_replace_mark}")
else:
print("没有要替换的占位符")
return req_str

#遍历所有占位符进行替换
for mark in to_be_replace_mark:
print(f"要替换的占位符是:{mark}")
if hasattr(GlobalData,mark):
req_str = req_str.replace(f"#{mark}#",getattr(GlobalData,mark))
print(f"在全局变量中找到了{mark}全局变量,值是{getattr(GlobalData,mark)}")
elif hasattr(handle_gen_data,mark):
value = getattr(handle_gen_data,mark)()
req_str = req_str.replace(f"#{mark}#",value)
print("替换完成")
else:
print(f"{mark}找不到可以替换的值")

return req_str

工具类写好后就去编写测试脚本。

import os
import json
import pytest
import requests

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


#实例化请求
hrq = Handle_req()

#读取excel中的测试数据
me = MyExcel(os.path.join(testdata_dir,"cases.xlsx"),"添加产品")
all_datas = me.read_all_data()

class TestAddProd:

@pytest.mark.parametrize("case",all_datas)
def test_add_prod(self,case):
#替换请求数据里面的占位符
if case.get("req_data"):
case["req_data"] = replace_mark_by_data(case.get("req_data"))

#调用请求方法,发送请求
resp = hrq.send_req(case.get("method"),case.get("url"),json_data=case.get("req_data"),
files=case.get("file"),token=getattr(GlobalData,"token"))

#请求结果转成字典
try:
resp_dict = resp.json()
except:
resp_dict = {"data":resp.text}

#将提取列的东西转换成全局变量
if case.get("extract"):
extract_value_from_resp(case.get("extract"),resp_dict)

print(resp.status_code)
print(resp.text)
结果: