解决方案:一款采集器
优采云 发布时间: 2022-10-03 17:08解决方案:一款采集器
免费采集器推荐 越来越多的人意识到数据是一种资产。当我们有数据抓取需求时,我们常常会因为不知道有哪些实用且免费的方法可用而烦恼。这里我们推荐你使用:data采集器。什么是data采集器这里所说的data采集器特指根据用户的指令或设置从指定平台获取用户指定内容的工具软件。严格来说,这里提到的数据采集器也是爬虫的一种。本文将为大家推荐一个好用又免费的数据采集器,并以网易文章采集为例给出快速入门教程指南。优采云Data采集器优采云是一个简单而强大的网络数据采集工具,可从不同的网站下载获取标准编程规范ABS标准化数据可帮助客户实现数据自动化采集、编辑、标准化,从而降低成本,提高效率。优采云采集器完整的可视化操作,简单几步即可获取数据,支持AJAX网页采集,支持自写Xpath和过去三个同志的常规表格多年的现实性能材料材料招标先进的功能,如技术评分表图表和交易 pdf 眼图打印 pdf 用图表 pdf 表达式说话。在其免费版本中,所有 采集 功能都是无限的,可以将数据导出到本地文件/本地数据库。个人一般采集需要,免费版完全够用。优采云采集器还有付费版(增值服务)。其旗舰版具有云采集功能。它还可以在关闭时在云服务器上运行 采集 任务。
支持验证码识别,自定义不同浏览器logo,可有效防止IP。同时,优采云还提供数据直购服务。以下是采集网易账号文章的示例。采集网站:网易账号,前身为网易订阅,是网易传媒完成“两端”整合升级后打造的全新的自有内容分发和品牌推广平台。本文以网易账号首页列表为例。您还可以更改 采集URL采集 其他列表。采集内容:文章 标题 快递公司问题 快递公司问题 快递公司付款处理 关于圆的周长和面积 关键问题 关于解方程 问答 关于南海问题,发布时间,文章正文。使用功能点:列出循环详情采集第一步:创建网易账号文章采集任务进入主界面,选择“自定义采集”2)将将采集的网址复制粘贴到网站的输入框中,点击“保存网址” 第二步:创建循环 点击加载更多 打开网页后,打开右上角的流程角落。建厂流程下载关于规范招聘要求审批流程流程圣经pdf制作流程表下载按钮,从左侧的流程显示界面拖拽一个循环的步骤,如下图2)然后拉到页面底部可以看到Load more按钮,因为如果要查看更多内容,需要先单击以循环加载更多,因此我们需要为单击“加载更多”设置循环步骤。注意:采集更多内容需要加载更多内容。本文文章只是为了演示,所以选择执行并点击“加载更多”20次,你可以根据自己的实际需要加减。更多内容需要加载更多内容。本文文章只是为了演示,所以选择执行并点击“加载更多”20次,你可以根据自己的实际需要加减。更多内容需要加载更多内容。本文文章只是为了演示,所以选择执行并点击“加载更多”20次,你可以根据自己的实际需要加减。
第三步:创建循环 点击列表采集Details1)点击文章列表的第一个和第二个标题,然后选择“循环点击每个元素”按钮,这样就创建了一个循环点击列表命令,在采集器中可以看到当前列表页的内容。然后我们就可以提取出我们需要的文本数据了。下图提取了正文三部分的正文内容,包括标题、时间、正文。其他信息需要自由删除和编辑。然后可以点击保存启动本地采集。单击开始采集 后,采集器 开始提取数据。4)采集结束后导出。相关采集器教程:新浪微博资料采集 快乐书 成语 关于书 成语 关于读词 关于读词 关于阅读 比较句子 关于阅读 社区书籍 漂流约定 如何写客座小说采集高地德语地图数据采集方法爆文采集方法优采云——90万用户选择的网页数据采集器。1、操作简单,任何人都可以使用:不需要技术背景,只要知道互联网采集。完成流程可视化,点击鼠标完成操作,2分钟快速上手。2、功能强大,任意网站可选:点击、登录、翻页、身份验证码、瀑布流、Ajax脚本异步加载数据,都可以通过简单的设置进行设置采集。3、 云采集,也可以关闭。配置采集任务后,可以将其关闭,并可以在云端执行任务。庞大的云采集集群24*7不间断运行,无需担心IP阻塞和网络中断。4、功能是免费+增值服务,按需选择。免费版具有满足用户基本采集需求的所有功能。同时设置一些增值服务(如私有云),满足高端付费企业用户的需求。因此无需担心IP阻塞和网络中断。4、功能是免费+增值服务,按需选择。免费版具有满足用户基本采集需求的所有功能。同时设置一些增值服务(如私有云),满足高端付费企业用户的需求。因此无需担心IP阻塞和网络中断。4、功能是免费+增值服务,按需选择。免费版具有满足用户基本采集需求的所有功能。同时设置一些增值服务(如私有云),满足高端付费企业用户的需求。
优化的解决方案:基于数据驱动的接口自动化框架封装
码同学抖音号:小马哥聊天软件测试
1.数据驱动框架设计1.框架结构2.Excel数据规则设计
按照一定的维度进行分类,每个分类都可以作为一张工作表
变量名变量值
主持人
82.xxx74.xx:xxxx
用户名
密码
123456
当表单类型:
{
"data":{
"xxx":"xxjsdhdh"
}
}
查询参数:
{
"params":{
"xxx":"xxjsdhdh"
}
}
json参数:
{
"json":{
"xxx":"xxjsdhdh"
}
}
混合参数,例如表单和查询:
{
"params":{
"xxx":"xxjsdhdh"
},
"data":{
"ddd":"ddff"
}
}
接口名称默认参数
登录
{ "数据":{ "用户名":"${用户名}", "密码":"${密码}" } }
添加客户
{“json”:{“实体”:{“customer_name”:“Shamo001”,“手机”:“”,“电话”:“”,“网站”:“/”,“next_time”:“2022-05- 12 00:00:00", "remark": "这是一个备注", "address": "北京市北京市昌平区", "detailAddress": "火营地铁出口", "location": "", “液化天然气”:“”,“纬度”:“”}}}
新联系人
{ "json":{ "entity": { "name": "Shamo 001 Contact", "customer_id":"${customerId}", "mobile": "", "telephone": "", "email": "", "post": "采购人员", "address": "这是地址", "next_time": "2022-05-10 00:00:00", "remark": "这是备注" } } }
新产品
{ "json":{ "entity": { "name": "python 全栈自动化", "category_id": 23, "num": "98888", "price": "6980", "description": "interface /web/app/持续集成" } } }
测试集合名是否被执行
添加客户端接口测试集合
是的
新增接触界面测试合集
是的
新建产品接口测试合集
是的
2.数据驱动框架底层代码实现1.创建项目
依靠设计创建项目结构
2.Excel 数据读取
在名为 testcase_util.py 的通用包下创建一个 python 文件
# !/usr/bin python3
# encoding: utf-8 -*-
# @file : testcase_util.py
# @author : 沙陌 Matongxue_2
# @Time : 2022-05-10 11:27
# @Copyright: 北京码同学
import openpyxl
# 读取全局变量sheet工作表
def get_variables(wb):
sheet_data = wb['全局变量']
variables = {} # 用来存储读到的变量,名称是key,值是value
lines_count = sheet_data.max_row # 获取总行数
for l in range(2,lines_count+1):
key = sheet_data.cell(l,1).value
value = sheet_data.cell(l,2).value
variables[key] = value
return variables
def get_api_default_params(wb):
sheet_data = wb['接口默认参数']
api_default_params = {} # 用来存储读到的变量,名称是key,值是value
lines_count = sheet_data.max_row # 获取总行数
for l in range(2,lines_count+1):
key = sheet_data.cell(l,1).value
value = sheet_data.cell(l,2).value
api_default_params[key] = value
return api_default_params
# 获取要执行的测试集合名称
def get_casesuitename(wb):
sheet_data = wb['测试集合管理']
lines_count = sheet_data.max_row # 获取总行数
cases_suite_name = [] # 用来存储要执行的测试集合名称
for l in range(2,lines_count+1):
flag = sheet_data.cell(l,2).value
if flag == 'y':
suite_name = sheet_data.cell(l,1).value
cases_suite_name.append(suite_name)
return cases_suite_name
# 需要根据要执行的测试集合名称来读取对应的测试用例数据
def read_testcases(wb,suite_name):
sheet_data = wb[suite_name]
lines_count = sheet_data.max_row # 获取总行数
cols_count = sheet_data.max_column # 获取总列数
"""
规定读出来的测试数据存储结构如下:
{
“新增客户正确”:[
['apiname','接口地址','请求方式','头信息',....],
['apiname','接口地址','请求方式','头信息',....],
],
"新增客户失败-用户名为空":[
['apiname','接口地址','请求方式','头信息',....]
],
"新增客户失败-手机号格式不正确":[
['apiname','接口地址','请求方式','头信息',....]
]
}
"""
cases_info = {} #用来存储当前测试集合中的所有用例信息的
for l in range(2,lines_count+1):
case_name = sheet_data.cell(l,2).value # 测试用例名称
lines = [] # 用来存储当前行测试数据的
for c in range(3,cols_count+1):
cell = sheet_data.cell(l,c).value # 当前单元格数据
if cell == None: # 处理空单元格
cell = ''
lines.append(cell)
# 判断当前用例名称是否已存在于cases_info中
# 如果不存在,那就是直接赋值
# 否则就是在原来的基础上追加
if case_name not in cases_info:
cases_info[case_name] = [lines]
else:
cases_info[case_name].append(lines)
return cases_info
# 整合所有要执行的测试用例数据,将其转成pytest参数化需要的数据结构格式
def get_all_testcases(wb):
"""
整合后的数据结构是
[
['新增客户接口测试集合','新增客户正确',[[],[]]],
['新增客户接口测试集合','新增客户失败-用户名为空',[[],[]]],
['新增客户接口测试集合','新增客户失败-手机号格式不正确',[[],[]]],
['新建产品接口测试集合','新建产品正确',[[],[]]],
['新建产品接口测试集合','新建产品失败-产品编码重复',[[],[]]],
]
:param wb:
:return:
"""
test_data = [] # 用来存储所有测试数据
# 获取所有要执行的测试集合名称
cases_suite_name = get_casesuitename(wb)
for suite_name in cases_suite_name:
# 遍历读取每个要执行的测试集合sheet工作表中的测试用例数据
cur_cases_info = read_testcases(wb,suite_name) # 是个字典
for key,value in cur_cases_info.items():
# key实际上就是测试用例名称,value实际上测试用例多行数据信息
case_info = [suite_name,key,value]
test_data.append(case_info)
return test_data
if __name__ == '__main__':
wb = openpyxl.load_workbook('../testcases/CRM系统接口测试用例.xlsx')
# print(get_variables(wb))
# print(get_api_default_params(wb))
# print(get_casesuitename(wb))
# print(read_testcases(wb,'新增客户接口测试集合'))
print(get_all_testcases(wb))
3.接口调用底层方法封装
在common目录下创建client.py,编写如下代码
# !/usr/bin python3
# encoding: utf-8 -*-
# @file : client.py
# @author : 沙陌 Matongxue_2
# @Time : 2022-05-11 10:01
# @Copyright: 北京码同学
import jsonpath
import requests
session = requests.session()
class RequestsClient:
def send(self,url,method,**kwargs):
try:
self.resp = session.request(url=url,method=method,**kwargs)
<p>
except BaseException as e:
raise BaseException(f'接口发起异常:{e}')
return self.resp
# 针对jsonpath的数据提取封装一个方法
# 第一个参数指的是你要匹配的数据的jsonpath表达式
# 第二个指的是你想返回匹配到的第几个,默认是0返回第一个
def extract_resp(self,json_path,index=0):
# 注意有的接口是没有返回信息的,返回信息是空的
text = self.resp.text # 获取返回信息的字符串形式
if text != '':
resp_json = self.resp.json() # 获取响应信息的json格式
# 如果能匹配到值,那么res就是个列表
# 如果匹配不到res就是个False
res = jsonpath.jsonpath(resp_json,json_path)
if res:
if index < 0:
# 如果index小于0 ,我认为你要匹配到的所有结果
return res
else:
return res[index]
else:
print('没有匹配到任何东西')
else:
raise BaseException('接口返回信息为空,无法提取')
if __name__ == '__main__':
client = RequestsClient()
client.send(url= 'http://82.156.74.26:9099/login',
method='post',
data={'username':'18866668888','password':'123456'})
print(client.extract_resp('Admin-Token'))</p>
4.辅助函数封装及参考定义
我们在测试的时候,有些参数是不能写死的,所以这时候我们希望一个参数每次执行都会动态变化,那么就需要封装一些辅助随机函数来帮助我们完成数据的动态变化
在common目录下创建一个util_func.py文件,在里面写下我们需要用到的辅助函数
对于随机数生成,我们可以使用第三方库 faker
# !/usr/bin python3
# encoding: utf-8 -*-
# @file : run.py
# @author : 沙陌 Matongxue_2
# @Time : 2022-05-10 11:24
# @Copyright: 北京码同学
import hashlib
import time
from faker import Faker
fake = Faker(locale='zh_CN')
def rdm_phone_number():
return fake.phone_number()
def cur_timestamp():#到毫秒级的时间戳
return int(time.time() * 1000)
def cur_date():# 2021-12-25
return fake.date_between_dates()
def cur_date_time():# 2021-12-25 10:07:33
return fake.date_time_between_dates()
def rdm_date(pattern='%Y-%m-%d'):
return fake.date(pattern=pattern)
def rdm_date_time():
return fake.date_time()
def rdm_future_date_time(end_date):
return fake.future_datetime(end_date=end_date)
def md5(data):
data = str(data)
return hashlib.md5(data.encode('UTF-8')).hexdigest()
if __name__ == '__main__':
print(rdm_phone_number())
print(rdm_date())
print(rdm_date_time())
print(cur_date())
print(cur_timestamp())
print(cur_date_time())
print(rdm_future_date_time('+60d'))
print(md5('123456'))
当需要在excel中使用动态函数时,调用规则是${{md5(123456)}}然后${{rdm_future_date_time(+60d)}}
5.excel中动态数据的定期替换
免费获取码同学软件测试课程笔记+海量学习资料+完整视频+最新面试题,可以转发文章+私信“码同学666”获取资料6.统一测试方法包
封装一个用于执行框架测试的条目。本条目是一个基于pytest的参数化测试用例,在run.py中实现
在 testcases_util.py 中添加以下方法:
def update_value_to_json(json_object,json_path,new_value):
json_path_expr = parse(json_path)
for match in json_path_expr.find(json_object):
path = match.path # 这是获取到匹配结果的路径
if isinstance(path,Index):
match.context.value[match.path.index] = new_value
elif isinstance(path,Fields):
match.context.value[match.path.fields[0]] = new_value
return json_object
在 testcases_util.py 中修改以下方法
def get_variables(wb):
sheet_data = wb['全局变量']
variables = {} # 用来存储读到的变量,名称是key,值是value
lines_count = sheet_data.max_row # 获取总行数
for l in range(2,lines_count+1):
key = sheet_data.cell(l,1).value
value = sheet_data.cell(l,2).value
variables[key] = value
# 增加一个内置变量,叫时间戳,注意这个时间戳是当前测试一运行就会产生,产生之后在当前测试未完成之前不管调用
# 多少次,都是一致的
variables['timestamp'] = cur_timestamp()
return variables
# !/usr/bin python3
# encoding: utf-8 -*-
# @file : run.py
# @author : 沙陌 Matongxue_2
# @Time : 2022-05-10 11:24
# @Copyright: 北京码同学
import openpyxl
import pytest
from common.client import RequestsClient
from common.testcase_util import get_all_testcases, get_variables, get_api_default_params, regx_sub_data, \
update_value_to_json
wb = openpyxl.load_workbook('testcases/CRM系统接口测试用例.xlsx')
# 获取所有的测试用例数据
test_data = get_all_testcases(wb)
variables = get_variables(wb) # 获取所有的公共变量,也用来存储测试过程中产生的动态变量
api_default_params = get_api_default_params(wb) # 获取所有接口的默认参数数据
@pytest.mark.parametrize('suite_name,case_name,case_info_list',test_data)
def test_run(suite_name,case_name,case_info_list):
# 创建一个接口调用的对象
client = RequestsClient()
# case_info_list 是多个接口的数据,是一个列表
for case_info in case_info_list:
# case_info 其实也是一个列表,表示excel某一行的测试数据,从接口名称开始往后
# ['登录', '${host}/login', 'post', '', '', '{\n"token":"$.Admin-Token"\n}', 200, '[\n{\n"actual":"$.code",\n"expect":0\n}\n]']
kwargs = {'verify':False} #verify表示忽略https的证书
api_name = case_info[0] # 接口名称
url = case_info[1] # 接口名称
url = regx_sub_data(url,variables) # 处理url中的动态变量及动态函数调用
method = case_info[2] # 接口请求方式
headers = case_info[3] # 接口头信息
if headers!='':
headers = regx_sub_data(headers,variables)
headers = eval(headers) # 将json格式的字符串转换成字典
kwargs['headers'] = headers
# 测试数据并不是接口发起时真正的全部参数,需要根据用户填入的要测试的数据和该接口对应的默认数据进行替换以及组合来达到
# 请求数据
api_default_param = api_default_params[api_name] # 获取当前行的接口对应的默认数据
if api_default_param != '':
api_default_param = regx_sub_data(api_default_param,variables)
api_default_param = eval(api_default_param)
test_params = case_info[4] # 测试数据
if test_params != '':
test_params = regx_sub_data(test_params,variables)
test_params = eval(test_params)
# 解析测试数据,通过jsonpath去替换默认参数中的数据
# 逻辑是遍历测试数据,判断测试数据中是哪种参数类型(data/params/json/files),根据参数类型去替换默认数据的对应的部分
if 'json' in test_params:
"""
{
"$.entity.name":"联系人${{cur_timestamp()}}",
}
"""
for json_path,new_value in test_params['json'].items():
api_default_param['json'] = update_value_to_json(api_default_param['json'],json_path,new_value)
if 'data' in test_params:
for json_path,new_value in test_params['data'].items():
api_default_param['data'] = update_value_to_json(api_default_param['data'],json_path,new_value)
if 'params' in test_params:
for json_path,new_value in test_params['params'].items():
api_default_param['params'] = update_value_to_json(api_default_param['params'],json_path,new_value)
if 'files' in test_params:
for json_path,new_value in test_params['files'].items():
api_default_param['files'] = update_value_to_json(api_default_param['files'],json_path,new_value)
test_params = api_default_param
# 整合完成测试数据和默认数据之后,将他们分别存储kwargs中
if 'json' in test_params:
kwargs['json'] = test_params['json']
if 'data' in test_params:
kwargs['data'] = test_params['data']
if 'params' in test_params:
kwargs['params'] = test_params['params']
if 'files' in test_params:
kwargs['files'] = test_params['files']
resp = client.send(url=url,method=method,**kwargs) # 发起请求
expect_status = case_info[6] # 期望的响应状态码
assert resp.status_code == expect_status
<p>
# print(resp.text)
extract_resp = case_info[5] # 响应提取
if extract_resp != '':
extract_resp = eval(extract_resp)
"""
{
"token":"$.Admin-Token"
}
"""
for key,value in extract_resp.items():
# key就是提取后要保存的变量名称
# value是你要提取的目标字段对应的jsonpath表达式
res = client.extract_resp(value)
variables[key] = res
expect_resp = case_info[7] # 期望的响应信息
if expect_resp != '':
expect_resp = regx_sub_data(expect_resp,variables)
expect_resp = eval(expect_resp)
"""
[
{
"actual":"$.code",
"expect":500,
},
{
"actual":"$.msg",
"expect":"产品编号已存在,请校对后再添加!",
}
]
"""
for expect_info in expect_resp:
json_path = expect_info['actual']
actual_res = client.extract_resp(json_path)
expect_res = expect_info['expect']
pytest.assume(actual_res==expect_res,f'期望是{expect_res},实际是{actual_res}')
if __name__ == '__main__':
pytest.main() # 该方法会自动扫描当前项目中的pytest.ini,根据其中的配置进行执行</p>
7.集成日志采集
日志采集的目的是在我们的用例失败时帮助我们追踪问题的原因。日志采集哪些信息?
主要采集接口发起和接口响应的各种信息。我在哪里可以通过集成日志采集这些信息?
8.魅力测试报告整合
需要用到python第三方库allure-pytest,所以先安装
在 pytest.ini 中附加命令参数以采集诱惑结果数据
addopts = -sv --alluredir ./report/data --clean-alluredir
--alluredir ./report/data : 表示采集到的测试结果存放在report/data目录下
--clean-alluredir :表示每次执行采集结果前清除之前的结果
需要使用allure的命令行工具,命令行工具的下载地址:
/allure-framework/allure2/releases
如果无法访问,则下载我提供的 allure-2.11.0.zip
下载后解压。解压后配置环境变量路径,配置如下路径
配置完成后,在命令行输入 allure --version 可以看到版本号,表示配置完成
记得重启pycharm,在pycharm的终端输入如下命令:
allure generate ./report/data -o ./report/html
报告打开:
每次在命令行输入命令很麻烦。您可以直接将生成的命令集成到代码中。修改run.py中main中的代码如下:
if __name__ == '__main__': pytest.main() # 该方法会自动扫描当前项目中的pytest.ini,根据其中的配置进行执行
os.system('allure generate ./report/data -o ./report/html --clean')
增加测试用例的层次划分
修改run.py中的代码如下:
# !/usr/bin python3 # encoding: utf-8 -*-
# @file : run.py
# @author : 沙陌 Matongxue_2
# @Time : 2022-05-10 11:24
# @Copyright: 北京码同学
import os
import allure
import openpyxl
import pytest
from common.client import RequestsClient
from common.testcase_util import get_all_testcases, get_variables, get_api_default_params, regx_sub_data, \
update_value_to_json
wb = openpyxl.load_workbook('testcases/CRM系统接口测试用例.xlsx')
# 获取所有的测试用例数据
test_data = get_all_testcases(wb)
variables = get_variables(wb) # 获取所有的公共变量,也用来存储测试过程中产生的动态变量
api_default_params = get_api_default_params(wb) # 获取所有接口的默认参数数据
@pytest.mark.parametrize('suite_name,case_name,case_info_list',test_data)
def test_run(suite_name,case_name,case_info_list):
# 创建一个接口调用的对象
client = RequestsClient()
allure.dynamic.feature(suite_name) # 测试报告上会高于测试用例的层级展示
allure.dynamic.title(case_name) # 测试报告上表示测试用例的名称
# case_info_list 是多个接口的数据,是一个列表
for case_info in case_info_list:
# case_info 其实也是一个列表,表示excel某一行的测试数据,从接口名称开始往后
# ['登录', '${host}/login', 'post', '', '', '{\n"token":"$.Admin-Token"\n}', 200, '[\n{\n"actual":"$.code",\n"expect":0\n}\n]']
kwargs = {'verify':False} #verify表示忽略https的证书
api_name = case_info[0] # 接口名称
url = case_info[1] # 接口名称
url = regx_sub_data(url,variables) # 处理url中的动态变量及动态函数调用
method = case_info[2] # 接口请求方式
headers = case_info[3] # 接口头信息
if headers!='':
headers = regx_sub_data(headers,variables)
headers = eval(headers) # 将json格式的字符串转换成字典
kwargs['headers'] = headers
# 测试数据并不是接口发起时真正的全部参数,需要根据用户填入的要测试的数据和该接口对应的默认数据进行替换以及组合来达到
# 请求数据
api_default_param = api_default_params[api_name] # 获取当前行的接口对应的默认数据
if api_default_param != '':
api_default_param = regx_sub_data(api_default_param,variables)
api_default_param = eval(api_default_param)
test_params = case_info[4] # 测试数据
if test_params != '':
test_params = regx_sub_data(test_params,variables)
test_params = eval(test_params)
# 解析测试数据,通过jsonpath去替换默认参数中的数据
# 逻辑是遍历测试数据,判断测试数据中是哪种参数类型(data/params/json/files),根据参数类型去替换默认数据的对应的部分
if 'json' in test_params:
"""
{
"$.entity.name":"联系人${{cur_timestamp()}}",
}
"""
for json_path,new_value in test_params['json'].items():
api_default_param['json'] = update_value_to_json(api_default_param['json'],json_path,new_value)
if 'data' in test_params:
for json_path,new_value in test_params['data'].items():
api_default_param['data'] = update_value_to_json(api_default_param['data'],json_path,new_value)
if 'params' in test_params:
for json_path,new_value in test_params['params'].items():
api_default_param['params'] = update_value_to_json(api_default_param['params'],json_path,new_value)
if 'files' in test_params:
for json_path,new_value in test_params['files'].items():
api_default_param['files'] = update_value_to_json(api_default_param['files'],json_path,new_value)
test_params = api_default_param
# 整合完成测试数据和默认数据之后,将他们分别存储kwargs中
if 'json' in test_params:
kwargs['json'] = test_params['json']
if 'data' in test_params:
kwargs['data'] = test_params['data']
if 'params' in test_params:
kwargs['params'] = test_params['params']
if 'files' in test_params:
kwargs['files'] = test_params['files']
resp = client.send(url=url,method=method,**kwargs) # 发起请求
expect_status = case_info[6] # 期望的响应状态码
assert resp.status_code == expect_status
# print(resp.text)
extract_resp = case_info[5] # 响应提取
if extract_resp != '':
extract_resp = eval(extract_resp)
"""
{
"token":"$.Admin-Token"
}
"""
for key,value in extract_resp.items():
# key就是提取后要保存的变量名称
# value是你要提取的目标字段对应的jsonpath表达式
res = client.extract_resp(value)
variables[key] = res
expect_resp = case_info[7] # 期望的响应信息
if expect_resp != '':
expect_resp = regx_sub_data(expect_resp,variables)
expect_resp = eval(expect_resp)
"""
[
{
"actual":"$.code",
"expect":500,
},
{
"actual":"$.msg",
"expect":"产品编号已存在,请校对后再添加!",
}
]
"""
for expect_info in expect_resp:
json_path = expect_info['actual']
actual_res = client.extract_resp(json_path)
expect_res = expect_info['expect']
pytest.assume(actual_res==expect_res,f'期望是{expect_res},实际是{actual_res}')
if __name__ == '__main__':
pytest.main() # 该方法会自动扫描当前项目中的pytest.ini,根据其中的配置进行执行
os.system('allure generate ./report/data -o ./report/html --clean')