Commit 4b99f64a authored by Bozhong钟波's avatar Bozhong钟波

Initial commit

parents
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="form-group" />
<item index="1" class="java.lang.String" itemvalue="text" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="109">
<item index="0" class="java.lang.String" itemvalue="tzlocal" />
<item index="1" class="java.lang.String" itemvalue="HttpRunner" />
<item index="2" class="java.lang.String" itemvalue="PyYAML" />
<item index="3" class="java.lang.String" itemvalue="defusedxml" />
<item index="4" class="java.lang.String" itemvalue="py" />
<item index="5" class="java.lang.String" itemvalue="pycparser" />
<item index="6" class="java.lang.String" itemvalue="django-admin-hstore-widget" />
<item index="7" class="java.lang.String" itemvalue="pyasn1-modules" />
<item index="8" class="java.lang.String" itemvalue="anyjson" />
<item index="9" class="java.lang.String" itemvalue="DjangoUeditor" />
<item index="10" class="java.lang.String" itemvalue="xlrd" />
<item index="11" class="java.lang.String" itemvalue="django-formtools" />
<item index="12" class="java.lang.String" itemvalue="pytest-metadata" />
<item index="13" class="java.lang.String" itemvalue="asgiref" />
<item index="14" class="java.lang.String" itemvalue="attrs" />
<item index="15" class="java.lang.String" itemvalue="simplejson" />
<item index="16" class="java.lang.String" itemvalue="allure-python-commons" />
<item index="17" class="java.lang.String" itemvalue="PyMySQL" />
<item index="18" class="java.lang.String" itemvalue="idna" />
<item index="19" class="java.lang.String" itemvalue="django-admin-bootstrapped" />
<item index="20" class="java.lang.String" itemvalue="decorator" />
<item index="21" class="java.lang.String" itemvalue="har2case" />
<item index="22" class="java.lang.String" itemvalue="pluggy" />
<item index="23" class="java.lang.String" itemvalue="cffi" />
<item index="24" class="java.lang.String" itemvalue="numpy" />
<item index="25" class="java.lang.String" itemvalue="pyasn1" />
<item index="26" class="java.lang.String" itemvalue="requests" />
<item index="27" class="java.lang.String" itemvalue="jdcal" />
<item index="28" class="java.lang.String" itemvalue="XlsxWriter" />
<item index="29" class="java.lang.String" itemvalue="celery" />
<item index="30" class="java.lang.String" itemvalue="selenium" />
<item index="31" class="java.lang.String" itemvalue="pyOpenSSL" />
<item index="32" class="java.lang.String" itemvalue="pytest-mock" />
<item index="33" class="java.lang.String" itemvalue="zipp" />
<item index="34" class="java.lang.String" itemvalue="jsonpath" />
<item index="35" class="java.lang.String" itemvalue="djangorestframework" />
<item index="36" class="java.lang.String" itemvalue="django-cors-headers" />
<item index="37" class="java.lang.String" itemvalue="tornado" />
<item index="38" class="java.lang.String" itemvalue="amqp" />
<item index="39" class="java.lang.String" itemvalue="et-xmlfile" />
<item index="40" class="java.lang.String" itemvalue="incremental" />
<item index="41" class="java.lang.String" itemvalue="pathlib2" />
<item index="42" class="java.lang.String" itemvalue="toml" />
<item index="43" class="java.lang.String" itemvalue="pandas" />
<item index="44" class="java.lang.String" itemvalue="autobahn" />
<item index="45" class="java.lang.String" itemvalue="Django" />
<item index="46" class="java.lang.String" itemvalue="future" />
<item index="47" class="java.lang.String" itemvalue="pytz" />
<item index="48" class="java.lang.String" itemvalue="requests-toolbelt" />
<item index="49" class="java.lang.String" itemvalue="Twisted" />
<item index="50" class="java.lang.String" itemvalue="mysqlclient" />
<item index="51" class="java.lang.String" itemvalue="pytest-rerunfailures" />
<item index="52" class="java.lang.String" itemvalue="Automat" />
<item index="53" class="java.lang.String" itemvalue="colorlog" />
<item index="54" class="java.lang.String" itemvalue="atomicwrites" />
<item index="55" class="java.lang.String" itemvalue="python-dateutil" />
<item index="56" class="java.lang.String" itemvalue="vue" />
<item index="57" class="java.lang.String" itemvalue="kombu" />
<item index="58" class="java.lang.String" itemvalue="MarkupSafe" />
<item index="59" class="java.lang.String" itemvalue="twisted-iocpsupport" />
<item index="60" class="java.lang.String" itemvalue="constantly" />
<item index="61" class="java.lang.String" itemvalue="django-extensions" />
<item index="62" class="java.lang.String" itemvalue="Logbook" />
<item index="63" class="java.lang.String" itemvalue="Faker" />
<item index="64" class="java.lang.String" itemvalue="certifi" />
<item index="65" class="java.lang.String" itemvalue="daphne" />
<item index="66" class="java.lang.String" itemvalue="pyparsing" />
<item index="67" class="java.lang.String" itemvalue="beautifulsoup4" />
<item index="68" class="java.lang.String" itemvalue="hyperlink" />
<item index="69" class="java.lang.String" itemvalue="service-identity" />
<item index="70" class="java.lang.String" itemvalue="django-crispy-forms" />
<item index="71" class="java.lang.String" itemvalue="iniconfig" />
<item index="72" class="java.lang.String" itemvalue="tablib" />
<item index="73" class="java.lang.String" itemvalue="django-import-export" />
<item index="74" class="java.lang.String" itemvalue="cryptography" />
<item index="75" class="java.lang.String" itemvalue="zope.interface" />
<item index="76" class="java.lang.String" itemvalue="pytest-assume" />
<item index="77" class="java.lang.String" itemvalue="APScheduler" />
<item index="78" class="java.lang.String" itemvalue="django-reversion" />
<item index="79" class="java.lang.String" itemvalue="odfpy" />
<item index="80" class="java.lang.String" itemvalue="channels" />
<item index="81" class="java.lang.String" itemvalue="configparser" />
<item index="82" class="java.lang.String" itemvalue="pyxmpp2" />
<item index="83" class="java.lang.String" itemvalue="retrying" />
<item index="84" class="java.lang.String" itemvalue="pytest-html" />
<item index="85" class="java.lang.String" itemvalue="diff-match-patch" />
<item index="86" class="java.lang.String" itemvalue="SQLAlchemy" />
<item index="87" class="java.lang.String" itemvalue="importlib-metadata" />
<item index="88" class="java.lang.String" itemvalue="Jinja2" />
<item index="89" class="java.lang.String" itemvalue="sqlparse" />
<item index="90" class="java.lang.String" itemvalue="txaio" />
<item index="91" class="java.lang.String" itemvalue="urllib3" />
<item index="92" class="java.lang.String" itemvalue="django-celery" />
<item index="93" class="java.lang.String" itemvalue="billiard" />
<item index="94" class="java.lang.String" itemvalue="dwebsocket" />
<item index="95" class="java.lang.String" itemvalue="six" />
<item index="96" class="java.lang.String" itemvalue="pytest" />
<item index="97" class="java.lang.String" itemvalue="text-unidecode" />
<item index="98" class="java.lang.String" itemvalue="xlwt" />
<item index="99" class="java.lang.String" itemvalue="packaging" />
<item index="100" class="java.lang.String" itemvalue="allure-pytest" />
<item index="101" class="java.lang.String" itemvalue="MarkupPy" />
<item index="102" class="java.lang.String" itemvalue="chromedriver" />
<item index="103" class="java.lang.String" itemvalue="kafka-python" />
<item index="104" class="java.lang.String" itemvalue="chardet" />
<item index="105" class="java.lang.String" itemvalue="ddt" />
<item index="106" class="java.lang.String" itemvalue="colorama" />
<item index="107" class="java.lang.String" itemvalue="nacos-sdk-python" />
<item index="108" class="java.lang.String" itemvalue="openpyxl" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N802" />
<option value="N812" />
<option value="N813" />
</list>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (Interface)" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Interface.iml" filepath="$PROJECT_DIR$/.idea/Interface.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
from configparser import ConfigParser
from Common.handle_path import conf_dir
class HandleConfig(ConfigParser):
def __init__(self, file_path):
super().__init__()
# 加载配置文件
self.read(file_path, encoding="utf-8")
# 往配置文件中写入数据
def write_data(self, section, option, value):
self.set(section, option, value)
fp = open(file_path, "w+", encoding="utf-8")
self.write(fp)
fp.close()
file_path = conf_dir + "\\config.ini"
conf = HandleConfig(file_path)
if __name__ == '__main__':
name = conf.get("userInfo", "mobile_phone")
print(name)
# conf.write_data("18178945612")
"""
进行数据替换,实现数据动态化
"""
import re
import json
from Common.handle_envdata import EnvData
# 将字典类型转化成字符串,进行替换,将字符串转换成字典
def replace_case_by_regular(case):
# 将字典转换成字符串,false是能正确获取中文
data_str = json.dumps(case, ensure_ascii=False)
# 调用替换函数
data_new = replace_by_regular(data_str)
# 将字符串转换成字典
data_dic = json.loads(data_new)
return data_dic
# 通过正则表达式替换
def replace_by_regular(data):
# 通过正则表达式来获取需求替换的数据
res = re.findall("#(.*?)#", data)
# 如何没有获取到数据就不进行替换操作
if res:
# 先通过set去重,结果为集合,如何利用list转换成列表
res_new = list(set(res))
for item in res_new:
try:
# 获取需要替换的数据,数据都在envdata类中,存储全局变量
value = getattr(EnvData, item)
data = data.replace("#{}#".format(item), str(value))
except AttributeError:
continue
return data
# 通过占位符替换
def replace_mark_with_data(case, mark, real_data):
for key, value in case.items():
# 判断value不为空并且是一个字符串
if value is not None and isinstance(value, str):
if value.find(mark) != -1:
case[key] = value.replace(mark, real_data)
return case
if __name__ == '__main__':
case = {'id': 2, 'title': '充值成功,充值200.22', 'url': '/member/recharge', 'method': 'post',
'request_data': '{\n "member_id": "#member_id#",\n "amount": 200.22\n}', 'code': 0,
'expected': '{\n "code": 0,\n "msg": "OK",\n "data": {\n "id": #member_id#,\n "leave_amount": #leave_amount#\n }\n}',
'check_sql': 'select CAST(leave_amount AS CHAR) AS leave_amount FROM member WHERE id = "#member_id#";'}
data_str = json.dumps(case, ensure_ascii=False)
print(data_str)
res = re.findall("#(.*?)#", data_str)
print(res)
# if case["request_data"].find("#new_phone#"):
# case = replace_mark_with_data(case, "#new_phone#", "12345678901")
# for key, value in case.items():
# print(key, value)
import pymysql
from Common.handle_config import conf
"""
1、连接数据库,创建游标
"""
class HandleDB:
def __init__(self):
self.conn = pymysql.connect(
host=conf.get("mysql", "host"),
user=conf.get("mysql", "user"),
password=conf.get("mysql", "password"),
port=conf.getint("mysql", "port"),
charset="utf8",
cursorclass=pymysql.cursors.DictCursor
)
# 第二步 创建游标
self.cur = self.conn.cursor()
def select_one_data(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
self.cur.execute(sql)
# 获取数据
return self.cur.fetchone()
def select_all_data(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
self.cur.execute(sql)
# 获取数据
return self.cur.fetchall()
def select_count(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
return self.cur.execute(sql)
def update(self):
# 执行增、删、改操作
self.cur.execute(sql)
self.conn.commit()
def close(self):
self.cur.close()
self.conn.close()
if __name__ == '__main__':
sql = "SELECT * FROM member LIMIT 5"
# data = HandleDB().get_one_data(sql)
db = HandleDB()
data = db.select_count(sql)
db.close()
print(data)
"""
用来存储全局变量
"""
class EnvData:
# 未注册的手机号
# un_mobile_phone = 0
# mobile_phone = 0
# pwd = "0"
# member_id = 47576
# token = "eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjQ3NTc2LCJleHAiOjE2ODIwOTY0Mjh9.HQQHaWYxEXz_fDncx9UEXT18-u9_y7Qs1P1XHnx4dNSsqUFPlMbr97NyZXdYvMqJ-WbfJ2OLj94OFt1aQk8k7A"
# leave_amount = "600"
pass
import openpyxl
"""
excel类,需要实现什么内容?
1、读取文档中的数据,并处理成想要的格式
2、读取标题
3、读取数据
"""
class HandleExcel:
def __init__(self, file_path, file_name):
# 第一步 打开工作簿(workbook)
self.wb = openpyxl.load_workbook(file_path)
# 第二部 选择表单(sheet)
self.sh = self.wb[file_name]
def __read_titles(self):
# 获取用例的标题
title_list = []
for cel in list(self.sh.rows)[0]:
title_list.append(cel.value)
return title_list
def read_all_datas(self):
all_datas = []
for item in list(self.sh.rows)[1:]:
value_list = []
for cel in item:
value_list.append(cel.value)
# 将title和每一行数据打包成字典
value_dict = dict(zip(self.__read_titles(), value_list))
all_datas.append(value_dict)
return all_datas
def close_file(self):
# 操作文档结束后需要进行关闭操作
self.wb.close()
if __name__ == '__main__':
file_path = '../TestDatas/api_cases.xlsx'
file_name = '注册'
exc = HandleExcel(file_path, file_name)
cases = exc.read_all_datas()
print(cases)
exc.close_file()
import jsonpath
import json
from Common.handle_envdata import EnvData
from Common.my_logger import logger
def extract_data_from_response(extract_exprs, response_dict):
"""
根据jsonpath提取表达式,从响应结果当中,提取数据并设置为环境变量EnvData类的类属性,作为全局变量使用。
:param extract_exprs: 从excel当中读取出来的,提取表达式的字符串。
:param response_dict: http请求之后的响应结果。
:return:Nonoe
"""
# 将提取表达式转换成字典
extract_dict = eval(extract_exprs)
logger.info("要从响应结果当中提取的数据集为:\n{}".format(extract_dict))
# 遍历字典,key作为全局变量名,value是jsonpath提取表达式。
for key, value in extract_dict.items():
# 提取
res = str(jsonpath.jsonpath(response_dict, value)[0])
# 设置环境变量
logger.info("设置环境变量 {}:{}".format(key, res))
setattr(EnvData, key, res)
if __name__ == '__main__':
ss = '{"token":"$..token"}'
response = {
"code": 200,
"msg": "登录成功",
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vZ2FsYXh5X3VzZXJfbWljcm9zOjkzMDQvYWRtaW5pc3RyYXRvci9hdXRoL2xvZ2luIiwiaWF0IjoxNjkzOTgwNzU0LCJleHAiOjE2OTQ1ODU1NTQsIm5iZiI6MTY5Mzk4MDc1NCwianRpIjoiZEJWOWtab2V2M0tZZ2FydyIsInN1YiI6MSwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.t1LxoPX3Ec8xUZ5mNmLurI0UJ1tUeL9SQHI50gJh2PU",
"expires_in": 604800,
"user": {
"id": 1,
"company": "SZ",
"account": "admin0001",
"name": "技术测试账号1",
"email": "",
"next_online_datetime": None,
"leave_time": None,
"online_status": 2,
"is_leader": 0,
"leader_path": "1533,",
"leader_id": 1533,
"english_name": "admin0001",
"status": 1,
"avatar": "https://upload.cdn.galaxy-immi.com/crm/test/images/1681438465044.png",
"created_at": "2021-02-24 06:43:53",
"updated_at": "2023-09-06 14:09:28",
"wework_key": "13627097804",
"login_at": "2023-09-06 14:09:28",
"wework_name": "Richard余志钊",
"mobile": "13699999999",
"mobile2": "",
"scrm_id": "63",
"scrm_wx_id": "f34bb86f8b9b4f96a9d61c38525a89c8",
"is_new_employee": 1,
"head_image": "",
"wx_image": "",
"is_new_owner": 0,
"is_new_charge": 1,
"is_new_charge_business": 1,
"is_new_owner_business": 1,
"wx_qrcode": "https://upload.cdn.galaxy-immi.com/crm/test/images/1688459127787.png",
"green_wx_qrcode": "https://upload.cdn.galaxy-immi.com/crm/test/images/1688459095787.png",
"wechat_wise_openid": "",
"wechat_wise_unionid": "",
"update_password_at": "2023-07-07 17:41:15",
"try_times": 0,
"login_fail_times": 0,
"login_fail_times_limit": 100,
"department_id": 141,
"department_name": "测试部",
"jump": "/Information/ClientCenter",
"handle": 0,
"rolesname": "超级管理员",
"status_cn": "使用中"
}
}
}
extract_data_from_response(ss, response)
print(EnvData.__dict__)
import os
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 测试用例路径
cases_dir = os.path.join(base_dir, "TestCases")
# 测试数据路径
datas_dir = os.path.join(base_dir, "TestDatas")
# 测试报告路径
reports_dir = os.path.join(base_dir, "Outputs\\Reports")
# 测试日志路径
logs_dir = os.path.join(base_dir, "Outputs\\Logs")
# 配置文件路径
conf_dir = os.path.join(base_dir, "Conf")
"""
1、随机生成11位手机号 前3位+8位
2、进行数据校验
"""
import random
from Common.handle_db import HandleDB
db = HandleDB()
# 获取一个没有注册的手机号码
def get_new_phone():
# 1、获取手机号码
mobile_phone = __generator_phone()
# 2、对手机号码进行校验
while True:
data = check_phone_in_db(mobile_phone)
if data == 0:
return mobile_phone
else:
print("该手机号码已经注册了!")
# 随机生产一个手机号码
def __generator_phone():
prefix = [133, 153, 177, 180, 181, 189, 130, 131, 132, 145, 155, 156, 176, 185, 186,
134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188
]
eight = ''
for i in range(0, 8):
eight = eight + str(random.randint(0, 9))
mobile_phone = int(str(random.choice(prefix)) + str(eight))
return mobile_phone
# 通过随机生产的号码去数据库进行查询
def check_phone_in_db(mobile_phone):
sql = 'SELECT * FROM FlowMicros.micros_customer WHERE phone = "{}";'.format(mobile_phone)
data = db.select_count(sql)
return data
# print(get_new_phone())
"""
1、鉴权
2、根据项目情况来进行封装
"""
import requests
import json
from Common.my_logger import logger
from Common.handle_config import conf
def send_request(method, url, data=None, token=None):
# 请求头信息
headers = __handle_headers(token)
# url处理,拼接获取完整的url
url = __pre_url(url)
# data处理,把字符转化为字典
data = __pre_data(data)
logger.info("请求头为:{}".format(headers))
logger.info("请求方法为:{}".format(method))
logger.info("请求url为:{}".format(url))
logger.info("请求数据为:{}".format(data))
if method.upper() == "GET":
resp = requests.get(url, data, headers=headers)
elif method.upper() == "POST":
resp = requests.post(url, json=data, headers=headers)
elif method.upper() == "PUT":
resp = requests.put(url, json=data, headers=headers)
else:
print("请求方式存在问题,请检查!")
logger.info("响应状态码为:{}".format(resp.status_code))
logger.info("响应数据为:{}".format(resp.json()))
return resp
def __handle_headers(token=None):
headers = {'App': 'galaxy-admin', 'Content-Type': 'application/json'}
if token:
headers['token'] = '{}'.format(token)
return headers
def __pre_url(url):
if url.startswith("/"):
url = conf.get("server", "base_url") + url
else:
url = conf.get("server", "base_url") + "/" + url
return url
def __pre_data(data):
# 如果data不为空并且为字符类型时,转化为字典,或者不处理
if data is not None and isinstance(data, str):
return json.loads(data)
return data
if __name__ == '__main__':
# login_url = "http://api.lemonban.com/futureloan/member/login"
# login_data = {"mobile_phone": "18112345686", "pwd": "12345678"}
# resp = send_request("post", login_url, login_data)
# print(resp.json())
# resp_dict = resp.json()
# token = resp_dict['data']['token_info']['token']
# member_id = resp_dict['data']['id']
# recharge_url = "http://api.lemonban.com/futureloan/member/recharge"
# recharge_data = {"member_id": member_id, "amount": 200}
# resp = send_request("post", recharge_url, recharge_data, token)
# print(resp.json())
login_url = "http://api.lemonban.com/futureloan/member/register"
login_data = {"mobile_phone": "18112345679", "pwd": "12345678"}
resp = send_request("post", login_url, login_data)
print(resp.json())
print(resp.json()['code'])
print(type(login_data))
import logging
from Common.handle_config import conf
from Common.handle_path import logs_dir
class MyLogger(logging.Logger):
def __init__(self, file_name=None):
# 设置日志级别,日志渠道,日志格式
super().__init__(conf.get("log", "name"), conf.get("log", "level"))
# 日志格式
fmt = '%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d line:%(message)s'
formatter = logging.Formatter(fmt)
# 日志渠道1
handle = logging.StreamHandler()
handle.setFormatter(formatter)
self.addHandler(handle)
# 日志渠道2
if file_name:
handle1 = logging.FileHandler(logs_dir + "\\" + file_name, encoding="utf-8")
handle1.setFormatter(formatter)
self.addHandler(handle1)
# 是否写入日志文件中
if conf.getboolean("log", "file_ok"):
file_name = conf.get("log", "file_name")
else:
file_name = None
logger = MyLogger(file_name=file_name)
if __name__ == '__main__':
logger.info("789")
# -*- coding: utf-8 -*-
# This file is a part of DDT (https://github.com/txels/ddt)
# Copyright 2012-2015 Carles Barrobés and DDT contributors
# For the exact contribution history, see the git revision log.
# DDT is licensed under the MIT License, included in
# https://github.com/txels/ddt/blob/master/LICENSE.md
import inspect
import json
import os
import re
import codecs
from functools import wraps
try:
import yaml
except ImportError: # pragma: no cover
_have_yaml = False
else:
_have_yaml = True
__version__ = '1.2.1'
# These attributes will not conflict with any real python attribute
# They are added to the decorated test method and processed later
# by the `ddt` class decorator.
DATA_ATTR = '%values' # store the data the test must run with
FILE_ATTR = '%file_path' # store the path to JSON file
UNPACK_ATTR = '%unpack' # remember that we have to unpack values
index_len = 5 # default max length of case index
try:
trivial_types = (type(None), bool, int, float, basestring)
except NameError:
trivial_types = (type(None), bool, int, float, str)
def is_trivial(value):
if isinstance(value, trivial_types):
return True
elif isinstance(value, (list, tuple)):
return all(map(is_trivial, value))
return False
def unpack(func):
"""
Method decorator to add unpack feature.
"""
setattr(func, UNPACK_ATTR, True)
return func
def data(*values):
"""
Method decorator to add to your test methods.
Should be added to methods of instances of ``unittest.TestCase``.
"""
global index_len
index_len = len(str(len(values)))
return idata(values)
def idata(iterable):
"""
Method decorator to add to your test methods.
Should be added to methods of instances of ``unittest.TestCase``.
"""
def wrapper(func):
setattr(func, DATA_ATTR, iterable)
return func
return wrapper
def file_data(value):
"""
Method decorator to add to your test methods.
Should be added to methods of instances of ``unittest.TestCase``.
``value`` should be a path relative to the directory of the file
containing the decorated ``unittest.TestCase``. The file
should contain JSON encoded data, that can either be a list or a
dict.
In case of a list, each value in the list will correspond to one
test case, and the value will be concatenated to the test method
name.
In case of a dict, keys will be used as suffixes to the name of the
test case, and values will be fed as test data.
"""
def wrapper(func):
setattr(func, FILE_ATTR, value)
return func
return wrapper
def mk_test_name(name, value, index=0):
"""
Generate a new name for a test case.
It will take the original test name and append an ordinal index and a
string representation of the value, and convert the result into a valid
python identifier by replacing extraneous characters with ``_``.
We avoid doing str(value) if dealing with non-trivial values.
The problem is possible different names with different runs, e.g.
different order of dictionary keys (see PYTHONHASHSEED) or dealing
with mock objects.
Trivial scalar values are passed as is.
A "trivial" value is a plain scalar, or a tuple or list consisting
only of trivial values.
"""
# Add zeros before index to keep order
index = "{0:0{1}}".format(index + 1, index_len)
if not is_trivial(value):
return "{0}_{1}".format(name, index)
try:
value = str(value)
except UnicodeEncodeError:
# fallback for python2
value = value.encode('ascii', 'backslashreplace')
test_name = "{0}_{1}_{2}".format(name, index, value)
return re.sub(r'\W|^(?=\d)', '_', test_name)
def feed_data(func, new_name, test_data_docstring, *args, **kwargs):
"""
This internal method decorator feeds the test data item to the test.
"""
@wraps(func)
def wrapper(self):
return func(self, *args, **kwargs)
wrapper.__name__ = new_name
wrapper.__wrapped__ = func
# set docstring if exists
if test_data_docstring is not None:
wrapper.__doc__ = test_data_docstring
else:
# Try to call format on the docstring
if func.__doc__:
try:
wrapper.__doc__ = func.__doc__.format(*args, **kwargs)
except (IndexError, KeyError):
# Maybe the user has added some of the formating strings
# unintentionally in the docstring. Do not raise an exception
# as it could be that user is not aware of the
# formating feature.
pass
return wrapper
def add_test(cls, test_name, test_docstring, func, *args, **kwargs):
"""
Add a test case to this class.
The test will be based on an existing function but will give it a new
name.
"""
setattr(cls, test_name, feed_data(func, test_name, test_docstring,
*args, **kwargs))
def process_file_data(cls, name, func, file_attr):
"""
Process the parameter in the `file_data` decorator.
"""
cls_path = os.path.abspath(inspect.getsourcefile(cls))
data_file_path = os.path.join(os.path.dirname(cls_path), file_attr)
def create_error_func(message): # pylint: disable-msg=W0613
def func(*args):
raise ValueError(message % file_attr)
return func
# If file does not exist, provide an error function instead
if not os.path.exists(data_file_path):
test_name = mk_test_name(name, "error")
test_docstring = """Error!"""
add_test(cls, test_name, test_docstring,
create_error_func("%s does not exist"), None)
return
_is_yaml_file = data_file_path.endswith((".yml", ".yaml"))
# Don't have YAML but want to use YAML file.
if _is_yaml_file and not _have_yaml:
test_name = mk_test_name(name, "error")
test_docstring = """Error!"""
add_test(
cls,
test_name,
test_docstring,
create_error_func("%s is a YAML file, please install PyYAML"),
None
)
return
with codecs.open(data_file_path, 'r', 'utf-8') as f:
# Load the data from YAML or JSON
if _is_yaml_file:
data = yaml.safe_load(f)
else:
data = json.load(f)
_add_tests_from_data(cls, name, func, data)
def _add_tests_from_data(cls, name, func, data):
"""
Add tests from data loaded from the data file into the class
"""
for i, elem in enumerate(data):
if isinstance(data, dict):
key, value = elem, data[elem]
test_name = mk_test_name(name, key, i)
elif isinstance(data, list):
value = elem
test_name = mk_test_name(name, value, i)
if isinstance(value, dict):
add_test(cls, test_name, test_name, func, **value)
else:
add_test(cls, test_name, test_name, func, value)
def _is_primitive(obj):
"""Finds out if the obj is a "primitive". It is somewhat hacky but it works.
"""
return not hasattr(obj, '__dict__')
def _get_test_data_docstring(func, value):
"""Returns a docstring based on the following resolution strategy:
1. Passed value is not a "primitive" and has a docstring, then use it.
2. In all other cases return None, i.e the test name is used.
"""
if not _is_primitive(value) and value.__doc__:
return value.__doc__
else:
return None
def ddt(cls):
"""
Class decorator for subclasses of ``unittest.TestCase``.
Apply this decorator to the test case class, and then
decorate test methods with ``@data``.
For each method decorated with ``@data``, this will effectively create as
many methods as data items are passed as parameters to ``@data``.
The names of the test methods follow the pattern
``original_test_name_{ordinal}_{data}``. ``ordinal`` is the position of the
data argument, starting with 1.
For data we use a string representation of the data value converted into a
valid python identifier. If ``data.__name__`` exists, we use that instead.
For each method decorated with ``@file_data('test_data.json')``, the
decorator will try to load the test_data.json file located relative
to the python file containing the method that is decorated. It will,
for each ``test_name`` key create as many methods in the list of values
from the ``data`` key.
"""
for name, func in list(cls.__dict__.items()):
if hasattr(func, DATA_ATTR):
for i, v in enumerate(getattr(func, DATA_ATTR)):
test_name = mk_test_name(name, getattr(v, "__name__", v), i)
# 将用例的描述信息,改为用例数据的title字段
test_data_docstring = v["title"]
if hasattr(func, UNPACK_ATTR):
if isinstance(v, tuple) or isinstance(v, list):
add_test(
cls,
test_name,
test_data_docstring,
func,
*v
)
else:
# unpack dictionary
add_test(
cls,
test_name,
test_data_docstring,
func,
**v
)
else:
add_test(cls, test_name, test_data_docstring, func, v)
delattr(cls, name)
elif hasattr(func, FILE_ATTR):
file_attr = getattr(func, FILE_ATTR)
process_file_data(cls, name, func, file_attr)
delattr(cls, name)
return cls
[server]
base_url = http://middle-platform.galaxy-immi.com:8183
[log]
name = HXX
level = INFO
file_ok = True
file_name = log.txt
[mysql]
host = test1-mysql-m1.galaxy-immi.com
user = test_db_rw
password = 7FUdrNM6J2ji
port = 3306
[userInfo]
mobile_phone = 13616894511
pwd = 12345678
member_id = 47820
token = eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjQ3ODIwLCJleHAiOjE2ODE5MTIwMjd9.dns0oC9ZSxnbgRqCS520nBGE_QVxjaWa62DF2Ax1tzq1aol8u0MplAsjNIw4n9bcpcwpqHU6gJXEaZGM0iSN6A
This source diff could not be displayed because it is too large. You can view the blob instead.
{"name": "test_talented_person[case14]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 15, 'title': '获取客户登录所需token', 'method': 'post', 'url': '/business/jwt/generateToken?plan_id=0&flow_task_id=78', 'request_data': '{\\n \"order_id\": \"#order_id#\"\\n}', 'extract_data': '{\"client_access_token\": \"$..access_token\"}'}"}], "start": 1693985084168, "stop": 1693985084473, "uuid": "10d464c7-31a1-4ad3-803c-a661c5b095a0", "historyId": "e1e6b36a1247ae3c2f03f4aea49ae745", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case8]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 9, 'title': '主管审核', 'method': 'put', 'url': '/presale/order-main-new/audit', 'request_data': '{\\n \"order_main_id\": \"#order_main_id#\",\\n \"status\": 1\\n}', 'extract_data': None}"}], "start": 1693985071232, "stop": 1693985071748, "uuid": "259c822d-3c8f-4794-8d5d-ae645c929df4", "historyId": "245bdd8782d685ee493892610bff519a", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case18]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 19, 'title': '家庭成员信息', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"next\": 1,\\n \"mother\": {\\n \"birthday\": \"1980-02-01\",\\n \"child_has_hk_id\": {\\n \"has\": \"\"\\n },\\n \"deceased\": true,\\n \"occupation\": \"\",\\n \"occupation_name\": \"\",\\n \"birth_place\": {\\n \"area\": [\\n \"北京市\",\\n \"市辖区\"\\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"relation\": 2,\\n \"hk_identity_card\": \"\",\\n \"subset_name\": \"铁扇公主\",\\n \"used_name\": \"\",\\n \"married\": \"\",\\n \"birth_place_aboard\": 0,\\n \"country_option\": \"\"\\n },\\n \"component\": \"Family\",\\n \"father\": {\\n \"birthday\": \"1971-03-01\",\\n \"child_has_hk_id\": {\\n \"has\": \"\"\\n },\\n \"deceased\": true,\\n \"occupation\": \"\",\\n \"occupation_name\": \"\",\\n \"birth_place\": {\\n \"area\": [\\n \"上海市\",\\n \"市辖区\"\\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"relation\": 1,\\n \"hk_identity_card\": \"\",\\n \"subset_name\": \"牛魔王\",\\n \"used_name\": \"\",\\n \"married\": \"\",\\n \"birth_place_aboard\": 0,\\n \"country_option\": \"\"\\n },\\n \"information\": {\\n \"married\": \"1\"\\n },\\n \"order_id\": \"#order_id#\",\\n \"brother\": [\\n \\n ],\\n \"spouse\": {\\n \"birthday\": \"1992-02-04\",\\n \"child_has_hk_id\": {\\n \"has\": \"N\"\\n },\\n \"occupation\": \"在职\",\\n \"address\": {\\n \"area\": [\\n \\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"child_in_hk\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"occupation_name\": \"会计\",\\n \"birth_place\": {\\n \"area\": [\\n \"北京市\",\\n \"市辖区\"\\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"follow\": 1,\\n \"has_degree\": 1,\\n \"nows\": 1,\\n \"relation\": 3,\\n \"hk_identity_card\": \"\",\\n \"hk_identity\": \"\",\\n \"subset_name\": \"狐狸精\",\\n \"nationality\": \"中国-China\",\\n \"certificates\": {\\n \"cn_identity_card\": {\\n \"number\": \"440981199207077537\",\\n \"issue_at\": \"东莞\",\\n \"issue_date_end_at\": \"2029-06-06\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"2020-01-01\",\\n \"img_front\": \"\"\\n },\\n \"passport\": {\\n \"number\": \"\",\\n \"issue_at\": \"\",\\n \"issue_date_end_at\": \"\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"\",\\n \"img_front\": \"\"\\n },\\n \"hk_macao_pass\": {\\n \"number\": \"L7758258\",\\n \"issue_at\": \"东莞\",\\n \"issue_date_end_at\": \"2029-06-06\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"2020-01-01\",\\n \"img_front\": \"\"\\n }\\n },\\n \"has_degree_json\": [\\n {\\n \"degree\": \"1\",\\n \"address\": \"1\"\\n }\\n ],\\n \"electronic_visa_date\": \"\",\\n \"used_name\": \"\",\\n \"birth_place_aboard\": 0,\\n \"is_handled\": 0\\n },\\n \"component_base_schedule\": 2,\\n \"child\": [\\n {\\n \"birthday\": \"2020-01-01\",\\n \"child_has_hk_id\": {\\n \"has\": \"N\"\\n },\\n \"occupation\": \"无职业\",\\n \"live_country\": \"\",\\n \"address\": {\\n \"area\": [\\n \\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"child_in_hk\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"occupation_name\": \"\",\\n \"sex\": 2,\\n \"birth_place\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"custody\": 1,\\n \"follow\": 1,\\n \"nows\": 1,\\n \"relation\": 4,\\n \"hk_identity_card\": \"\",\\n \"hk_identity\": \"\",\\n \"subset_name\": \"吕孩子\",\\n \"nationality\": \"中国-China\",\\n \"certificates\": {\\n \"cn_identity_card\": {\\n \"number\": \"440981202001017537\",\\n \"issue_at\": \"深圳\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"2029-06-28\",\\n \"issue_date_start_at\": \"2020-06-01\",\\n \"img_front\": \"\"\\n },\\n \"passport\": {\\n \"number\": \"\",\\n \"issue_at\": \"\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"\",\\n \"issue_date_start_at\": \"\",\\n \"img_front\": \"\"\\n },\\n \"hk_macao_pass\": {\\n \"number\": \"L7758258\",\\n \"issue_at\": \"深圳\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"2028-06-21\",\\n \"issue_date_start_at\": \"2020-06-08\",\\n \"img_front\": \"\"\\n }\\n },\\n \"child_stepchild\": {\\n \"has\": \"N\"\\n },\\n \"electronic_visa_date\": \"\",\\n \"used_name\": \"\",\\n \"married\": \"2\",\\n \"birth_place_aboard\": 0,\\n \"is_handled\": 1\\n },\\n {\\n \"birthday\": \"2021-06-02\",\\n \"child_has_hk_id\": {\\n \"has\": \"N\"\\n },\\n \"occupation\": \"无职业\",\\n \"live_country\": \"\",\\n \"address\": {\\n \"area\": [\\n \\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"child_in_hk\": {\\n \"has\": \"\",\\n \"info\": \"\"\\n },\\n \"occupation_name\": \"\",\\n \"sex\": 1,\\n \"birth_place\": {\\n \"area\": [\\n \"北京市\",\\n \"市辖区\"\\n ],\\n \"country\": \"\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"custody\": 1,\\n \"follow\": 2,\\n \"nows\": \"\",\\n \"relation\": 4,\\n \"hk_identity_card\": \"\",\\n \"hk_identity\": \"\",\\n \"subset_name\": \"南孩子\",\\n \"nationality\": \"\",\\n \"certificates\": {\\n \"cn_identity_card\": {\\n \"number\": \"\",\\n \"issue_at\": \"\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"\",\\n \"issue_date_start_at\": \"\",\\n \"img_front\": \"\"\\n },\\n \"passport\": {\\n \"number\": \"\",\\n \"issue_at\": \"\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"\",\\n \"issue_date_start_at\": \"\",\\n \"img_front\": \"\"\\n },\\n \"hk_macao_pass\": {\\n \"number\": \"\",\\n \"issue_at\": \"\",\\n \"img_back\": \"\",\\n \"issue_date_end_at\": \"\",\\n \"issue_date_start_at\": \"\",\\n \"img_front\": \"\"\\n }\\n },\\n \"child_stepchild\": {\\n \"has\": \"\"\\n },\\n \"electronic_visa_date\": \"\",\\n \"used_name\": \"南瓜车\",\\n \"married\": \"2\",\\n \"birth_place_aboard\": 0,\\n \"is_handled\": \"\"\\n }\\n ]\\n}', 'extract_data': None}"}], "start": 1693985085196, "stop": 1693985086784, "uuid": "575448a1-2d64-4ff7-a3e5-05a3891d637d", "historyId": "a012d0b8aaa01065ebdf2c7cec2346ab", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "a03963b3-1d24-402a-946b-2a80d7e02f1c", "befores": [{"name": "case", "status": "passed", "start": 1693985087950, "stop": 1693985087950}], "start": 1693985087950, "stop": 1693985091353}
\ No newline at end of file
{"name": "test_talented_person[case6]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 7, 'title': '获取回款id', 'method': 'get', 'url': '/presale/order-main-new/detail?order_main_id=#order_main_id#', 'request_data': None, 'extract_data': '{\"order_main_received_id\": \"$.data.received[0].id\"}'}"}], "start": 1693985070318, "stop": 1693985070765, "uuid": "4f26ba72-cfd5-4f8e-a80f-789202836ae0", "historyId": "c074219f33258e478a5bb37c70139920", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case1]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 2, 'title': '新增客户', 'method': 'post', 'url': '/presale/customer-new/add', 'request_data': '{\\n \"customer_type\": 1,\\n \"username\": \"测试账号\",\\n \"mobile\": \"#mobile#\",\\n \"source_type_id\": 21,\\n \"second_channel\": \"小红书\",\\n \"recommend_id\": 1391,\\n \"recommend_file\": {\\n \"url\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1669193753974.pdf\",\\n \"name\": \"王小敏城市合伙人.pdf\"\\n },\\n \"user_ids\": [\\n 1391\\n ],\\n \"remark\": \"da\",\\n \"channel_en\": \"wait\",\\n \"group_id\": 1\\n}', 'extract_data': None}"}], "start": 1693985064398, "stop": 1693985066250, "uuid": "5c4dff37-feae-4cbc-b727-7cb37d768729", "historyId": "d11e830d23d39d4f700a66398e80b7c1", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case9]", "status": "broken", "statusDetails": {"message": "requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)", "trace": "self = <Response [500]>, kwargs = {}\n\n def json(self, **kwargs):\n r\"\"\"Returns the json-encoded content of a response, if any.\n \n :param \\*\\*kwargs: Optional arguments that ``json.loads`` takes.\n :raises requests.exceptions.JSONDecodeError: If the response body does not\n contain valid json.\n \"\"\"\n \n if not self.encoding and self.content and len(self.content) > 3:\n # No encoding set. JSON RFC 4627 section 3 states we should expect\n # UTF-8, -16 or -32. Detect which one to use; If the detection or\n # decoding fails, fall back to `self.text` (using charset_normalizer to make\n # a best guess).\n encoding = guess_json_utf(self.content)\n if encoding is not None:\n try:\n return complexjson.loads(self.content.decode(encoding), **kwargs)\n except UnicodeDecodeError:\n # Wrong UTF codec detected; usually because it's not UTF-8\n # but some other 8-bit codec. This is an RFC violation,\n # and the server didn't bother to tell us what codec *was*\n # used.\n pass\n except JSONDecodeError as e:\n raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)\n \n try:\n> return complexjson.loads(self.text, **kwargs)\n\nvenv\\lib\\site-packages\\requests\\models.py:971: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\nC:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib\\json\\__init__.py:357: in loads\n return _default_decoder.decode(s)\nC:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib\\json\\decoder.py:337: in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = <json.decoder.JSONDecoder object at 0x0000023D28F9B0D0>\ns = 'Error: Failed to connect to 172.18.85.63 port 3007 after 3004 ms: Couldn\\'t connect to server{\"code\":0,\"msg\":\"\\\\u751f\\\\u6210\\\\u7535\\\\u5b50\\\\u56fe\\\\u7247\\\\u5931\\\\u8d25,\\\\u8bf7\\\\u68c0\\\\u67e5\\\\u670d\\\\u52a1\\\\u6216\\\\u53c2\\\\u6570\",\"data\":{}}'\nidx = 0\n\n def raw_decode(self, s, idx=0):\n \"\"\"Decode a JSON document from ``s`` (a ``str`` beginning with\n a JSON document) and return a 2-tuple of the Python\n representation and the index in ``s`` where the document ended.\n \n This can be used to decode a JSON document from a string that may\n have extraneous data at the end.\n \n \"\"\"\n try:\n obj, end = self.scan_once(s, idx)\n except StopIteration as err:\n> raise JSONDecodeError(\"Expecting value\", s, err.value) from None\nE json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n\nC:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38\\lib\\json\\decoder.py:355: JSONDecodeError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <Interface.TestCases.test_talented_Person.TestTalentedPerson object at 0x0000023D2C462D30>\ncase = {'extract_data': None, 'id': 10, 'method': 'post', 'request_data': '{\\n \"id\": \"64509\",\\n \"actual_time\": \"2023-08-06 22:22:22\"\\n}', ...}\n\n @pytest.mark.parametrize(\"case\", cases)\n def test_talented_person(self, case):\n logger.info(\"********** 执行用例{}:{} **********\".format(case[\"id\"], case[\"title\"]))\n # 第二步,替换request_data中的未知数\n case = replace_case_by_regular(case)\n # print(case)\n \n # 第三步,执行请求\n if hasattr(EnvData, \"token\"):\n> response = send_request(case[\"method\"], case[\"url\"], case[\"request_data\"], token=getattr(EnvData, \"token\"))\n\nTestCases\\test_talented_Person.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\nCommon\\handle_requests.py:32: in send_request\n logger.info(\"响应数据为:{}\".format(resp.json()))\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = <Response [500]>, kwargs = {}\n\n def json(self, **kwargs):\n r\"\"\"Returns the json-encoded content of a response, if any.\n \n :param \\*\\*kwargs: Optional arguments that ``json.loads`` takes.\n :raises requests.exceptions.JSONDecodeError: If the response body does not\n contain valid json.\n \"\"\"\n \n if not self.encoding and self.content and len(self.content) > 3:\n # No encoding set. JSON RFC 4627 section 3 states we should expect\n # UTF-8, -16 or -32. Detect which one to use; If the detection or\n # decoding fails, fall back to `self.text` (using charset_normalizer to make\n # a best guess).\n encoding = guess_json_utf(self.content)\n if encoding is not None:\n try:\n return complexjson.loads(self.content.decode(encoding), **kwargs)\n except UnicodeDecodeError:\n # Wrong UTF codec detected; usually because it's not UTF-8\n # but some other 8-bit codec. This is an RFC violation,\n # and the server didn't bother to tell us what codec *was*\n # used.\n pass\n except JSONDecodeError as e:\n raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)\n \n try:\n return complexjson.loads(self.text, **kwargs)\n except JSONDecodeError as e:\n # Catch JSON-related errors and raise as requests.JSONDecodeError\n # This aliases json.JSONDecodeError and simplejson.JSONDecodeError\n> raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)\nE requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n\nvenv\\lib\\site-packages\\requests\\models.py:975: JSONDecodeError"}, "parameters": [{"name": "case", "value": "{'id': 10, 'title': '财务回款审核', 'method': 'post', 'url': '/presale/order-main-received/adopt', 'request_data': '{\\n \"id\": \"#order_main_received_id#\",\\n \"actual_time\": \"2023-08-06 22:22:22\"\\n}', 'extract_data': None}"}], "start": 1693985071750, "stop": 1693985077181, "uuid": "d94c4f42-b50a-4dc3-84c0-709e114c76d8", "historyId": "79ebf5b6fdf5eb4a97d6bcf6bbc96026", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "6cb27939-fff1-4e09-8c15-d183933251c0", "befores": [{"name": "case", "status": "passed", "start": 1693985087023, "stop": 1693985087023}], "start": 1693985087023, "stop": 1693985087189}
\ No newline at end of file
{"uuid": "5ac9dc7a-9ccd-4cb1-ab34-5ae832c75002", "befores": [{"name": "case", "status": "passed", "start": 1693985066252, "stop": 1693985066252}], "start": 1693985066252, "stop": 1693985066732}
\ No newline at end of file
{"name": "test_talented_person[case2]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 3, 'title': '获取新增客户的id', 'method': 'get', 'url': '/presale/customer-new/get-list?group_id=1&keyword=#mobile#', 'request_data': None, 'extract_data': '{\"customer_id\": \"$.data.data[0].customer_id\"}'}"}], "start": 1693985066252, "stop": 1693985066731, "uuid": "4904b270-4f2f-4e11-b61b-87dc520b7cff", "historyId": "e34349b4b92607f50f07f4806c7a8480", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "00d9ec08-061c-4741-b01e-f3bbb497238d", "befores": [{"name": "case", "status": "passed", "start": 1693985087191, "stop": 1693985087191}], "start": 1693985087191, "stop": 1693985087390}
\ No newline at end of file
{"name": "test_talented_person[case24]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 25, 'title': '获取申请人信息step=6', 'method': 'get', 'url': '/business/client/information/progress-bar?step=6&order_id=#order_id#', 'request_data': None, 'extract_data': '{\"info_id\": \"$.data.progress_bar[6].data.id\"}'}"}], "start": 1693985087679, "stop": 1693985087948, "uuid": "e4c9cc56-46b3-410a-b69e-ff70c8bbbe99", "historyId": "67169876f660d37c8bc575add80937c0", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "fd42186e-6c4a-4ad9-8ec7-eb79cfac05ec", "befores": [{"name": "case", "status": "passed", "start": 1693985084168, "stop": 1693985084168}], "start": 1693985084168, "stop": 1693985084473}
\ No newline at end of file
{"uuid": "47d0e54c-7e9d-40e6-ad42-5c2231eb3a48", "befores": [{"name": "case", "status": "passed", "start": 1693985067284, "stop": 1693985067284}], "start": 1693985067284, "stop": 1693985070316}
\ No newline at end of file
{"name": "test_talented_person[case4]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 5, 'title': '生成合同号', 'method': 'post', 'url': '/presale/order-main-new/new-order-sn', 'request_data': '{\\n \"order_main_type\": 1,\\n \"company\": 2,\\n \"presale_product_text\": \"香港优才(6.1万)全款盈河\",\\n \"presale_product\": 403,\\n \"presale_product_t\": 0,\\n \"customer_id\": \"#customer_id#\"\\n}', 'extract_data': '{\"order_sn\": \"$.data\"}'}"}], "start": 1693985067045, "stop": 1693985067282, "uuid": "29898ef0-8425-434b-a43d-f4291bddcdc1", "historyId": "2a602947e3a295e10b13e764423be19f", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case15]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 16, 'title': '客户端登录智能申请系统', 'method': 'get', 'url': '/client-web/user/serLogin?token=#client_access_token#', 'request_data': None, 'extract_data': '{\"token\": \"$..token\"}'}"}], "start": 1693985084475, "stop": 1693985084552, "uuid": "df1b1b73-7204-4335-aa75-5fc796b6387e", "historyId": "16963a5e1e1cc55d28a23b3c8ff53b77", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case3]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 4, 'title': '顾问评分', 'method': 'post', 'url': '/presale/sop/phase-question/evaluation', 'request_data': '{\\n \"questions\": [\\n {\\n \"id\": 4,\\n \"name\": \"年龄\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 307,\\n \"name\": \"18岁以下(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n },\\n {\\n \"id\": 308,\\n \"name\": \"18-30岁(30分)\",\\n \"score\": 30,\\n \"selected\": true\\n },\\n {\\n \"id\": 309,\\n \"name\": \"31-39岁(30分)\",\\n \"score\": 30,\\n \"selected\": false\\n },\\n {\\n \"id\": 310,\\n \"name\": \"40-44岁(20分)\",\\n \"score\": 20,\\n \"selected\": false\\n },\\n {\\n \"id\": 311,\\n \"name\": \"45岁-50岁(15分)\",\\n \"score\": 15,\\n \"selected\": false\\n },\\n {\\n \"id\": 312,\\n \"name\": \"51岁及以上(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 308\\n ]\\n },\\n {\\n \"id\": 5,\\n \"name\": \"最高学历\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 11,\\n \"name\": \"博士/2个硕士(40分)\",\\n \"score\": 40,\\n \"selected\": true\\n },\\n {\\n \"id\": 12,\\n \"name\": \"硕士/2个学士(20分)\",\\n \"score\": 20,\\n \"selected\": false\\n },\\n {\\n \"id\": 13,\\n \"name\": \"本科/专业技能认可(10分)\",\\n \"score\": 10,\\n \"selected\": false\\n },\\n {\\n \"id\": 14,\\n \"name\": \"大专/本科无学位\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 11\\n ]\\n },\\n {\\n \"id\": 6,\\n \"name\": \"百强名校\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 22,\\n \"name\": \"是(30分)\",\\n \"score\": 30,\\n \"selected\": true\\n },\\n {\\n \"id\": 23,\\n \"name\": \"否(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 22\\n ]\\n },\\n {\\n \"id\": 7,\\n \"name\": \"工作管理经验\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 17,\\n \"name\": \"至少10年工作经验,且有5年以上管理经验(40分)\",\\n \"score\": 40,\\n \"selected\": true\\n },\\n {\\n \"id\": 18,\\n \"name\": \"至少5年工作经验,且有2年以上管理经验(30分)\",\\n \"score\": 30,\\n \"selected\": false\\n },\\n {\\n \"id\": 19,\\n \"name\": \"至少5年工作经验(15分)\",\\n \"score\": 15,\\n \"selected\": false\\n },\\n {\\n \"id\": 20,\\n \"name\": \"至少2年工作经验(5分)\",\\n \"score\": 5,\\n \"selected\": false\\n },\\n {\\n \"id\": 21,\\n \"name\": \"少于2年工作经验(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 17\\n ]\\n },\\n {\\n \"id\": 22,\\n \"name\": \"名企工作经验\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 291,\\n \"name\": \"3年及以上(20分)\",\\n \"score\": 20,\\n \"selected\": true\\n },\\n {\\n \"id\": 292,\\n \"name\": \"少于3年(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 291\\n ]\\n },\\n {\\n \"id\": 8,\\n \"name\": \"海外工作经验\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 24,\\n \"name\": \"少于2年(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n },\\n {\\n \"id\": 25,\\n \"name\": \"2年以上(15分)\",\\n \"score\": 15,\\n \"selected\": true\\n }\\n ],\\n \"selectedIds\": [\\n 25\\n ]\\n },\\n {\\n \"id\": 9,\\n \"name\": \"语言能力\",\\n \"type\": 1,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 26,\\n \"name\": \"良好中文及英文的书写及口语能力(中文口语指普通话或粤语)(20分)\",\\n \"score\": 20,\\n \"selected\": true\\n },\\n {\\n \"id\": 27,\\n \"name\": \"除了具备良好中文或英文的书写及口语能力外(中文口语指普通话或 粤语),也能流利应用不少于一种外国语言(包括书写及口语能力)(15分)\",\\n \"score\": 15,\\n \"selected\": false\\n },\\n {\\n \"id\": 28,\\n \"name\": \"良好中文或英文的书写及口语能力(中文口语指普通话或粤语)(10分)\",\\n \"score\": 10,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 26\\n ]\\n },\\n {\\n \"id\": 11,\\n \"name\": \"家庭背景\",\\n \"type\": 2,\\n \"score\": 0,\\n \"options\": [\\n {\\n \"id\": 274,\\n \"name\": \"有1名直系家庭亲属是永居(5分)\",\\n \"score\": 5,\\n \"selected\": false\\n },\\n {\\n \"id\": 275,\\n \"name\": \"配偶本科学士及以上学历(5分)\",\\n \"score\": 5,\\n \"selected\": true\\n },\\n {\\n \"id\": 276,\\n \"name\": \"随行的18岁以下未婚及受养的1名子女得(5分)\",\\n \"score\": 5,\\n \"selected\": false\\n },\\n {\\n \"id\": 277,\\n \"name\": \"随行的18岁以下未婚及受养的2名子女得(10分)\",\\n \"score\": 10,\\n \"selected\": false\\n },\\n {\\n \"id\": 278,\\n \"name\": \"以上条件都没有(0分)\",\\n \"score\": 0,\\n \"selected\": false\\n }\\n ],\\n \"selectedIds\": [\\n 275\\n ]\\n }\\n ],\\n \"customer_id\": \"#customer_id#\",\\n \"group_id\": \"1\",\\n \"customer_extend_id\": 554463\\n}', 'extract_data': None}"}], "start": 1693985066734, "stop": 1693985067042, "uuid": "f3ad02b7-327a-4446-821c-c96617abef80", "historyId": "6db0eec952639837d0dc3a4ed8bf6a44", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case21]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 22, 'title': '学历/专业资格', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"order_id\": \"#order_id#\",\\n \"component\": \"Qualification\",\\n \"education\": [\\n {\\n \"college\": \"青岛大学\",\\n \"type\": \"全日制\",\\n \"admission_time\": \"2011-06\",\\n \"graduate_time\": \"2015-09\",\\n \"professional\": \"信管\",\\n \"background\": \"硕士学位\",\\n \"degree_type\": \"管理学\",\\n \"school_address\": {\\n \"details\": \"\",\\n \"country\": \"中国-China\",\\n \"area\": [\\n \"山东省\",\\n \"青岛市\"\\n ],\\n \"foreign\": \"\"\\n },\\n \"pickerAdmissionTime\": {\\n \\n },\\n \"pickerGraduateTime\": {\\n \\n },\\n \"school_address_aboard\": 0\\n },\\n {\\n \"college\": \"珠海学院\",\\n \"type\": \"兼读制\",\\n \"admission_time\": \"2000-01\",\\n \"graduate_time\": \"2003-02\",\\n \"professional\": \"测试\",\\n \"background\": \"学士学位\",\\n \"degree_type\": \"测试\",\\n \"school_address\": {\\n \"country\": \"中国-China\",\\n \"area\": [\\n \"广东省\",\\n \"珠海市\"\\n ],\\n \"foreign\": \"\"\\n },\\n \"pickerAdmissionTime\": {\\n \\n },\\n \"pickerGraduateTime\": {\\n \\n },\\n \"school_address_aboard\": 0\\n }\\n ],\\n \"qualification\": [\\n \\n ],\\n \"confirm\": {\\n \"id\": \"#order_id#\",\\n \"qualification\": 1,\\n \"graduate\": 1,\\n \"married\": \"1\"\\n },\\n \"component_base_schedule\": 4,\\n \"next\": 1\\n}', 'extract_data': None}"}], "start": 1693985087191, "stop": 1693985087390, "uuid": "bf5c28db-9186-4998-a43d-770ef5d18e6b", "historyId": "82ed0f6884b1e28c650c70311fea481a", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case10]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 11, 'title': '根据合同查订单', 'method': 'get', 'url': '/business/informationSearch/order?order_sn=#order_sn#', 'request_data': None, 'extract_data': '{\"order_id\": \"$.data.data[0].id\",\\n\"order_task_id\": \"$.data.data[0].order_task_id\",}'}"}], "start": 1693985077321, "stop": 1693985077966, "uuid": "680d129b-960f-4ccb-ba79-22e1206dae55", "historyId": "ae29d5b3140d41c6344c6415b828f434", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "6528f6e8-6174-43fe-9a80-211dd9c3d2c7", "befores": [{"name": "case", "status": "passed", "start": 1693985085195, "stop": 1693985085195}], "start": 1693985085195, "stop": 1693985086784}
\ No newline at end of file
{"uuid": "b583bcbf-ddc0-47a1-bb9d-2caf18d7c3fe", "befores": [{"name": "case", "status": "passed", "start": 1693985070767, "stop": 1693985070767}], "start": 1693985070767, "stop": 1693985071229}
\ No newline at end of file
{"uuid": "f9f83024-f64a-4c9b-b97a-870a32aec971", "befores": [{"name": "case", "status": "passed", "start": 1693985078207, "stop": 1693985078207}], "start": 1693985078207, "stop": 1693985078625}
\ No newline at end of file
{"uuid": "a68751b1-4056-4ca0-9c94-b6d431cb5579", "befores": [{"name": "case", "status": "passed", "start": 1693985084729, "stop": 1693985084729}], "start": 1693985084729, "stop": 1693985085194}
\ No newline at end of file
{"uuid": "cb121a6a-d5f5-4bd8-8db5-817ade3f517d", "befores": [{"name": "case", "status": "passed", "start": 1693985064398, "stop": 1693985064398}], "start": 1693985064398, "stop": 1693985066250}
\ No newline at end of file
{"name": "test_talented_person[case7]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 8, 'title': '完善回款', 'method': 'put', 'url': '/presale/order-main-received/edit', 'request_data': '{\\n \"type\": 1,\\n \"drawer\": \"#username#\",\\n \"currency_id\": 1,\\n \"cost_collecting\": 61000,\\n \"foreign_value\": 61000,\\n \"exchange_rate\": 0,\\n \"payment_method\": 1,\\n \"bank_account_id\": 22,\\n \"date_of_receipt\": \"2023-07-11\",\\n \"receipt_voucher\": [\\n {\\n \"url\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1683255128964.png\",\\n \"name\": \"收款凭据.png\"\\n }\\n ],\\n \"remark\": \"\",\\n \"order_main_id\": \"#order_main_id#\",\\n \"order_main_received_id\": #order_main_received_id#,\\n \"order_sn\": \"#order_sn#\",\\n \"commit_user_id\": 0,\\n \"status\": 1\\n}', 'extract_data': None}"}], "start": 1693985070767, "stop": 1693985071229, "uuid": "a8af81ac-9dbb-4521-ad29-25a3a59663f3", "historyId": "a0cbb10108ad4d9200ddd46779e63466", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case0]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 1, 'title': '登录', 'method': 'post', 'url': '/administrator/auth/login', 'request_data': '{\\n \"account\": \"admin0001\",\\n \"password\": \"123456\"\\n}', 'extract_data': '{\"token\": \"$..token\"}'}"}], "start": 1693985064066, "stop": 1693985064396, "uuid": "08d39ee1-7689-4aab-99eb-a9040d719857", "historyId": "37deb87d62b61ed545989a6eca035647", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case22]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 23, 'title': '工作经验', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"order_id\": \"#order_id#\",\\n \"component\": \"Work\",\\n \"works\": [\\n {\\n \"id\": \"\",\\n \"company_name\": \"沃尔玛\",\\n \"industry\": \"跨国股份有限公司\",\\n \"location_aboard\": 0,\\n \"location\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"position\": \"管理\",\\n \"entry_time\": \"1995-02\",\\n \"departure_time\": \"1999-02\",\\n \"departure_time_checked\": false,\\n \"work_certificate\": \"盖章并签字的推荐信 (证明效果最强)\",\\n \"duty\": \"管理\",\\n \"is_executives\": 1,\\n \"company_member_total\": \"77777\",\\n \"administrative_level\": 1,\\n \"company_manage_total\": \"123\",\\n \"professional_level\": 1,\\n \"master_of_important_project\": \"\",\\n \"top_manager_date_start\": \"1995-03\",\\n \"top_manager_date_end\": \"1997-04\",\\n \"top_manager_date_checked\": false,\\n \"top_manager_date_string\": \"\",\\n \"top_manager_date_long\": 0,\\n \"executives_certificate\": \"盖章且签字的组织架构图和审计报告\",\\n \"wduty\": \"测试123asd/*-\",\\n \"highlights\": \"测试123asd/*-\",\\n \"file\": [\\n {\\n \"fileName\": \"PNG.png\",\\n \"fileUrl\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1684391984717.png\",\\n \"fileSize\": 72816\\n }\\n ],\\n \"not_need_upload_file\": 0,\\n \"match_listing\": 0\\n },\\n {\\n \"id\": \"\",\\n \"company_name\": \"阿里\",\\n \"industry\": \"跨国股份有限公司\",\\n \"location_aboard\": 0,\\n \"location\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"position\": \"管理\",\\n \"entry_time\": \"1995-02\",\\n \"departure_time\": \"1999-02\",\\n \"departure_time_checked\": false,\\n \"work_certificate\": \"盖章并签字的推荐信 (证明效果最强)\",\\n \"duty\": \"管理\",\\n \"is_executives\": 1,\\n \"company_member_total\": \"77777\",\\n \"administrative_level\": 1,\\n \"company_manage_total\": \"123\",\\n \"professional_level\": 1,\\n \"master_of_important_project\": \"\",\\n \"top_manager_date_start\": \"1995-03\",\\n \"top_manager_date_end\": \"1997-04\",\\n \"top_manager_date_checked\": false,\\n \"top_manager_date_string\": \"\",\\n \"top_manager_date_long\": 0,\\n \"executives_certificate\": \"盖章且签字的组织架构图和审计报告\",\\n \"wduty\": \"测试123asd/*-\",\\n \"highlights\": \"测试123asd/*-\",\\n \"file\": [\\n {\\n \"fileName\": \"PNG.png\",\\n \"fileUrl\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1684391984717.png\",\\n \"fileSize\": 72816\\n }\\n ],\\n \"not_need_upload_file\": 0,\\n \"match_listing\": 0\\n },\\n {\\n \"id\": \"\",\\n \"company_name\": \"华为\",\\n \"industry\": \"跨国股份有限公司\",\\n \"location_aboard\": 0,\\n \"location\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"position\": \"管理\",\\n \"entry_time\": \"1995-02\",\\n \"departure_time\": \"1999-02\",\\n \"departure_time_checked\": false,\\n \"work_certificate\": \"盖章并签字的推荐信 (证明效果最强)\",\\n \"duty\": \"管理\",\\n \"is_executives\": 1,\\n \"company_member_total\": \"77777\",\\n \"administrative_level\": 1,\\n \"company_manage_total\": \"123\",\\n \"professional_level\": 1,\\n \"master_of_important_project\": \"\",\\n \"top_manager_date_start\": \"1995-03\",\\n \"top_manager_date_end\": \"1997-04\",\\n \"top_manager_date_checked\": false,\\n \"top_manager_date_string\": \"\",\\n \"top_manager_date_long\": 0,\\n \"executives_certificate\": \"盖章且签字的组织架构图和审计报告\",\\n \"wduty\": \"测试123asd/*-\",\\n \"highlights\": \"测试123asd/*-\",\\n \"file\": [\\n {\\n \"fileName\": \"PNG.png\",\\n \"fileUrl\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1684391984717.png\",\\n \"fileSize\": 72816\\n }\\n ],\\n \"not_need_upload_file\": 0,\\n \"match_listing\": 0\\n },\\n {\\n \"id\": \"\",\\n \"company_name\": \"苹果\",\\n \"industry\": \"跨国股份有限公司\",\\n \"location_aboard\": 0,\\n \"location\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"position\": \"管理\",\\n \"entry_time\": \"1995-02\",\\n \"departure_time\": \"1999-02\",\\n \"departure_time_checked\": false,\\n \"work_certificate\": \"盖章并签字的推荐信 (证明效果最强)\",\\n \"duty\": \"管理\",\\n \"is_executives\": 1,\\n \"company_member_total\": \"77777\",\\n \"administrative_level\": 1,\\n \"company_manage_total\": \"123\",\\n \"professional_level\": 1,\\n \"master_of_important_project\": \"\",\\n \"top_manager_date_start\": \"1995-03\",\\n \"top_manager_date_end\": \"1997-04\",\\n \"top_manager_date_checked\": false,\\n \"top_manager_date_string\": \"\",\\n \"top_manager_date_long\": 0,\\n \"executives_certificate\": \"盖章且签字的组织架构图和审计报告\",\\n \"wduty\": \"测试123asd/*-\",\\n \"highlights\": \"测试123asd/*-\",\\n \"file\": [\\n {\\n \"fileName\": \"PNG.png\",\\n \"fileUrl\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1684391984717.png\",\\n \"fileSize\": 72816\\n }\\n ],\\n \"not_need_upload_file\": 0,\\n \"match_listing\": 0\\n }\\n ],\\n \"component_base_schedule\": 5,\\n \"next\": 1\\n}', 'extract_data': None}"}], "start": 1693985087392, "stop": 1693985087493, "uuid": "77f4b609-5fc8-419b-a9bf-40328fdd07c9", "historyId": "769ef379063489b1fb96a9bd81ffa0e3", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case19]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 20, 'title': '获取申请人信息step=2', 'method': 'get', 'url': '/business/client/information/progress-bar?step=2&order_id=#order_id#', 'request_data': None, 'extract_data': '{\"spouse_id\": \"$.data.progress_bar[2].data.background.subset[0].id\",\\n\"children_1_id\": \"$.data.progress_bar[2].data.background.subset[1].id\",\\n\"children_2_id\": \"$.data.progress_bar[2].data.background.subset[2].id\",\\n\"mother_id\": \"$.data.progress_bar[2].data.background.subset[3].id\",\\n\"father_id\": \"$.data.progress_bar[2].data.background.subset[4].id\",}'}"}], "start": 1693985086787, "stop": 1693985087021, "uuid": "ba2ed9de-27f7-4430-bcc6-faad3bed61e1", "historyId": "689948bad65aa4fe4a18bd0e021f2039", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "ca30441c-c44a-43e3-9081-1bbf0408c44f", "befores": [{"name": "case", "status": "passed", "start": 1693985087679, "stop": 1693985087679}], "start": 1693985087679, "stop": 1693985087948}
\ No newline at end of file
{"uuid": "dea862ad-cc65-4cc3-886b-783d71b90668", "befores": [{"name": "case", "status": "passed", "start": 1693985071750, "stop": 1693985071750}], "start": 1693985071750, "stop": 1693985077319}
\ No newline at end of file
{"uuid": "75e64fc2-7e9a-4b7c-8e27-a0b26afd095a", "befores": [{"name": "case", "status": "passed", "start": 1693985077320, "stop": 1693985077320}], "start": 1693985077320, "stop": 1693985077967}
\ No newline at end of file
{"name": "test_talented_person[case17]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 18, 'title': '申请人信息', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"birthday\": \"1990-03-01\",\\n \"next\": 0,\\n \"app\": 2,\\n \"username_pinyin\": {\\n \"given_name\": \"TEST\",\\n \"family_name\": \"AUTO\"\\n },\\n \"has_hk_id\": 0,\\n \"component_score\": {\\n \"age\": {\\n \"answer\": \"满足\\\\u201c18-39岁\\\\u201d\",\\n \"score\": 30\\n }\\n },\\n \"address\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"深圳湾110号\",\\n \"foreign\": \"\"\\n },\\n \"hk_id_number\": \"\",\\n \"sex\": 1,\\n \"mobile\": \"18145678912\",\\n \"birth_place\": {\\n \"area\": [\\n \"广东省\",\\n \"深圳市\"\\n ],\\n \"country\": \"中国-China\",\\n \"details\": \"\",\\n \"foreign\": \"\"\\n },\\n \"address_aboard\": 0,\\n \"component\": \"User\",\\n \"nationality\": \"中国-China\",\\n \"certificates\": {\\n \"cn_identity_card\": {\\n \"number\": \"440981199003017537\",\\n \"issue_at\": \"深圳\",\\n \"issue_date_end_at\": \"2028-12-30\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"2018-11-01\",\\n \"img_front\": \"\"\\n },\\n \"passport\": {\\n \"number\": \"007007\",\\n \"issue_at\": \"东莞\",\\n \"issue_date_end_at\": \"2028-11-30\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"2020-02-05\",\\n \"img_front\": \"\"\\n },\\n \"hk_macao_pass\": {\\n \"number\": \"L1234567\",\\n \"issue_at\": \"中国\",\\n \"issue_date_end_at\": \"2030-05-31\",\\n \"img_back\": \"\",\\n \"issue_date_start_at\": \"2010-01-01\",\\n \"img_front\": \"\"\\n }\\n },\\n \"id\": \"#client_0_id#\",\\n \"used_name\": \"1\",\\n \"order_id\": \"#order_id#\",\\n \"married\": 1,\\n \"birth_place_aboard\": 0,\\n \"email\": \"testApi@qq.com\",\\n \"age\": 33,\\n \"is_handled\": 1,\\n \"username\": \"张三\"\\n}', 'extract_data': None}"}], "start": 1693985084729, "stop": 1693985085193, "uuid": "bb775174-d610-4448-b00c-8eb2d351c211", "historyId": "d09358d02ff8a0af0b5d1411c3504206", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "08296a68-83ae-4a1f-800f-8f4482eeb7a2", "befores": [{"name": "case", "status": "passed", "start": 1693985064066, "stop": 1693985064066}], "start": 1693985064066, "stop": 1693985064396}
\ No newline at end of file
{"uuid": "1cec171d-5e20-4375-bc3e-3b5b1125e3c3", "befores": [{"name": "case", "status": "passed", "start": 1693985077968, "stop": 1693985077968}], "start": 1693985077968, "stop": 1693985078205}
\ No newline at end of file
{"uuid": "05afa20d-036f-4f0a-8833-d29fc7ce6a26", "befores": [{"name": "case", "status": "passed", "start": 1693985067045, "stop": 1693985067045}], "start": 1693985067045, "stop": 1693985067282}
\ No newline at end of file
{"uuid": "7ee24a23-4069-4bc4-b12f-161edfdecaf5", "befores": [{"name": "case", "status": "passed", "start": 1693985087392, "stop": 1693985087392}], "start": 1693985087392, "stop": 1693985087494}
\ No newline at end of file
{"uuid": "0f6a9c46-d236-407e-aba2-3c86ffcaefc5", "befores": [{"name": "case", "status": "passed", "start": 1693985071231, "stop": 1693985071231}], "start": 1693985071231, "stop": 1693985071748}
\ No newline at end of file
{"name": "test_talented_person[case23]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 24, 'title': '其他信息', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"order_id\": \"#order_id#\",\\n \"component\": \"Other\",\\n \"residences\": [\\n {\\n \"id\": \"\",\\n \"country\": \"中国-China\",\\n \"start_time\": \"1990-03-01\",\\n \"end_time\": \"\",\\n \"end_time_checked\": true\\n }\\n ],\\n \"language_detail\": {\\n \"school_address_aboard\": false,\\n \"level\": 2,\\n \"name\": \"\",\\n \"remark\": \"\"\\n },\\n \"profession\": {\\n \"option\": 14,\\n \"remark\": \"体育运动\"\\n },\\n \"question\": {\\n \"professional_qualification\": 2,\\n \"paper\": 2,\\n \"scholarship\": 2,\\n \"media_interview\": 2\\n },\\n \"component_base_schedule\": 6,\\n \"next\": 1\\n}', 'extract_data': None}"}], "start": 1693985087497, "stop": 1693985087677, "uuid": "28725231-c93b-473c-9a35-49c291a19290", "historyId": "3f4bdd013b8ff276493e8852a49b8932", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case16]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 17, 'title': '首次进入 step=0', 'method': 'get', 'url': '/business/client/information/progress-bar?step=0&order_id=#order_id#', 'request_data': None, 'extract_data': '{\"userId\": \"$.data.userId\",\\n\"client_0_id\": \"$.data.progress_bar[0].data.id\"}'}"}], "start": 1693985084555, "stop": 1693985084727, "uuid": "7caae6a6-c200-4c42-a9b0-d506725213fc", "historyId": "dd68216a8bae7cedaa6bee82ce286e07", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "83efc143-18e8-4a81-be55-24553ac706fa", "befores": [{"name": "case", "status": "passed", "start": 1693985087496, "stop": 1693985087496}], "start": 1693985087496, "stop": 1693985087677}
\ No newline at end of file
{"name": "test_talented_person[case20]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 21, 'title': '基本资料', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"next\": 1,\\n \"component\": \"Basics\",\\n \"background\": {\\n \"background_member\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"subset\": [\\n {\\n \"permanent_residence\": 0,\\n \"permanent_reside_year\": 0,\\n \"id\": \"#spouse_id#\",\\n \"permanent_reside_month\": 0,\\n \"subset_name\": \"狐狸精\"\\n },\\n {\\n \"permanent_residence\": 0,\\n \"permanent_reside_year\": 0,\\n \"id\": \"#children_2_id#\",\\n \"permanent_reside_month\": 0,\\n \"subset_name\": \"南孩子\"\\n },\\n {\\n \"permanent_residence\": 0,\\n \"permanent_reside_year\": 0,\\n \"id\": \"#children_1_id#\",\\n \"permanent_reside_month\": 0,\\n \"subset_name\": \"吕孩子\"\\n },\\n {\\n \"permanent_residence\": 0,\\n \"permanent_reside_year\": 0,\\n \"id\": \"#mother_id#\",\\n \"permanent_reside_month\": 0,\\n \"subset_name\": \"铁扇公主\"\\n },\\n {\\n \"permanent_residence\": 0,\\n \"permanent_reside_year\": 0,\\n \"id\": \"#father_id#\",\\n \"permanent_reside_month\": 0,\\n \"subset_name\": \"牛魔王\"\\n }\\n ]\\n },\\n \"order_id\": \"#order_id#\",\\n \"brother\": [\\n \\n ],\\n \"spouse\": {\\n \"child_departure\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"child_deny\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"id\": \"#spouse_id#\",\\n \"subset_name\": \"狐狸精\"\\n },\\n \"component_base_schedule\": 3,\\n \"applicant\": {\\n \"has_other_id\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"has_departure\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"id\": null,\\n \"has_conviction\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"has_breaking_law\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"has_deny\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n }\\n },\\n \"child\": [\\n {\\n \"child_departure\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"child_deny\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"id\": \"#children_2_id#\",\\n \"subset_name\": \"南孩子\"\\n },\\n {\\n \"child_departure\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"child_deny\": {\\n \"has\": \"N\",\\n \"info\": \"\"\\n },\\n \"id\": \"#children_1_id#\",\\n \"subset_name\": \"吕孩子\"\\n }\\n ]\\n}', 'extract_data': None}"}], "start": 1693985087023, "stop": 1693985087189, "uuid": "3894781e-a179-4ba1-9581-ac3545b537ec", "historyId": "5b862728bc36d9ddb1089d3789e9341f", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "da860825-19ca-46ad-a1d5-ee4f32aacc95", "befores": [{"name": "case", "status": "passed", "start": 1693985070318, "stop": 1693985070318}], "start": 1693985070318, "stop": 1693985070765}
\ No newline at end of file
{"name": "test_talented_person[case5]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 6, 'title': '创建订单', 'method': 'post', 'url': '/presale/order-main-new/add', 'request_data': '{\\n \"group_id\": 1,\\n \"customer_id\": \"#customer_id#\",\\n \"type\": 1,\\n \"username\": \"#username#\",\\n \"company\": 2,\\n \"mobile\": 1817066290,\\n \"order_sn\": \"#order_sn#\",\\n \"email\": \"\",\\n \"sign_time\": \"2023-5-5\",\\n \"interview\": \"\",\\n \"sex\": 1,\\n \"attachment\": [\\n {\\n \"fileUrl\": \"https://upload.cdn.galaxy-immi.com/crm/test/files/1683254980664.pdf\",\\n \"fileName\": \"sample2.pdf\"\\n }\\n ],\\n \"synergy_user_id\": 0,\\n \"owner_user_id\":1,\\n \"commission\": \"\",\\n \"invoice_type\": 1,\\n \"invoice_remark\": \"\",\\n \"presale_product_list\": [\\n {\\n \"name\": \"香港优才(6.1万)全款盈河\",\\n \"price\": 61000.00,\\n \"third_fee\": 0.00,\\n \"remind_fee\": 20000.00,\\n \"top_discount_fee\": 12000.00,\\n \"product_discount_fee\": 0,\\n \"third_discount_fee\": 0,\\n \"is_main\": 1,\\n \"presale_product_id\": 403,\\n \"product_type\": \"优才\",\\n \"remark\": \"\"\\n }\\n ],\\n \"score\": 150,\\n \"is_new\": 1,\\n \"selectd_one\": 1,\\n \"selectd_two\": 1,\\n \"selectd_three\": 1,\\n \"remark_four\": 1,\\n \"business_type\": 1,\\n \"set_meal_id\": 0\\n}', 'extract_data': '{\"order_main_id\": \"$.data.id\"}'}"}], "start": 1693985067284, "stop": 1693985070316, "uuid": "884f7c4c-999b-455c-b171-8cea6c968e3c", "historyId": "f699db0620fb41b06bf5275c26768664", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case12]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 13, 'title': '分配客户', 'method': 'post', 'url': '/backend/order/task/handler?flow_task_id=73&plan_id=0', 'request_data': '{\\n \"order_id\": \"#order_id#\",\\n \"handler\": \\n {\\n \"copywriter\": 1,\\n \"business\": 1,\\n \"copywriter_manager\": 1,\\n \"service\": 1\\n },\\n \"is_copy_business\": 0\\n}', 'extract_data': None}"}], "start": 1693985078207, "stop": 1693985078624, "uuid": "f40932dc-b370-4ff0-bca7-6b82e4dc2a23", "historyId": "af0008fa110c9491bd74ff8ef6f9ce28", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"name": "test_talented_person[case13]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 14, 'title': '分配客户确认按钮', 'method': 'post', 'url': '/backend/order/task/complete?flow_task_id=73&plan_id=0&sf_request_type=ajax', 'request_data': '{\\n \"id\": #order_task_id#,\\n \"order_id\": #order_id#\\n}', 'extract_data': None}"}], "start": 1693985078627, "stop": 1693985084143, "uuid": "f6278080-664b-4883-b53f-ebbf783f6f9d", "historyId": "f4919ef887b579bd0a54aad332744d2e", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "aabdf20a-8884-43e0-bf78-badff759764f", "children": ["08d39ee1-7689-4aab-99eb-a9040d719857", "5c4dff37-feae-4cbc-b727-7cb37d768729", "4904b270-4f2f-4e11-b61b-87dc520b7cff", "f3ad02b7-327a-4446-821c-c96617abef80", "29898ef0-8425-434b-a43d-f4291bddcdc1", "884f7c4c-999b-455c-b171-8cea6c968e3c", "4f26ba72-cfd5-4f8e-a80f-789202836ae0", "a8af81ac-9dbb-4521-ad29-25a3a59663f3", "259c822d-3c8f-4794-8d5d-ae645c929df4", "d94c4f42-b50a-4dc3-84c0-709e114c76d8", "680d129b-960f-4ccb-ba79-22e1206dae55", "3438282e-cb5b-42cc-808a-6af8aa20dd27", "f40932dc-b370-4ff0-bca7-6b82e4dc2a23", "f6278080-664b-4883-b53f-ebbf783f6f9d", "10d464c7-31a1-4ad3-803c-a661c5b095a0", "df1b1b73-7204-4335-aa75-5fc796b6387e", "7caae6a6-c200-4c42-a9b0-d506725213fc", "bb775174-d610-4448-b00c-8eb2d351c211", "575448a1-2d64-4ff7-a3e5-05a3891d637d", "ba2ed9de-27f7-4430-bcc6-faad3bed61e1", "3894781e-a179-4ba1-9581-ac3545b537ec", "bf5c28db-9186-4998-a43d-770ef5d18e6b", "77f4b609-5fc8-419b-a9bf-40328fdd07c9", "28725231-c93b-473c-9a35-49c291a19290", "e4c9cc56-46b3-410a-b69e-ff70c8bbbe99", "df84fdc2-fc69-4bc9-a9a8-c8e59eadfcf1"], "befores": [{"name": "get_newPhone", "status": "passed", "start": 1693985064025, "stop": 1693985064066}], "afters": [{"name": "get_newPhone::0", "status": "passed", "start": 1693985091354, "stop": 1693985091354}], "start": 1693985064025, "stop": 1693985091354}
\ No newline at end of file
{"uuid": "53442ed3-cf2f-4457-b522-c4b7c6a8a5fe", "befores": [{"name": "case", "status": "passed", "start": 1693985066734, "stop": 1693985066734}], "start": 1693985066734, "stop": 1693985067042}
\ No newline at end of file
{"uuid": "01df7df9-71dc-4e38-983f-75ddb3f0c974", "befores": [{"name": "case", "status": "passed", "start": 1693985078627, "stop": 1693985078627}], "start": 1693985078627, "stop": 1693985084144}
\ No newline at end of file
{"uuid": "4f9948cf-5512-448b-a0ee-ec2525aa1d27", "befores": [{"name": "case", "status": "passed", "start": 1693985084555, "stop": 1693985084555}], "start": 1693985084555, "stop": 1693985084727}
\ No newline at end of file
{"name": "test_talented_person[case25]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 26, 'title': '提交资料', 'method': 'post', 'url': '/business/client/information/progress-bar', 'request_data': '{\\n \"next\": 0,\\n \"component\": \"Done\",\\n \"score_sum\": 105,\\n \"score_sum_real_time\": {\\n \"education_score_b\": {\\n \"result\": \"满足\",\\n \"answer\": true,\\n \"score\": 30\\n },\\n \"education_score_a\": {\\n \"result\": \"满足(1)\",\\n \"answer\": 2,\\n \"score\": 20\\n },\\n \"language_score\": {\\n \"result\": \"满足(2)\",\\n \"answer\": 2,\\n \"score\": 20\\n },\\n \"work_experience_score_c\": {\\n \"result\": \"不满足\",\\n \"answer\": false,\\n \"score\": 0\\n },\\n \"background_score_b\": {\\n \"result\": \"不满足\",\\n \"answer\": false,\\n \"score\": 0\\n },\\n \"work_experience_score_b\": {\\n \"result\": \"不满足\",\\n \"answer\": false,\\n \"score\": 0\\n },\\n \"background_score_c\": {\\n \"result\": \"满足\",\\n \"answer\": true,\\n \"score\": 5\\n },\\n \"work_experience_score_a\": {\\n \"result\": \"满足(1)\",\\n \"answer\": 1,\\n \"score\": 0\\n },\\n \"total_score\": {\\n \"result\": \"\",\\n \"score\": 105\\n },\\n \"talent_list_score\": {\\n \"result\": \"不满足\",\\n \"answer\": \"\",\\n \"score\": 0\\n },\\n \"age_score\": {\\n \"result\": \"年龄:33\",\\n \"answer\": 1,\\n \"score\": 30\\n },\\n \"background_score_a\": {\\n \"result\": \"不满足\",\\n \"answer\": false,\\n \"score\": 0\\n }\\n },\\n \"id\": \"#info_id#\",\\n \"order_id\": \"#order_id#\",\\n \"score_detail\": [\\n {\\n \"international_work_experience\": 0,\\n \"language\": 20,\\n \"talent_listing\": 0,\\n \"education_background\": 50,\\n \"family\": 5,\\n \"age\": 30,\\n \"work_experience\": 0\\n }\\n ],\\n \"component_base_schedule\": 7\\n}', 'extract_data': None}"}], "start": 1693985087950, "stop": 1693985091353, "uuid": "df84fdc2-fc69-4bc9-a9a8-c8e59eadfcf1", "historyId": "00dcc7e32319ea7c9ac397b196dc08b0", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
{"uuid": "44cd1480-ff75-4c5a-ba38-5fd840fe0a8a", "befores": [{"name": "case", "status": "passed", "start": 1693985086787, "stop": 1693985086787}], "start": 1693985086787, "stop": 1693985087021}
\ No newline at end of file
{"uuid": "b8b47a67-9e3b-4fdd-843e-722d9a7a177c", "befores": [{"name": "case", "status": "passed", "start": 1693985084475, "stop": 1693985084475}], "start": 1693985084475, "stop": 1693985084553}
\ No newline at end of file
{"name": "test_talented_person[case11]", "status": "passed", "parameters": [{"name": "case", "value": "{'id': 12, 'title': '查询订单分配信息', 'method': 'get', 'url': '/backend/order/task/handler/?order_id=#order_id#', 'request_data': None, 'extract_data': None}"}], "start": 1693985077969, "stop": 1693985078205, "uuid": "3438282e-cb5b-42cc-808a-6af8aa20dd27", "historyId": "b8e2afe111a2d7732128827d6d048541", "testCaseId": "ef55938d36fbad49876f2088544970c8", "fullName": "TestCases.test_talented_Person.TestTalentedPerson#test_talented_person", "labels": [{"name": "tag", "value": "@pytest.mark.usefixtures('get_newPhone')"}, {"name": "parentSuite", "value": "TestCases"}, {"name": "suite", "value": "test_talented_Person"}, {"name": "subSuite", "value": "TestTalentedPerson"}, {"name": "host", "value": "PC-20230211OWWC"}, {"name": "thread", "value": "10892-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "TestCases.test_talented_Person"}]}
\ No newline at end of file
"""
前置后置类
"""
import pytest
import json
import os
from Common.handle_requests import send_request
from Common.handle_excel import HandleExcel
from Common.my_logger import logger
from Common.handle_path import datas_dir
from Common.handle_db import HandleDB
from Common.handle_data import replace_case_by_regular
from Common.handle_phone import get_new_phone
# from interface.Common.handle_config import conf
from Common.handle_envdata import EnvData
class TestRegister:
exc = HandleExcel(os.path.join(datas_dir, 'api_cases.xlsx'), "注册")
cases = exc.read_all_datas()
exc.close_file()
@pytest.mark.parametrize("case", cases)
def test_register(self, case):
logger.info("********** 执行用例{}:{} **********".format(case["id"], case["title"]))
# 获取到测试用例中需要替换的占位符
if case["request_data"].find("#mobile_phone") != -1:
if case["id"] != 9:
mobile_phone = get_new_phone()
# 把注册成功的手机号和密码写入到配置文件中,给登录用 方法二
setattr(EnvData, "mobile_phone", mobile_phone)
setattr(EnvData, "pwd", json.loads(case["request_data"])["pwd"])
# 替换Excel中几条成功注册用例的手机号码,实现动态(方法二)
case = replace_case_by_regular(case)
# 使用excel中第一条用例
# if case["id"] == 1:
# # 把注册成功的手机号写入到配置文件中,给登录用 方法一
# conf.write_data("userInfo", "mobile_phone", new_phone)
# # 获取到注册成功的密码,把密码写入配置文件中
# pwd = json.loads(case["request_data"])["pwd"]
# conf.write_data("userInfo", "pwd", pwd)
# 替换Excel中几条成功注册用例的手机号码,实现动态(方法一)
# if case["request_data"].find("#new_phone") != -1:
# new_phone = get_new_phone()
# case = replace_mark_with_data(case, "#new_phone#", str(new_phone))
# 将数据格式由字符转化成字典
expected = eval(case["expected"])
# 步骤 测试数据
res = send_request(case["method"], case["url"], case["request_data"])
logger.info("期望结果为:{}".format(case["expected"]))
# 断言
try:
# self.assertEqual(expected["code"], res.json()["code"])
assert expected["code"] == res.json()["code"]
# self.assertEqual(expected["msg"], res.json()["msg"])
assert expected["msg"] == res.json()["msg"]
# 如果check_sql有值,需要对数据库进行校验
if case["check_sql"]:
db = HandleDB()
result = db.select_one_data(case["check_sql"])
db.close()
# self.assertIsNotNone(result)
assert result
except AssertionError:
logger.exception("断言失败,用例不通过!")
raise
else:
logger.exception("断言成功,用例通过!")
import pytest
from Common.handle_excel import HandleExcel
from Common.handle_path import datas_dir
from Common.my_logger import logger
from Common.handle_phone import get_new_phone
from Common.handle_data import replace_case_by_regular
from Common.handle_envdata import EnvData
from Common.handle_requests import send_request
from Common.handle_extract_data_from_response import extract_data_from_response
@pytest.fixture(scope="class")
def get_newPhone():
logger.info("************ 优才流程 开始执行 ***************")
# 获取手机号码
mobile = get_new_phone()
# 设置手机号码为全局变量
setattr(EnvData, "mobile", mobile)
# setattr(EvnData, "username", "赵六")
# setattr(EvnData, "copywriter_id", 1391)
yield
logger.info("************ 优才流程 执行结束 ***************")
@pytest.mark.usefixtures("get_newPhone")
class TestTalentedPerson:
# 第一步,读取excel中的数据
exc = HandleExcel(datas_dir + "\\接口业务流.xlsx", "优才")
cases = exc.read_all_datas()
# 关闭excel
exc.close_file()
print(cases)
# # 如果存在distribution变量,说明该订单被分配了,需要跳过分配客户接口
if hasattr(EnvData, "distribution"):
del cases[12:15]
@pytest.mark.parametrize("case", cases)
def test_talented_person(self, case):
logger.info("********** 执行用例{}:{} **********".format(case["id"], case["title"]))
# 第二步,替换request_data中的未知数
case = replace_case_by_regular(case)
# print(case)
# 第三步,执行请求
if hasattr(EnvData, "token"):
response = send_request(case["method"], case["url"], case["request_data"], token=getattr(EnvData, "token"))
else:
response = send_request(case["method"], case["url"], case["request_data"])
# 第四步,将extract_data中表达式的值设置为全局变量
if case["extract_data"]:
extract_data_from_response(case["extract_data"], response.json())
# 断言
import pytest
if __name__ == '__main__':
pytest.main(["-s", "-v", "--alluredir=Outputs/reports"])
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment