优化测试脚本。

This commit is contained in:
aaronchenyongzhi 2023-06-25 22:34:30 +08:00
parent 7e8bdaf3ef
commit 5de7e8b3cd
112 changed files with 4896 additions and 8171 deletions

View File

@ -2,9 +2,10 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="jdk" jdkName="Python 3.9 (2)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PackageRequirementsSettings">

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="PY-231.8770.66">
<component name="dataSourceStorageLocal" created-in="PY-231.9011.38">
<data-source name="@localhost" uuid="49b6f686-3676-4df5-9645-cd7a2fe91d80">
<database-info product="MySQL" version="8.0.26" jdbc-version="4.2" driver-name="MySQL Connector/J" driver-version="mysql-connector-java-8.0.25 (Revision: 08be9e9b4cba6aa115f9b27b215887af40b159e0)" dbms="MYSQL" exact-version="8.0.26" exact-driver-version="8.0">
<extra-name-characters>#@</extra-name-characters>

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<dataSource name="@localhost">
<database-model serializer="dbm" dbms="MYSQL" family-id="MYSQL" format-version="4.48">
<root id="1">
<DefaultCasing>lower/lower</DefaultCasing>
<DefaultEngine>InnoDB</DefaultEngine>
<DefaultTmpEngine>InnoDB</DefaultTmpEngine>
<ServerVersion>8.0.26</ServerVersion>
</root>
<schema id="2" parent="1" name="api_">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="3" parent="1" name="back">
<CollationName>utf8mb4_general_ci</CollationName>
</schema>
<schema id="4" parent="1" name="class">
<CollationName>utf8mb4_general_ci</CollationName>
</schema>
<schema id="5" parent="1" name="dev_testplatform">
<CollationName>utf8_general_ci</CollationName>
</schema>
<schema id="6" parent="1" name="do_mysql">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="7" parent="1" name="information_schema">
<CollationName>utf8_general_ci</CollationName>
</schema>
<schema id="8" parent="1" name="mydatabase">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="9" parent="1" name="mysql">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="10" parent="1" name="performance_schema">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="11" parent="1" name="qaplatform">
<CollationName>utf8_general_ci</CollationName>
</schema>
<schema id="12" parent="1" name="sys">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
<schema id="13" parent="1" name="yytest">
<CollationName>utf8_general_ci</CollationName>
</schema>
<schema id="14" parent="1" name="yytests">
<CollationName>utf8mb4_0900_ai_ci</CollationName>
</schema>
</database-model>
</dataSource>

View File

@ -3,7 +3,6 @@
<component name="Encoding">
<file url="" charset="UTF-8" />
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/dd327101-360a-4ce3-a39e-0a30a298d5cf/console.sql" charset="US-ASCII" />
<file url="file://$PROJECT_DIR$/OutPut/Log/api_2020-05-31.log" charset="GBK" />
<file url="file://$PROJECT_DIR$/cases/booking/json_file/ai/ai_sql.json" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/cases/booking/json_file/safe.json" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/cases/booking/json_file/wifi/clear_wifi_data.json" charset="UTF-8" />
@ -15,6 +14,7 @@
<file url="file://$PROJECT_DIR$/common/validation/validator.py" charset="US-ASCII" />
<file url="file://$PROJECT_DIR$/config/questionnaire_sql.sql" charset="GBK" />
<file url="file://$PROJECT_DIR$/html_script/javas.js" charset="US-ASCII" />
<file url="file://$PROJECT_DIR$/output/log/api_2020-05-31.log" charset="GBK" />
<file url="file://$PROJECT_DIR$/temp/sjk.py" charset="US-ASCII" />
<file url="file://$PROJECT_DIR$/test_d/day_four.txt" charset="GBK" />
<file url="file://$PROJECT_DIR$/test_d/t" charset="UTF-8" />

View File

@ -19,6 +19,22 @@
</SchemaInfo>
</value>
</entry>
<entry key="JSON 架构版本 4">
<value>
<SchemaInfo>
<option name="name" value="JSON 架构版本 4" />
<option name="relativePathToSchema" value="http://json-schema.org/draft-04/schema" />
<option name="applicationDefined" value="true" />
<option name="patterns">
<list>
<Item>
<option name="path" value="output/reports/history.json" />
</Item>
</list>
</option>
</SchemaInfo>
</value>
</entry>
</map>
</state>
</component>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (api-test-project)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (2)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>

14
.idea/webResources.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WebResourcesPaths">
<contentEntries>
<entry url="file://$PROJECT_DIR$">
<entryData>
<resourceRoots>
<path value="file://$PROJECT_DIR$" />
</resourceRoots>
</entryData>
</entry>
</contentEntries>
</component>
</project>

View File

@ -1,222 +0,0 @@
2023-06-14 09:00:15 | DEBUG | key:{{get_timestamp()}},替换结果为--> 1686704415458
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(7, 16), match='{{var_a}}'>,替换结果为--> foo
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(25, 34), match='{{var_c}}'>,替换结果为--> 123
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(37, 46), match='{{var_d}}'>,替换结果为--> None
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(51, 62), match='{{var_e_1}}'>,替换结果为--> True
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(59, 70), match='{{var_e_2}}'>,替换结果为--> bar
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(73, 85), match='{{var_f}}[1]'>,替换结果为--> False
2023-06-14 09:00:15 | DEBUG | key:<re.Match object; span=(87, 96), match='{{var_g}}'>,替换结果为--> {'g': 'gg', 'g1': 'gg', 'g2': 'gg2'}
2023-06-14 09:07:34 | INFO | 开始加载内置方法...
2023-06-14 09:07:34 | INFO | 内置方法加载完成
2023-06-14 09:07:34 | INFO | 所有用例执行开始...
2023-06-14 09:07:34 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 09:07:35 | INFO | 暂停:1
2023-06-14 09:07:35 | INFO | sql 执行成功:None
2023-06-14 09:07:35 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:07:35 | DEBUG | key:<re.Match object; span=(144, 155), match='{{account}}'>,替换结果为--> 18127813600
2023-06-14 09:07:35 | DEBUG | key:<re.Match object; span=(175, 185), match='{{passwd}}'>,替换结果为--> WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=
2023-06-14 09:07:35 | INFO | -----------分割线-----------
2023-06-14 09:07:35 | INFO | 调用 wrapper args: ('https://bimdc.bzlrobot.com/bsp/test/user/ugs', '/auth/loginByNotBip', 'post'); kwargs:{'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-14 09:07:35 | ERROR | wrapper: 请求异常
2023-06-14 09:07:35 | INFO | -----------分割线-----------
2023-06-14 09:07:35 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
'NoneType' object has no attribute 'json'
2023-06-14 09:07:35 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 09:07:37 | INFO | 暂停:2
2023-06-14 09:07:37 | INFO | sql 执行成功:None
2023-06-14 09:07:37 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
2023-06-14 09:07:37 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
2023-06-14 09:07:40 | INFO | 暂停:3
2023-06-14 09:07:40 | INFO | sql 执行成功:None
2023-06-14 09:07:40 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
2023-06-14 09:07:40 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
2023-06-14 09:07:40 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 09:07:40 | INFO | 所有用例执行完毕
2023-06-14 09:10:15 | INFO | -----------分割线-----------
2023-06-14 09:10:15 | INFO | 调用 wrapper args: ('', 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip', 'post'); kwargs:{'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-14 09:10:15 | ERROR | wrapper: 请求异常
2023-06-14 09:10:15 | INFO | -----------分割线-----------
2023-06-14 09:11:52 | INFO | -----------分割线-----------
2023-06-14 09:11:52 | INFO | 调用 wrapper args: ('', 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip', 'post'); kwargs:{'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-14 09:11:52 | INFO | 发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-14 09:11:52 | ERROR | wrapper: 请求异常
2023-06-14 09:11:52 | INFO | -----------分割线-----------
2023-06-14 09:16:29 | INFO | 发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-14 09:16:29 | ERROR | 发送请求失败
2023-06-14 09:20:41 | INFO | 开始加载内置方法...
2023-06-14 09:20:41 | INFO | 内置方法加载完成
2023-06-14 09:20:41 | INFO | 所有用例执行开始...
2023-06-14 09:20:41 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 09:20:42 | INFO | 暂停:1
2023-06-14 09:20:42 | INFO | sql 执行成功:None
2023-06-14 09:20:42 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:20:42 | DEBUG | key:<re.Match object; span=(144, 155), match='{{account}}'>,替换结果为--> 18127813600
2023-06-14 09:20:42 | DEBUG | key:<re.Match object; span=(175, 185), match='{{passwd}}'>,替换结果为--> WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=
2023-06-14 09:20:42 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
'str' object has no attribute 'read'
2023-06-14 09:20:42 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 09:20:44 | INFO | 暂停:2
2023-06-14 09:20:44 | INFO | sql 执行成功:None
2023-06-14 09:20:44 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
2023-06-14 09:20:44 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
2023-06-14 09:20:47 | INFO | 暂停:3
2023-06-14 09:20:47 | INFO | sql 执行成功:None
2023-06-14 09:20:47 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
2023-06-14 09:20:47 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
2023-06-14 09:20:47 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 09:20:47 | INFO | 所有用例执行完毕
2023-06-14 09:22:15 | INFO | 开始加载内置方法...
2023-06-14 09:22:15 | INFO | 内置方法加载完成
2023-06-14 09:22:15 | INFO | 所有用例执行开始...
2023-06-14 09:22:15 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 09:22:16 | INFO | 暂停:1
2023-06-14 09:22:16 | INFO | sql 执行成功:None
2023-06-14 09:22:16 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:22:16 | DEBUG | key:<re.Match object; span=(144, 155), match='{{account}}'>,替换结果为--> 18127813600
2023-06-14 09:22:16 | DEBUG | key:<re.Match object; span=(175, 185), match='{{passwd}}'>,替换结果为--> WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=
2023-06-14 09:22:16 | INFO | 发送请求的参数: {'json': '"{\\"account\\": \\"18127813600\\", \\"password\\": \\"WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=\\"}"', 'headers': '"{\\"Content-Type\\": \\"application/json\\"}"'}
2023-06-14 09:22:16 | ERROR | 发送请求失败
2023-06-14 09:22:16 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
'NoneType' object has no attribute 'json'
2023-06-14 09:22:16 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 09:22:18 | INFO | 暂停:2
2023-06-14 09:22:18 | INFO | sql 执行成功:None
2023-06-14 09:22:18 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
2023-06-14 09:22:18 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
2023-06-14 09:22:21 | INFO | 暂停:3
2023-06-14 09:22:21 | INFO | sql 执行成功:None
2023-06-14 09:22:21 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
2023-06-14 09:22:21 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
2023-06-14 09:22:21 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 09:22:21 | INFO | 所有用例执行完毕
2023-06-14 09:22:43 | INFO | 开始加载内置方法...
2023-06-14 09:22:43 | INFO | 内置方法加载完成
2023-06-14 09:22:43 | INFO | 所有用例执行开始...
2023-06-14 09:22:43 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 09:22:44 | INFO | 暂停:1
2023-06-14 09:22:44 | INFO | sql 执行成功:None
2023-06-14 09:22:44 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:22:44 | DEBUG | key:<re.Match object; span=(144, 155), match='{{account}}'>,替换结果为--> 18127813600
2023-06-14 09:22:44 | DEBUG | key:<re.Match object; span=(175, 185), match='{{passwd}}'>,替换结果为--> WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=
2023-06-14 09:22:44 | INFO | 发送请求的参数: {'json': {'account': '18127813600', 'password': 'WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8='}, 'headers': {'Content-Type': 'application/json'}}
2023-06-14 09:22:44 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-14 09:22:44 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-14 09:22:44 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-14 09:22:44 | INFO | 接口状态--> 200
2023-06-14 09:22:44 | INFO | 接口耗时--> 0:00:00.112620
2023-06-14 09:22:44 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216867057644774394","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"1af14a7801292e24e82adfeac1d56711","type":"user","avatar":null,"ncAccount":null,"timestamp":1686705764,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-14 09:22:44 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:22:44 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 09:22:46 | INFO | 暂停:2
2023-06-14 09:22:46 | INFO | sql 执行成功:None
2023-06-14 09:22:46 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
2023-06-14 09:22:46 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
2023-06-14 09:22:49 | INFO | 暂停:3
2023-06-14 09:22:49 | INFO | sql 执行成功:None
2023-06-14 09:22:49 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
2023-06-14 09:22:49 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
2023-06-14 09:22:49 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 09:22:49 | INFO | 所有用例执行完毕
2023-06-14 09:29:22 | INFO | 开始加载内置方法...
2023-06-14 09:29:22 | INFO | 内置方法加载完成
2023-06-14 09:29:22 | INFO | 所有用例执行开始...
2023-06-14 09:29:22 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 09:29:23 | INFO | 暂停:1
2023-06-14 09:29:23 | INFO | sql 执行成功:None
2023-06-14 09:29:23 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:29:23 | DEBUG | key:<re.Match object; span=(144, 155), match='{{account}}'>,替换结果为--> 18127813600
2023-06-14 09:29:23 | DEBUG | key:<re.Match object; span=(175, 185), match='{{passwd}}'>,替换结果为--> WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=
2023-06-14 09:29:23 | INFO | 发送请求的参数: {'json': {'account': '18127813600', 'password': 'WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8='}, 'headers': {'Content-Type': 'application/json'}}
2023-06-14 09:29:23 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-14 09:29:23 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-14 09:29:23 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-14 09:29:23 | INFO | 接口状态--> 200
2023-06-14 09:29:23 | INFO | 接口耗时--> 0:00:00.046278
2023-06-14 09:29:23 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216867061638325565","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"067f28eace3091dac4d737cc21853073","type":"user","avatar":null,"ncAccount":null,"timestamp":1686706163,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-14 09:29:23 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 09:29:23 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 09:29:25 | INFO | 暂停:2
2023-06-14 09:29:25 | INFO | sql 执行成功:None
2023-06-14 09:29:26 | DEBUG | key:{{get_timestamp()}},替换结果为--> 1686706166969
2023-06-14 09:29:26 | DEBUG | key:{{random_string()}},替换结果为--> ekFQPupXHyocLZHBphzp
2023-06-14 09:29:26 | DEBUG | key:<re.Match object; span=(178, 191), match='{{BSP_TOKEN}}'>,替换结果为--> 067f28eace3091dac4d737cc21853073
2023-06-14 09:29:26 | DEBUG | key:<re.Match object; span=(235, 254), match='{{BSP_USER_TENANT}}'>,替换结果为--> 216260762345772077
2023-06-14 09:29:26 | DEBUG | key:<re.Match object; span=(293, 306), match='{{projectId}}'>,替换结果为--> 104966
2023-06-14 09:29:26 | INFO | 发送请求的参数: {'json': {'projectId': '104966', 'tvSequence': 'ekFQPupXHyocLZHBphzp'}, 'headers': {'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '067f28eace3091dac4d737cc21853073', 'BSP_USER_TENANT': '216260762345772077'}}
2023-06-14 09:29:27 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686706166969
2023-06-14 09:29:27 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '067f28eace3091dac4d737cc21853073', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
2023-06-14 09:29:27 | INFO | 请求 body --> b'{"projectId": "104966", "tvSequence": "ekFQPupXHyocLZHBphzp"}'
2023-06-14 09:29:27 | INFO | 接口状态--> 200
2023-06-14 09:29:27 | INFO | 接口耗时--> 0:00:00.140836
2023-06-14 09:29:27 | INFO | 接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
2023-06-14 09:29:30 | INFO | 暂停:3
2023-06-14 09:29:30 | INFO | sql 执行成功:None
2023-06-14 09:29:30 | DEBUG | key:{{get_timestamp()}},替换结果为--> 1686706170184
2023-06-14 09:29:30 | DEBUG | key:<re.Match object; span=(101, 114), match='{{projectId}}'>,替换结果为--> 104966
2023-06-14 09:29:30 | DEBUG | key:<re.Match object; span=(191, 204), match='{{BSP_TOKEN}}'>,替换结果为--> 067f28eace3091dac4d737cc21853073
2023-06-14 09:29:30 | DEBUG | key:<re.Match object; span=(248, 267), match='{{BSP_USER_TENANT}}'>,替换结果为--> 216260762345772077
2023-06-14 09:29:30 | ERROR | 异常用例: 安全纯净大屏_5_劳务基础配置_查询配置
the JSON object must be str, bytes or bytearray, not NoneType
2023-06-14 09:29:30 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 09:29:30 | INFO | 所有用例执行完毕
2023-06-14 10:02:15 | INFO | 开始加载内置方法...
2023-06-14 10:02:15 | INFO | 内置方法加载完成
2023-06-14 10:02:15 | INFO | 所有用例执行开始...
2023-06-14 10:02:15 | INFO | 测试用例:1 不执行,跳过!!!
2023-06-14 10:02:16 | INFO | 暂停:1
2023-06-14 10:02:16 | INFO | sql 执行成功:None
2023-06-14 10:02:16 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 10:02:16 | INFO | 发送请求的参数: {'json': {'account': '18127813600', 'password': 'WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8='}, 'headers': {'Content-Type': 'application/json'}}
2023-06-14 10:02:16 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-14 10:02:16 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-14 10:02:16 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-14 10:02:16 | INFO | 接口状态--> 200
2023-06-14 10:02:16 | INFO | 接口耗时--> 0:00:00.045090
2023-06-14 10:02:16 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216867081364615400","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"c22c556c2ac0fdb3f1f09b682665d8d8","type":"user","avatar":null,"ncAccount":null,"timestamp":1686708136,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-14 10:02:16 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
2023-06-14 10:02:16 | INFO | 测试用例:3 不执行,跳过!!!
2023-06-14 10:02:18 | INFO | 暂停:2
2023-06-14 10:02:18 | INFO | sql 执行成功:None
2023-06-14 10:02:18 | INFO | 发送请求的参数: {'json': {'projectId': '104966', 'tvSequence': 'lsrpNLyTNkvxtVnfgaMU'}, 'headers': {'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'c22c556c2ac0fdb3f1f09b682665d8d8', 'BSP_USER_TENANT': '216260762345772077'}}
2023-06-14 10:02:18 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686708138496
2023-06-14 10:02:18 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'c22c556c2ac0fdb3f1f09b682665d8d8', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
2023-06-14 10:02:18 | INFO | 请求 body --> b'{"projectId": "104966", "tvSequence": "lsrpNLyTNkvxtVnfgaMU"}'
2023-06-14 10:02:18 | INFO | 接口状态--> 200
2023-06-14 10:02:18 | INFO | 接口耗时--> 0:00:00.046031
2023-06-14 10:02:18 | INFO | 接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
2023-06-14 10:02:21 | INFO | 暂停:3
2023-06-14 10:02:21 | INFO | sql 执行成功:None
2023-06-14 10:02:21 | INFO | 发送请求的参数: {'params': {}, 'headers': {'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'c22c556c2ac0fdb3f1f09b682665d8d8', 'BSP_USER_TENANT': '216260762345772077'}}
2023-06-14 10:02:21 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686708141588&projectId=104966
2023-06-14 10:02:21 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'c22c556c2ac0fdb3f1f09b682665d8d8', 'BSP_USER_TENANT': '216260762345772077'}
2023-06-14 10:02:21 | INFO | 请求 body --> None
2023-06-14 10:02:21 | INFO | 接口状态--> 200
2023-06-14 10:02:21 | INFO | 接口耗时--> 0:00:00.014343
2023-06-14 10:02:21 | INFO | 接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
2023-06-14 10:02:21 | INFO | 测试用例:None 不执行,跳过!!!
2023-06-14 10:02:21 | INFO | 所有用例执行完毕
2023-06-14 10:58:33 | INFO | -----------分割线-----------
2023-06-14 10:58:33 | INFO | 调用 get_init args: ('D:\\apk_api\\api-test-project\\cases\\cases\\test_api.xlsx',); kwargs:{}
2023-06-14 10:58:33 | INFO | 读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 10:58:33 | ERROR | get_init: 读取excel中初始化数据异常
2023-06-14 10:58:33 | INFO | -----------分割线-----------
2023-06-14 15:16:14 | INFO | -----------分割线-----------
2023-06-14 15:16:14 | INFO | 调用 get_init args: ('D:\\apk_api\\api-test-project\\cases\\cases\\test_api.xlsx',); kwargs:{}
2023-06-14 15:16:14 | INFO | 读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 15:16:14 | ERROR | get_init: 读取excel中初始化数据异常
2023-06-14 15:16:14 | INFO | -----------分割线-----------
2023-06-14 15:31:37 | INFO | -----------分割线-----------
2023-06-14 15:31:37 | INFO | 调用 get_init args: ('D:\\apk_api\\api-test-project\\cases\\cases\\test_api.xlsx',); kwargs:{}
2023-06-14 15:31:37 | INFO | 读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 15:31:37 | ERROR | get_init: 读取excel中初始化数据异常
2023-06-14 15:31:37 | INFO | -----------分割线-----------
2023-06-14 15:38:43 | INFO | -----------分割线-----------
2023-06-14 15:38:43 | INFO | 调用 get_init args: ('D:\\apk_api\\api-test-project\\cases\\cases\\test_api.xlsx',); kwargs:{}
2023-06-14 15:38:43 | INFO | 读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 15:38:43 | ERROR | get_init: 读取excel中初始化数据异常
2023-06-14 15:38:43 | INFO | -----------分割线-----------
2023-06-14 15:39:38 | INFO | -----------分割线-----------
2023-06-14 15:39:38 | INFO | 调用 get_init args: ('D:\\apk_api\\api-test-project\\cases\\cases\\test_api.xlsx',); kwargs:{}
2023-06-14 15:39:38 | INFO | 读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 15:39:38 | INFO | 如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 15:39:38 | INFO | get_init 返回结果:(<common.file_handling.do_excel.DoExcel object at 0x00000251E9E1D070>, {'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, <generator object DoExcel.do_excel_yield at 0x00000251E9EBAF90>), 耗时0.063443s

View File

@ -1,16 +0,0 @@
2023-06-14 00:08:46,943-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:19:39,516-ERROR-logger.py-[ line:62 ] - 日志信息:读取excel中初始化数据异常: [Errno 13] Permission denied: 'E:\\apitest\\cases\\cases\\test_api.xlsx'
2023-06-14 00:19:48,595-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:20:44,275-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:39:08,077-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:44:35,123-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:46:45,060-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 00:49:39,814-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
2023-06-14 08:45:56,530-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 08:49:55,988-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 09:07:34,476-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 09:20:41,220-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 09:22:15,890-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 09:22:43,314-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 09:29:22,724-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
2023-06-14 10:02:15,360-ERROR-logger.py-[ line:62 ] - 日志信息:数据库链接失败: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

View File

@ -1,42 +0,0 @@
2023-06-14 00:08:45,463-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:08:46,939-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:19:39,451-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:19:48,462-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:19:48,592-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:20:44,126-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:20:44,272-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:39:07,923-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:39:08,074-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:44:34,963-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:44:35,120-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:46:44,898-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:46:45,057-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 00:49:39,647-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-14 00:49:39,811-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 08:45:56,149-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 08:45:56,237-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 08:49:55,857-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 08:49:55,925-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 08:53:35,934-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 08:54:09,976-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 08:58:07,947-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 08:59:43,895-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 09:00:15,458-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 09:07:34,356-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 09:07:34,432-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 09:20:41,117-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 09:20:41,179-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 09:22:15,783-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 09:22:15,849-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 09:22:43,212-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 09:22:43,272-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 09:29:22,621-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 09:29:22,682-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 09:29:25,887-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 09:29:30,184-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 09:29:30,187-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-14 10:02:15,256-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-14 10:02:15,318-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-14 10:02:18,495-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 10:02:21,587-INFO-logger.py-[ line:64 ] - 日志信息:执行方法get_timestamp(13)
2023-06-14 10:02:21,589-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None

File diff suppressed because one or more lines are too long

View File

@ -1,470 +0,0 @@
2023-06-16 16:26:50 | INFO | -----------分割线-----------
2023-06-16 16:26:50 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{}
2023-06-16 16:26:50 | INFO | -----------分割线-----------
2023-06-16 16:26:50 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{}
2023-06-16 16:26:50 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000028s
2023-06-16 16:26:50 | INFO | | end called clear_date | return清空指定 sheet 中的单元格成功, duration0.035544s
2023-06-16 16:26:50 | INFO | -----------分割线-----------
2023-06-16 16:26:50 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{}
2023-06-16 16:26:50 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000028s
2023-06-16 16:26:50 | INFO | -----------分割线-----------
2023-06-16 16:26:50 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-16 16:26:50 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x000001FDEA13DB80>, 'lt': <function lt at 0x000001FDEA157AF0>, 'lte': <function lte at 0x000001FDEA157CA0>, 'gt': <function gt at 0x000001FDEA157D30>, 'gte': <function gte at 0x000001FDEA157DC0>, 'neq': <function neq at 0x000001FDEA157E50>, 'str_eq': <function str_eq at 0x000001FDEA157EE0>, 'length_eq': <function length_eq at 0x000001FDEA157F70>, 'length_gt': <function length_gt at 0x000001FDEA160040>, 'length_gte': <function length_gte at 0x000001FDEA1600D0>, 'length_lt': <function length_lt at 0x000001FDEA160160>, 'length_lte': <function length_lte at 0x000001FDEA1601F0>, 'contains': <function contains at 0x000001FDEA160280>, 'contained_by': <function contained_by at 0x000001FDEA160310>, 'type_match': <function type_match at 0x000001FDEA1603A0>, 'regex_match': <function regex_match at 0x000001FDEA160430>, 'regex_search': <function regex_search at 0x000001FDEA1604C0>, 'startswith': <function startswith at 0x000001FDEA160550>, 'endswith': <function endswith at 0x000001FDEA1605E0>}, duration0.000009s
2023-06-16 16:26:52 | INFO | -----------分割线-----------
2023-06-16 16:26:52 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{}
2023-06-16 16:26:52 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000031s
2023-06-16 16:26:52 | INFO | -----------分割线-----------
2023-06-16 16:26:52 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:26:52 | INFO | -----------分割线-----------
2023-06-16 16:26:52 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:26:52 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x000001FDE9AB74C0>, 'get_current_date': <function get_current_date at 0x000001FDFF7714C0>, 'get_current_time': <function get_current_time at 0x000001FDFF7715E0>, 'get_delta_time': <function get_delta_time at 0x000001FDFF771700>, 'md5_encryption': <function md5_encryption at 0x000001FDFF771820>, 'json_dumps': <function json_dumps at 0x000001FDFF771A60>, 'json_loads': <function json_loads at 0x000001FDFF771B80>, 'list_slice': <function list_slice at 0x000001FDFF771D30>, 'sublist': <function sublist at 0x000001FDFF771E50>, 'random_choice': <function random_choice at 0x000001FDFF82F040>, 'gen_random_num': <function gen_random_num at 0x000001FDFF82F160>, 'gen_random_str': <function gen_random_str at 0x000001FDFF82F280>, 'regex_extract': <function regex_extract at 0x000001FDFF82F4C0>, 'substr': <function substr at 0x000001FDFF82F700>, 'str_join': <function str_join at 0x000001FDFF82F820>, 'get_timestamp': <function get_timestamp at 0x000001FDFF82F9D0>, 'ms_fmt_hms': <function ms_fmt_hms at 0x000001FDFF82FAF0>, 'random_phone': <function random_phone at 0x000001FDFED95EE0>, 'random_gps': <function random_gps at 0x000001FDFF82FCA0>, 'random_string': <function random_string at 0x000001FDFED95AF0>, 'random_ssn': <function random_ssn at 0x000001FDFED95E50>, 'random_email': <function random_email at 0x000001FDFFD70160>, 'random_id_card': <function random_id_card at 0x000001FDFED95F70>, 'random_int': <function random_int at 0x000001FDFFD70280>, 'random_male_name': <function random_male_name at 0x000001FDFFD700D0>, 'random_female_name': <function random_female_name at 0x000001FDFFD70040>, 'random_current_time': <function random_current_time at 0x000001FDFFD701F0>}, duration0.000012s
2023-06-16 16:26:52 | INFO | | end called set_bif_fun | returnNone, duration0.001391s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, '') kwargs:{}
2023-06-16 16:26:53 | INFO | | end called replace_dependent_parameter | return, duration0.000002s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:53 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000917s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:53 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000052s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDEA0E73A0>,) kwargs:{'jp_dict': None}
2023-06-16 16:26:53 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-16 16:26:53 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000003s
2023-06-16 16:26:53 | INFO | 发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-16 16:26:53 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-16 16:26:53 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-16 16:26:53 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-16 16:26:53 | INFO | 接口状态--> 200
2023-06-16 16:26:53 | INFO | 接口耗时--> 0:00:00.050646
2023-06-16 16:26:53 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216869040140585698","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"6525479242e52630522c705bb56aaddd","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904014,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDEA11A640>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-16 16:26:53 | INFO | | end called substitute_data | returnNone, duration0.013414s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:26:53 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000765s
2023-06-16 16:26:53 | INFO | -----------分割线-----------
2023-06-16 16:26:53 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216869040140585698","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"6525479242e52630522c705bb56aaddd","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904014,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:26:54 | INFO | | end called write_back | returnNone, duration0.032596s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, '') kwargs:{}
2023-06-16 16:26:56 | INFO | | end called replace_dependent_parameter | return, duration0.000001s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:56 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000607s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:26:56 | INFO | | end called get_timestamp | return1686904016036, duration0.000004s
2023-06-16 16:26:56 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904016036', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"fpAlfihzmPKmPKvBWwTx"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001684s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDFF74BB80>,) kwargs:{'jp_dict': None}
2023-06-16 16:26:56 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"fpAlfihzmPKmPKvBWwTx"}') kwargs:{}
2023-06-16 16:26:56 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"fpAlfihzmPKmPKvBWwTx"}'), duration0.000003s
2023-06-16 16:26:56 | INFO | 发送请求的参数: {'json': '{"projectId":"104966","tvSequence":"fpAlfihzmPKmPKvBWwTx"}', 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:26:56 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904016036
2023-06-16 16:26:56 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '6525479242e52630522c705bb56aaddd', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
2023-06-16 16:26:56 | INFO | 请求 body --> b'{"projectId": "104966", "tvSequence": "fpAlfihzmPKmPKvBWwTx"}'
2023-06-16 16:26:56 | INFO | 接口状态--> 200
2023-06-16 16:26:56 | INFO | 接口耗时--> 0:00:00.041383
2023-06-16 16:26:56 | INFO | 接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDFF2BF250>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-16 16:26:56 | INFO | | end called substitute_data | returnNone, duration0.005824s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:26:56 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000557s
2023-06-16 16:26:56 | INFO | -----------分割线-----------
2023-06-16 16:26:56 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:26:56 | INFO | | end called write_back | returnNone, duration0.032396s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, '') kwargs:{}
2023-06-16 16:26:59 | INFO | | end called replace_dependent_parameter | return, duration0.000001s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:59 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000485s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FDFF7908E0>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:26:59 | INFO | | end called get_timestamp | return1686904019139, duration0.000003s
2023-06-16 16:26:59 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904019139&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001265s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDEA11A640>,) kwargs:{'jp_dict': None}
2023-06-16 16:26:59 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-16 16:26:59 | INFO | | end called substitute_data | return{}, duration0.000395s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-16 16:26:59 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000002s
2023-06-16 16:26:59 | INFO | 发送请求的参数: {'params': None, 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"6525479242e52630522c705bb56aaddd","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:26:59 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904019139&projectId=104966
2023-06-16 16:26:59 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '6525479242e52630522c705bb56aaddd', 'BSP_USER_TENANT': '216260762345772077'}
2023-06-16 16:26:59 | INFO | 请求 body --> None
2023-06-16 16:26:59 | INFO | 接口状态--> 200
2023-06-16 16:26:59 | INFO | 接口耗时--> 0:00:00.015805
2023-06-16 16:26:59 | INFO | 接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FDEA11A640>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-16 16:26:59 | INFO | | end called substitute_data | returnNone, duration0.000003s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:26:59 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000344s
2023-06-16 16:26:59 | INFO | -----------分割线-----------
2023-06-16 16:26:59 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FDFF62C3D0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:26:59 | INFO | | end called write_back | returnNone, duration0.032428s
2023-06-16 16:26:59 | INFO | 所有用例执行完毕
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{}
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{}
2023-06-16 16:30:50 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000031s
2023-06-16 16:30:50 | INFO | | end called clear_date | return清空指定 sheet 中的单元格成功, duration0.047532s
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{}
2023-06-16 16:30:50 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000030s
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-16 16:30:50 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x0000029818812B80>, 'lt': <function lt at 0x000002981882BAF0>, 'lte': <function lte at 0x000002981882BCA0>, 'gt': <function gt at 0x000002981882BD30>, 'gte': <function gte at 0x000002981882BDC0>, 'neq': <function neq at 0x000002981882BE50>, 'str_eq': <function str_eq at 0x000002981882BEE0>, 'length_eq': <function length_eq at 0x000002981882BF70>, 'length_gt': <function length_gt at 0x0000029818831040>, 'length_gte': <function length_gte at 0x00000298188310D0>, 'length_lt': <function length_lt at 0x0000029818831160>, 'length_lte': <function length_lte at 0x00000298188311F0>, 'contains': <function contains at 0x0000029818831280>, 'contained_by': <function contained_by at 0x0000029818831310>, 'type_match': <function type_match at 0x00000298188313A0>, 'regex_match': <function regex_match at 0x0000029818831430>, 'regex_search': <function regex_search at 0x00000298188314C0>, 'startswith': <function startswith at 0x0000029818831550>, 'endswith': <function endswith at 0x00000298188315E0>}, duration0.000009s
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{}
2023-06-16 16:30:50 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000027s
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:30:50 | INFO | -----------分割线-----------
2023-06-16 16:30:50 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:30:50 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x00000298181774C0>, 'get_current_date': <function get_current_date at 0x000002982FEF6160>, 'get_current_time': <function get_current_time at 0x000002982FEF6280>, 'get_delta_time': <function get_delta_time at 0x000002982FEF63A0>, 'md5_encryption': <function md5_encryption at 0x000002982FEF64C0>, 'json_dumps': <function json_dumps at 0x000002982FEF6700>, 'json_loads': <function json_loads at 0x000002982FEF6820>, 'list_slice': <function list_slice at 0x000002982FEF69D0>, 'sublist': <function sublist at 0x000002982FEF6AF0>, 'random_choice': <function random_choice at 0x000002982FEF6CA0>, 'gen_random_num': <function gen_random_num at 0x000002982FEF6DC0>, 'gen_random_str': <function gen_random_str at 0x000002982FEF6EE0>, 'regex_extract': <function regex_extract at 0x000002982FEF8160>, 'substr': <function substr at 0x000002982FEF83A0>, 'str_join': <function str_join at 0x000002982FEF84C0>, 'get_timestamp': <function get_timestamp at 0x000002982FEF8670>, 'ms_fmt_hms': <function ms_fmt_hms at 0x000002982FEF8790>, 'random_phone': <function random_phone at 0x000002982F49FB80>, 'random_gps': <function random_gps at 0x000002982FEF8940>, 'random_string': <function random_string at 0x000002982F49F790>, 'random_ssn': <function random_ssn at 0x000002982F49FAF0>, 'random_email': <function random_email at 0x000002982F49FDC0>, 'random_id_card': <function random_id_card at 0x000002982F49FC10>, 'random_int': <function random_int at 0x000002982F49FEE0>, 'random_male_name': <function random_male_name at 0x000002982F49FD30>, 'random_female_name': <function random_female_name at 0x000002982F49FCA0>, 'random_current_time': <function random_current_time at 0x000002982F49FE50>}, duration0.000012s
2023-06-16 16:30:50 | INFO | | end called set_bif_fun | returnNone, duration0.001413s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, None) kwargs:{}
2023-06-16 16:30:51 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000002s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:51 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.001839s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:51 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000050s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000002981880CC40>,) kwargs:{'jp_dict': None}
2023-06-16 16:30:51 | INFO | | end called substitute_data | returnNone, duration0.000009s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-16 16:30:51 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000003s
2023-06-16 16:30:51 | INFO | 发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-16 16:30:51 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-16 16:30:51 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-16 16:30:51 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-16 16:30:51 | INFO | 接口状态--> 200
2023-06-16 16:30:51 | INFO | 接口耗时--> 0:00:00.078320
2023-06-16 16:30:51 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216869042520425768","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"0313cbae484114bff318ead3b61196a1","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904252,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:30:51 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.009648s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000002983055CEE0>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-16 16:30:51 | INFO | | end called substitute_data | returnNone, duration0.015140s
2023-06-16 16:30:51 | INFO | -----------分割线-----------
2023-06-16 16:30:51 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216869042520425768","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"0313cbae484114bff318ead3b61196a1","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904252,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:30:52 | INFO | | end called write_back | returnNone, duration0.032570s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, None) kwargs:{}
2023-06-16 16:30:54 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:54 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000304s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:30:54 | INFO | | end called get_timestamp | return1686904254030, duration0.000003s
2023-06-16 16:30:54 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904254030', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"FtOGcCbfpRKYLHMGOxkD"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001591s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000002982F9E9C70>,) kwargs:{'jp_dict': None}
2023-06-16 16:30:54 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"FtOGcCbfpRKYLHMGOxkD"}') kwargs:{}
2023-06-16 16:30:54 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"FtOGcCbfpRKYLHMGOxkD"}'), duration0.000003s
2023-06-16 16:30:54 | INFO | 发送请求的参数: {'json': '{"projectId":"104966","tvSequence":"FtOGcCbfpRKYLHMGOxkD"}', 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:30:54 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904254030
2023-06-16 16:30:54 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '0313cbae484114bff318ead3b61196a1', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
2023-06-16 16:30:54 | INFO | 请求 body --> b'{"projectId": "104966", "tvSequence": "FtOGcCbfpRKYLHMGOxkD"}'
2023-06-16 16:30:54 | INFO | 接口状态--> 200
2023-06-16 16:30:54 | INFO | 接口耗时--> 0:00:00.042431
2023-06-16 16:30:54 | INFO | 接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:30:54 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000372s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000029831584E20>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-16 16:30:54 | INFO | | end called substitute_data | returnNone, duration0.005513s
2023-06-16 16:30:54 | INFO | -----------分割线-----------
2023-06-16 16:30:54 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:30:54 | INFO | | end called write_back | returnNone, duration0.036211s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, None) kwargs:{}
2023-06-16 16:30:57 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:57 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000271s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000002982FE06700>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:30:57 | INFO | | end called get_timestamp | return1686904257136, duration0.000003s
2023-06-16 16:30:57 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904257136&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001212s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000002982FE1AAF0>,) kwargs:{'jp_dict': None}
2023-06-16 16:30:57 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-16 16:30:57 | INFO | | end called substitute_data | return{}, duration0.000646s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-16 16:30:57 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000002s
2023-06-16 16:30:57 | INFO | 发送请求的参数: {'params': None, 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"0313cbae484114bff318ead3b61196a1","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:30:57 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904257136&projectId=104966
2023-06-16 16:30:57 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '0313cbae484114bff318ead3b61196a1', 'BSP_USER_TENANT': '216260762345772077'}
2023-06-16 16:30:57 | INFO | 请求 body --> None
2023-06-16 16:30:57 | INFO | 接口状态--> 200
2023-06-16 16:30:57 | INFO | 接口耗时--> 0:00:00.017066
2023-06-16 16:30:57 | INFO | 接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:30:57 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000359s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000029831584D60>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-16 16:30:57 | INFO | | end called substitute_data | returnNone, duration0.000002s
2023-06-16 16:30:57 | INFO | -----------分割线-----------
2023-06-16 16:30:57 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000002981880D880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:30:57 | INFO | | end called write_back | returnNone, duration0.032679s
2023-06-16 16:30:57 | INFO | 所有用例执行完毕
2023-06-16 16:32:31 | INFO | -----------分割线-----------
2023-06-16 16:32:31 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{}
2023-06-16 16:32:31 | INFO | -----------分割线-----------
2023-06-16 16:32:31 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{}
2023-06-16 16:32:31 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000022s
2023-06-16 16:32:32 | INFO | | end called clear_date | return清空指定 sheet 中的单元格成功, duration0.035161s
2023-06-16 16:32:32 | INFO | -----------分割线-----------
2023-06-16 16:32:32 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{}
2023-06-16 16:32:32 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000026s
2023-06-16 16:32:32 | INFO | -----------分割线-----------
2023-06-16 16:32:32 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-16 16:32:32 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x000001FAF48E2B80>, 'lt': <function lt at 0x000001FAF48FAAF0>, 'lte': <function lte at 0x000001FAF48FACA0>, 'gt': <function gt at 0x000001FAF48FAD30>, 'gte': <function gte at 0x000001FAF48FADC0>, 'neq': <function neq at 0x000001FAF48FAE50>, 'str_eq': <function str_eq at 0x000001FAF48FAEE0>, 'length_eq': <function length_eq at 0x000001FAF48FAF70>, 'length_gt': <function length_gt at 0x000001FAF4902040>, 'length_gte': <function length_gte at 0x000001FAF49020D0>, 'length_lt': <function length_lt at 0x000001FAF4902160>, 'length_lte': <function length_lte at 0x000001FAF49021F0>, 'contains': <function contains at 0x000001FAF4902280>, 'contained_by': <function contained_by at 0x000001FAF4902310>, 'type_match': <function type_match at 0x000001FAF49023A0>, 'regex_match': <function regex_match at 0x000001FAF4902430>, 'regex_search': <function regex_search at 0x000001FAF49024C0>, 'startswith': <function startswith at 0x000001FAF4902550>, 'endswith': <function endswith at 0x000001FAF49025E0>}, duration0.000009s
2023-06-16 16:32:32 | INFO | -----------分割线-----------
2023-06-16 16:32:32 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{}
2023-06-16 16:32:32 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000030s
2023-06-16 16:32:32 | INFO | -----------分割线-----------
2023-06-16 16:32:32 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:32:32 | INFO | -----------分割线-----------
2023-06-16 16:32:32 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:32:32 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x000001FAF42474C0>, 'get_current_date': <function get_current_date at 0x000001FA8C1B6160>, 'get_current_time': <function get_current_time at 0x000001FA8C1B6280>, 'get_delta_time': <function get_delta_time at 0x000001FA8C1B63A0>, 'md5_encryption': <function md5_encryption at 0x000001FA8C1B64C0>, 'json_dumps': <function json_dumps at 0x000001FA8C1B6700>, 'json_loads': <function json_loads at 0x000001FA8C1B6820>, 'list_slice': <function list_slice at 0x000001FA8C1B69D0>, 'sublist': <function sublist at 0x000001FA8C1B6AF0>, 'random_choice': <function random_choice at 0x000001FA8C1B6CA0>, 'gen_random_num': <function gen_random_num at 0x000001FA8C1B6DC0>, 'gen_random_str': <function gen_random_str at 0x000001FA8C1B6EE0>, 'regex_extract': <function regex_extract at 0x000001FA8C1B8160>, 'substr': <function substr at 0x000001FA8C1B83A0>, 'str_join': <function str_join at 0x000001FA8C1B84C0>, 'get_timestamp': <function get_timestamp at 0x000001FA8C1B8670>, 'ms_fmt_hms': <function ms_fmt_hms at 0x000001FA8C1B8790>, 'random_phone': <function random_phone at 0x000001FA8C7B3B80>, 'random_gps': <function random_gps at 0x000001FA8C1B8940>, 'random_string': <function random_string at 0x000001FA8C7B3790>, 'random_ssn': <function random_ssn at 0x000001FA8C7B3AF0>, 'random_email': <function random_email at 0x000001FA8C7B3DC0>, 'random_id_card': <function random_id_card at 0x000001FA8C7B3C10>, 'random_int': <function random_int at 0x000001FA8C7B3EE0>, 'random_male_name': <function random_male_name at 0x000001FA8C7B3D30>, 'random_female_name': <function random_female_name at 0x000001FA8C7B3CA0>, 'random_current_time': <function random_current_time at 0x000001FA8C7B3E50>}, duration0.000013s
2023-06-16 16:32:32 | INFO | | end called set_bif_fun | returnNone, duration0.001278s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, None) kwargs:{}
2023-06-16 16:32:33 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000002s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:33 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.001928s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:33 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000053s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8C190EB0>,) kwargs:{'jp_dict': None}
2023-06-16 16:32:33 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-16 16:32:33 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000003s
2023-06-16 16:32:33 | INFO | 发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
2023-06-16 16:32:33 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-06-16 16:32:33 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
2023-06-16 16:32:33 | INFO | 请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-06-16 16:32:33 | INFO | 接口状态--> 200
2023-06-16 16:32:33 | INFO | 接口耗时--> 0:00:00.051362
2023-06-16 16:32:33 | INFO | 接口响应--> {"code":"0","type":"success","data":{"id":"216869043537056390","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"eefda4fb104a3ebea29206b16aa18c70","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904353,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
2023-06-16 16:32:33 | INFO | 打印数据-00000000000000000000000000
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:32:33 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000465s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8D966C70>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-16 16:32:33 | INFO | | end called substitute_data | returnNone, duration0.013389s
2023-06-16 16:32:33 | INFO | -----------分割线-----------
2023-06-16 16:32:33 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216869043537056390","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"eefda4fb104a3ebea29206b16aa18c70","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904353,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:32:33 | INFO | | end called write_back | returnNone, duration0.032191s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, None) kwargs:{}
2023-06-16 16:32:35 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:35 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000358s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:32:35 | INFO | | end called get_timestamp | return1686904355697, duration0.000004s
2023-06-16 16:32:35 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904355697', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"nQAPPZhbUEsancjCaYEp"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001286s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8C190F10>,) kwargs:{'jp_dict': None}
2023-06-16 16:32:35 | INFO | | end called substitute_data | returnNone, duration0.000009s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"nQAPPZhbUEsancjCaYEp"}') kwargs:{}
2023-06-16 16:32:35 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"nQAPPZhbUEsancjCaYEp"}'), duration0.000002s
2023-06-16 16:32:35 | INFO | 发送请求的参数: {'json': '{"projectId":"104966","tvSequence":"nQAPPZhbUEsancjCaYEp"}', 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:32:35 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904355697
2023-06-16 16:32:35 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'eefda4fb104a3ebea29206b16aa18c70', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
2023-06-16 16:32:35 | INFO | 请求 body --> b'{"projectId": "104966", "tvSequence": "nQAPPZhbUEsancjCaYEp"}'
2023-06-16 16:32:35 | INFO | 接口状态--> 200
2023-06-16 16:32:35 | INFO | 接口耗时--> 0:00:00.043492
2023-06-16 16:32:35 | INFO | 接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
2023-06-16 16:32:35 | INFO | 打印数据-00000000000000000000000000
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:32:35 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000360s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8C190FA0>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-16 16:32:35 | INFO | | end called substitute_data | returnNone, duration0.005547s
2023-06-16 16:32:35 | INFO | -----------分割线-----------
2023-06-16 16:32:35 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:32:35 | INFO | | end called write_back | returnNone, duration0.035322s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, None) kwargs:{}
2023-06-16 16:32:38 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:38 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000402s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001FA8C1637F0>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:32:38 | INFO | | end called get_timestamp | return1686904358799, duration0.000003s
2023-06-16 16:32:38 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904358799&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001233s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8C190F10>,) kwargs:{'jp_dict': None}
2023-06-16 16:32:38 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-16 16:32:38 | INFO | | end called substitute_data | return{}, duration0.000434s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-16 16:32:38 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000003s
2023-06-16 16:32:38 | INFO | 发送请求的参数: {'params': None, 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"eefda4fb104a3ebea29206b16aa18c70","BSP_USER_TENANT":"216260762345772077"}'}
2023-06-16 16:32:38 | INFO | 请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904358799&projectId=104966
2023-06-16 16:32:38 | INFO | 请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': 'eefda4fb104a3ebea29206b16aa18c70', 'BSP_USER_TENANT': '216260762345772077'}
2023-06-16 16:32:38 | INFO | 请求 body --> None
2023-06-16 16:32:38 | INFO | 接口状态--> 200
2023-06-16 16:32:38 | INFO | 接口耗时--> 0:00:00.015232
2023-06-16 16:32:38 | INFO | 接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
2023-06-16 16:32:38 | INFO | 打印数据-00000000000000000000000000
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:32:38 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000227s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001FA8C96C400>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-16 16:32:38 | INFO | | end called substitute_data | returnNone, duration0.000003s
2023-06-16 16:32:38 | INFO | -----------分割线-----------
2023-06-16 16:32:38 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001FAF48DD880>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:32:38 | INFO | | end called write_back | returnNone, duration0.033651s
2023-06-16 16:32:38 | INFO | 所有用例执行完毕
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{}
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{}
2023-06-16 16:36:00 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000031s
2023-06-16 16:36:00 | INFO | | end called clear_date | return清空指定 sheet 中的单元格成功, duration0.035947s
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{}
2023-06-16 16:36:00 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000028s
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-16 16:36:00 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x000001B3D70D4C10>, 'lt': <function lt at 0x000001B3D70D4AF0>, 'lte': <function lte at 0x000001B3D70D4CA0>, 'gt': <function gt at 0x000001B3D70D4D30>, 'gte': <function gte at 0x000001B3D70D4DC0>, 'neq': <function neq at 0x000001B3D70D4E50>, 'str_eq': <function str_eq at 0x000001B3D70D4EE0>, 'length_eq': <function length_eq at 0x000001B3D70D4F70>, 'length_gt': <function length_gt at 0x000001B3D70D6040>, 'length_gte': <function length_gte at 0x000001B3D70D60D0>, 'length_lt': <function length_lt at 0x000001B3D70D6160>, 'length_lte': <function length_lte at 0x000001B3D70D61F0>, 'contains': <function contains at 0x000001B3D70D6280>, 'contained_by': <function contained_by at 0x000001B3D70D6310>, 'type_match': <function type_match at 0x000001B3D70D63A0>, 'regex_match': <function regex_match at 0x000001B3D70D6430>, 'regex_search': <function regex_search at 0x000001B3D70D64C0>, 'startswith': <function startswith at 0x000001B3D70D6550>, 'endswith': <function endswith at 0x000001B3D70D65E0>}, duration0.000008s
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{}
2023-06-16 16:36:00 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000025s
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:36:00 | INFO | -----------分割线-----------
2023-06-16 16:36:00 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-16 16:36:00 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x000001B3D63A74C0>, 'get_current_date': <function get_current_date at 0x000001B3D6A36F70>, 'get_current_time': <function get_current_time at 0x000001B3D6A380D0>, 'get_delta_time': <function get_delta_time at 0x000001B3D6A381F0>, 'md5_encryption': <function md5_encryption at 0x000001B3D6A38310>, 'json_dumps': <function json_dumps at 0x000001B3D6A38550>, 'json_loads': <function json_loads at 0x000001B3D6A38670>, 'list_slice': <function list_slice at 0x000001B3D6A38820>, 'sublist': <function sublist at 0x000001B3D6A38940>, 'random_choice': <function random_choice at 0x000001B3D6A38AF0>, 'gen_random_num': <function gen_random_num at 0x000001B3D6A38C10>, 'gen_random_str': <function gen_random_str at 0x000001B3D6A38D30>, 'regex_extract': <function regex_extract at 0x000001B3D6A38F70>, 'substr': <function substr at 0x000001B3D6A411F0>, 'str_join': <function str_join at 0x000001B3D6A41310>, 'get_timestamp': <function get_timestamp at 0x000001B3D6A414C0>, 'ms_fmt_hms': <function ms_fmt_hms at 0x000001B3D6A415E0>, 'random_phone': <function random_phone at 0x000001B3D6F65550>, 'random_gps': <function random_gps at 0x000001B3D6A41790>, 'random_string': <function random_string at 0x000001B3D6F65160>, 'random_ssn': <function random_ssn at 0x000001B3D6F654C0>, 'random_email': <function random_email at 0x000001B3D6F65790>, 'random_id_card': <function random_id_card at 0x000001B3D6F655E0>, 'random_int': <function random_int at 0x000001B3D6F658B0>, 'random_male_name': <function random_male_name at 0x000001B3D6F65700>, 'random_female_name': <function random_female_name at 0x000001B3D6F65670>, 'random_current_time': <function random_current_time at 0x000001B3D6F65820>}, duration0.000012s
2023-06-16 16:36:00 | INFO | | end called set_bif_fun | returnNone, duration0.001385s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, None) kwargs:{}
2023-06-16 16:36:01 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000002s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:01 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000547s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:01 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000053s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3D6A3E100>,) kwargs:{'jp_dict': None}
2023-06-16 16:36:01 | INFO | | end called substitute_data | returnNone, duration0.000009s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-16 16:36:01 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000003s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:36:01 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000476s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3EF774040>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-16 16:36:01 | INFO | | end called substitute_data | returnNone, duration0.012873s
2023-06-16 16:36:01 | INFO | -----------分割线-----------
2023-06-16 16:36:01 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216869045616844116","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"74e56aa9c583d4690ea8b52eba4fcd37","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904561,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:36:01 | INFO | | end called write_back | returnNone, duration0.032137s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, None) kwargs:{}
2023-06-16 16:36:03 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:03 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000280s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:36:03 | INFO | | end called get_timestamp | return1686904563667, duration0.000004s
2023-06-16 16:36:03 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904563667', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"SifRZqFWNQCnCtTPsUpq"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001398s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3EE1D3DC0>,) kwargs:{'jp_dict': None}
2023-06-16 16:36:03 | INFO | | end called substitute_data | returnNone, duration0.000009s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"SifRZqFWNQCnCtTPsUpq"}') kwargs:{}
2023-06-16 16:36:03 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"SifRZqFWNQCnCtTPsUpq"}'), duration0.000003s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:36:03 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000360s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3EE287160>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-16 16:36:03 | INFO | | end called substitute_data | returnNone, duration0.005689s
2023-06-16 16:36:03 | INFO | -----------分割线-----------
2023-06-16 16:36:03 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:36:03 | INFO | | end called write_back | returnNone, duration0.034489s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, None) kwargs:{}
2023-06-16 16:36:06 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:06 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000267s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001B3EE6A2EB0>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-16 16:36:06 | INFO | | end called get_timestamp | return1686904566770, duration0.000004s
2023-06-16 16:36:06 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904566770&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001393s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3EE287160>,) kwargs:{'jp_dict': None}
2023-06-16 16:36:06 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-16 16:36:06 | INFO | | end called substitute_data | return{}, duration0.000447s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-16 16:36:06 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000003s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-16 16:36:06 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000538s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001B3EE758A00>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-16 16:36:06 | INFO | | end called substitute_data | returnNone, duration0.000002s
2023-06-16 16:36:06 | INFO | -----------分割线-----------
2023-06-16 16:36:06 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001B3D70D8640>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-16 16:36:06 | INFO | | end called write_back | returnNone, duration0.032615s
2023-06-16 16:36:06 | INFO | 所有用例执行完毕

View File

@ -1,3 +0,0 @@
2023-06-16 02:22:02,537-ERROR-logger.py-[ line:62 ] - 日志信息:读取excel中初始化数据异常: "There is no item named 'xl/sharedStrings.xml' in the archive"
2023-06-16 02:26:50,713-ERROR-logger.py-[ line:62 ] - 日志信息:读取excel中初始化数据异常: "There is no item named 'xl/sharedStrings.xml' in the archive"
2023-06-16 09:08:37,186-ERROR-logger.py-[ line:62 ] - 日志信息:读取excel中初始化数据异常: "There is no item named 'xl/sharedStrings.xml' in the archive"

View File

@ -1,53 +0,0 @@
2023-06-16 02:22:02,534-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-16 02:26:50,710-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件E:\apitest\cases\cases\test_api.xlsx
2023-06-16 09:08:37,149-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_api.xlsx
2023-06-16 09:23:51,920-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:23:51,992-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:25:48,120-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:25:48,212-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:42:41,315-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:42:41,399-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:45:07,627-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:45:07,696-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:45:32,369-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:45:32,462-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:51:12,027-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:51:12,096-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:52:11,275-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:52:11,348-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 09:53:56,188-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 09:53:56,259-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 14:29:38,208-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 14:29:38,276-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:03:43,167-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:03:43,237-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:05:51,042-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:05:51,114-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:07:31,592-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:07:31,662-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:08:50,689-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:08:50,725-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:10:14,479-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:10:14,516-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 15:10:34,903-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 15:10:34,973-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:04:39,126-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:04:39,208-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:08:12,578-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:08:12,659-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:09:36,493-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:09:36,584-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:09:50,081-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:09:50,151-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:14:01,429-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:14:01,523-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:22:26,723-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:22:26,805-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:26:50,603-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:26:50,679-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:30:50,250-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:30:50,335-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:32:31,957-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:32:32,032-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-16 16:36:00,417-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-16 16:36:00,501-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}

View File

@ -1,210 +0,0 @@
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{}
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{}
2023-06-19 15:17:11 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000029s
2023-06-19 15:17:11 | ERROR | | called clear_date | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{}
2023-06-19 15:17:11 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000026s
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-19 15:17:11 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x000001C1E52765E0>, 'lt': <function lt at 0x000001C1E52764C0>, 'lte': <function lte at 0x000001C1E5276670>, 'gt': <function gt at 0x000001C1E5276700>, 'gte': <function gte at 0x000001C1E5276790>, 'neq': <function neq at 0x000001C1E5276820>, 'str_eq': <function str_eq at 0x000001C1E52768B0>, 'length_eq': <function length_eq at 0x000001C1E5276940>, 'length_gt': <function length_gt at 0x000001C1E52769D0>, 'length_gte': <function length_gte at 0x000001C1E5276A60>, 'length_lt': <function length_lt at 0x000001C1E5276AF0>, 'length_lte': <function length_lte at 0x000001C1E5276B80>, 'contains': <function contains at 0x000001C1E5276C10>, 'contained_by': <function contained_by at 0x000001C1E5276CA0>, 'type_match': <function type_match at 0x000001C1E5276D30>, 'regex_match': <function regex_match at 0x000001C1E5276DC0>, 'regex_search': <function regex_search at 0x000001C1E5276E50>, 'startswith': <function startswith at 0x000001C1E5276EE0>, 'endswith': <function endswith at 0x000001C1E5276F70>}, duration0.000010s
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{}
2023-06-19 15:17:11 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000031s
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-19 15:17:11 | INFO | -----------分割线-----------
2023-06-19 15:17:11 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-19 15:17:11 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x000001C1E3F38040>, 'get_current_date': <function get_current_date at 0x000001C1E4861B80>, 'get_current_time': <function get_current_time at 0x000001C1E4861CA0>, 'get_delta_time': <function get_delta_time at 0x000001C1E4861DC0>, 'md5_encryption': <function md5_encryption at 0x000001C1E4861EE0>, 'json_dumps': <function json_dumps at 0x000001C1E4872280>, 'json_loads': <function json_loads at 0x000001C1E48723A0>, 'list_slice': <function list_slice at 0x000001C1E4872550>, 'sublist': <function sublist at 0x000001C1E4872670>, 'random_choice': <function random_choice at 0x000001C1E4872820>, 'gen_random_num': <function gen_random_num at 0x000001C1E4872940>, 'gen_random_str': <function gen_random_str at 0x000001C1E4872A60>, 'regex_extract': <function regex_extract at 0x000001C1E4872CA0>, 'substr': <function substr at 0x000001C1E4872EE0>, 'str_join': <function str_join at 0x000001C1E4879040>, 'get_timestamp': <function get_timestamp at 0x000001C1E48791F0>, 'ms_fmt_hms': <function ms_fmt_hms at 0x000001C1E4879310>, 'random_phone': <function random_phone at 0x000001C1E4E495E0>, 'random_gps': <function random_gps at 0x000001C1E48794C0>, 'random_string': <function random_string at 0x000001C1E4E491F0>, 'random_ssn': <function random_ssn at 0x000001C1E4E49550>, 'random_email': <function random_email at 0x000001C1E4E49820>, 'random_id_card': <function random_id_card at 0x000001C1E4E49670>, 'random_int': <function random_int at 0x000001C1E4E49940>, 'random_male_name': <function random_male_name at 0x000001C1E4E49790>, 'random_female_name': <function random_female_name at 0x000001C1E4E49700>, 'random_current_time': <function random_current_time at 0x000001C1E4E498B0>}, duration0.000011s
2023-06-19 15:17:11 | INFO | | end called set_bif_fun | returnNone, duration0.001274s
2023-06-19 15:17:12 | INFO | -----------分割线-----------
2023-06-19 15:17:12 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, None) kwargs:{}
2023-06-19 15:17:12 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000002s
2023-06-19 15:17:12 | INFO | -----------分割线-----------
2023-06-19 15:17:12 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:12 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.002210s
2023-06-19 15:17:12 | INFO | -----------分割线-----------
2023-06-19 15:17:12 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:12 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000049s
2023-06-19 15:17:12 | INFO | -----------分割线-----------
2023-06-19 15:17:12 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1E5282400>,) kwargs:{'jp_dict': None}
2023-06-19 15:17:12 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-19 15:17:12 | INFO | -----------分割线-----------
2023-06-19 15:17:12 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-19 15:17:12 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000003s
2023-06-19 15:17:13 | INFO | -----------分割线-----------
2023-06-19 15:17:13 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:17:13 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000686s
2023-06-19 15:17:13 | INFO | -----------分割线-----------
2023-06-19 15:17:13 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1FC973190>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-19 15:17:13 | INFO | | end called substitute_data | returnNone, duration0.029379s
2023-06-19 15:17:13 | INFO | -----------分割线-----------
2023-06-19 15:17:13 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216871590331335480","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"438c34513a81279e578756d89f34b18f","type":"user","avatar":null,"ncAccount":null,"timestamp":1687159033,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:17:13 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:13 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, None) kwargs:{}
2023-06-19 15:17:15 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:15 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000446s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-19 15:17:15 | INFO | | end called get_timestamp | return1687159035059, duration0.000003s
2023-06-19 15:17:15 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1687159035059', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"qGhFVDrgHSZIFxGCAcKH"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001300s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1FC92C940>,) kwargs:{'jp_dict': None}
2023-06-19 15:17:15 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"qGhFVDrgHSZIFxGCAcKH"}') kwargs:{}
2023-06-19 15:17:15 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"qGhFVDrgHSZIFxGCAcKH"}'), duration0.000003s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:17:15 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000442s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1FC973370>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-19 15:17:15 | INFO | | end called substitute_data | returnNone, duration0.005484s
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:15 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:17:15 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:15 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, None) kwargs:{}
2023-06-19 15:17:18 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:18 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000343s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x000001C1FC8E0790>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-19 15:17:18 | INFO | | end called get_timestamp | return1687159038152, duration0.000004s
2023-06-19 15:17:18 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1687159038152&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001839s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1FC86B8B0>,) kwargs:{'jp_dict': None}
2023-06-19 15:17:18 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-19 15:17:18 | INFO | | end called substitute_data | return{}, duration0.000424s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-19 15:17:18 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"438c34513a81279e578756d89f34b18f","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000003s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:17:18 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000454s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x000001C1FC86B8B0>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-19 15:17:18 | INFO | | end called substitute_data | returnNone, duration0.000003s
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x000001C1E3E812E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:17:18 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:18 | INFO | -----------分割线-----------
2023-06-19 15:17:18 | INFO | 所有用例执行完毕
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called clear_date | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{}
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{}
2023-06-19 15:17:57 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000023s
2023-06-19 15:17:57 | ERROR | | called clear_date | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{}
2023-06-19 15:17:57 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000023s
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called load_built_in_comparators | args: () kwargs:{}
2023-06-19 15:17:57 | INFO | | end called load_built_in_comparators | return{'eq': <function eq at 0x0000024F0D4A65E0>, 'lt': <function lt at 0x0000024F0D4A64C0>, 'lte': <function lte at 0x0000024F0D4A6670>, 'gt': <function gt at 0x0000024F0D4A6700>, 'gte': <function gte at 0x0000024F0D4A6790>, 'neq': <function neq at 0x0000024F0D4A6820>, 'str_eq': <function str_eq at 0x0000024F0D4A68B0>, 'length_eq': <function length_eq at 0x0000024F0D4A6940>, 'length_gt': <function length_gt at 0x0000024F0D4A69D0>, 'length_gte': <function length_gte at 0x0000024F0D4A6A60>, 'length_lt': <function length_lt at 0x0000024F0D4A6AF0>, 'length_lte': <function length_lte at 0x0000024F0D4A6B80>, 'contains': <function contains at 0x0000024F0D4A6C10>, 'contained_by': <function contained_by at 0x0000024F0D4A6CA0>, 'type_match': <function type_match at 0x0000024F0D4A6D30>, 'regex_match': <function regex_match at 0x0000024F0D4A6DC0>, 'regex_search': <function regex_search at 0x0000024F0D4A6E50>, 'startswith': <function startswith at 0x0000024F0D4A6EE0>, 'endswith': <function endswith at 0x0000024F0D4A6F70>}, duration0.000009s
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called get_excel_init | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{}
2023-06-19 15:17:57 | INFO | | end called get_excel_init | return{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}, duration0.000023s
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called set_bif_fun | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-19 15:17:57 | INFO | -----------分割线-----------
2023-06-19 15:17:57 | INFO | | called load_built_in_functions | args: (<module 'common.bif_functions' from 'D:\\apk_api\\api-test-project\\common\\bif_functions\\__init__.py'>,) kwargs:{}
2023-06-19 15:17:57 | INFO | | end called load_built_in_functions | return{'MyLogger': <function MyLogger at 0x0000024F0C168040>, 'get_current_date': <function get_current_date at 0x0000024F0CA91B80>, 'get_current_time': <function get_current_time at 0x0000024F0CA91CA0>, 'get_delta_time': <function get_delta_time at 0x0000024F0CA91DC0>, 'md5_encryption': <function md5_encryption at 0x0000024F0CA91EE0>, 'json_dumps': <function json_dumps at 0x0000024F0CAA2280>, 'json_loads': <function json_loads at 0x0000024F0CAA23A0>, 'list_slice': <function list_slice at 0x0000024F0CAA2550>, 'sublist': <function sublist at 0x0000024F0CAA2670>, 'random_choice': <function random_choice at 0x0000024F0CAA2820>, 'gen_random_num': <function gen_random_num at 0x0000024F0CAA2940>, 'gen_random_str': <function gen_random_str at 0x0000024F0CAA2A60>, 'regex_extract': <function regex_extract at 0x0000024F0CAA2CA0>, 'substr': <function substr at 0x0000024F0CAA2EE0>, 'str_join': <function str_join at 0x0000024F0CAA9040>, 'get_timestamp': <function get_timestamp at 0x0000024F0CAA91F0>, 'ms_fmt_hms': <function ms_fmt_hms at 0x0000024F0CAA9310>, 'random_phone': <function random_phone at 0x0000024F0D0795E0>, 'random_gps': <function random_gps at 0x0000024F0CAA94C0>, 'random_string': <function random_string at 0x0000024F0D0791F0>, 'random_ssn': <function random_ssn at 0x0000024F0D079550>, 'random_email': <function random_email at 0x0000024F0D079820>, 'random_id_card': <function random_id_card at 0x0000024F0D079670>, 'random_int': <function random_int at 0x0000024F0D079940>, 'random_male_name': <function random_male_name at 0x0000024F0D079790>, 'random_female_name': <function random_female_name at 0x0000024F0D079700>, 'random_current_time': <function random_current_time at 0x0000024F0D0798B0>}, duration0.000010s
2023-06-19 15:17:57 | INFO | | end called set_bif_fun | returnNone, duration0.001354s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, None) kwargs:{}
2023-06-19 15:17:58 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000002s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'setup', {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:58 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.002189s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, {'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "{{account}}", "password": "{{passwd}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:17:58 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Params': None, 'Request Data': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.000049s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F24B21070>,) kwargs:{'jp_dict': None}
2023-06-19 15:17:58 | INFO | | end called substitute_data | returnNone, duration0.000010s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called encrypt_data | args: (None, '{"Content-Type": "application/json"}', None, '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}') kwargs:{}
2023-06-19 15:17:58 | INFO | | end called encrypt_data | return('{"Content-Type": "application/json"}', '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'), duration0.000004s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_2.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:17:58 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000623s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F24BA2190>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}'}
2023-06-19 15:17:58 | INFO | | end called substitute_data | returnNone, duration0.013278s
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:17:58 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 2, 'response_value': '{"code":"0","type":"success","data":{"id":"216871590785354261","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"c27efeb2eca3faa0e6395483ec0cbbdd","type":"user","avatar":null,"ncAccount":null,"timestamp":1687159078,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:17:58 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:17:58 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, None) kwargs:{}
2023-06-19 15:18:00 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000001s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'setup', {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:18:00 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.000290s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, {'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t={{get_timestamp()}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': '{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-19 15:18:00 | INFO | | end called get_timestamp | return1687159080446, duration0.000004s
2023-06-19 15:18:00 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 2, 'Url': '/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1687159080446', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': '{"projectId":"104966","tvSequence":"hKTduewcjBavxWjYYfWh"}', 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.001611s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F25BCC790>,) kwargs:{'jp_dict': None}
2023-06-19 15:18:00 | INFO | | end called substitute_data | returnNone, duration0.000009s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', None, '{"projectId":"104966","tvSequence":"hKTduewcjBavxWjYYfWh"}') kwargs:{}
2023-06-19 15:18:00 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', '{"projectId":"104966","tvSequence":"hKTduewcjBavxWjYYfWh"}'), duration0.000003s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_4.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:18:00 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.000229s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F25BCC790>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': '{"tvSequence": "$..tvSequence"}'}
2023-06-19 15:18:00 | INFO | | end called substitute_data | returnNone, duration0.005363s
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:00 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 4, 'response_value': '{"code":200,"success":true,"data":null,"msg":"添加成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:18:00 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:18:00 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, None) kwargs:{}
2023-06-19 15:18:03 | INFO | | end called replace_dependent_parameter | returnNone, duration0.000004s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'setup', {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:18:03 | INFO | | end called load_and_execute_script | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}, duration0.001428s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called replace_dependent_parameter | args: (<common.data_extraction.dependent_parameter.DependentParameter object at 0x0000024F24B10790>, {'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t={{get_timestamp()}}&projectId={{projectId}}', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"{{BSP_TOKEN}}","BSP_USER_TENANT":"{{BSP_USER_TENANT}}"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', None: None}) kwargs:{}
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called get_timestamp | args: () kwargs:{}
2023-06-19 15:18:03 | INFO | | end called get_timestamp | return1687159083535, duration0.000014s
2023-06-19 15:18:03 | INFO | | end called replace_dependent_parameter | return{'Run': 'YES', 'Time': 3, 'Url': '/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1687159083535&projectId=104966', 'Headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', 'Params': None, 'Request Data': None, 'Expected': None, 'Response': '', 'Assertion': '', 'Error Log': '', 'null': None}, duration0.006317s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F24B56970>,) kwargs:{'jp_dict': None}
2023-06-19 15:18:03 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-19 15:18:03 | INFO | | end called substitute_data | return{}, duration0.000488s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called encrypt_data | args: (None, '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', None, None) kwargs:{}
2023-06-19 15:18:03 | INFO | | end called encrypt_data | return('{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"c27efeb2eca3faa0e6395483ec0cbbdd","BSP_USER_TENANT":"216260762345772077"}', None), duration0.000003s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called load_and_execute_script | args: ('D:\\apk_api\\api-test-project\\scripts', 'prepost_script_安全纯净大屏_5.py', 'teardown', <Response [200]>) kwargs:{}
2023-06-19 15:18:03 | INFO | | end called load_and_execute_script | return<Response [200]>, duration0.002020s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called substitute_data | args: (<common.data_extraction.data_extractor.DataExtractor object at 0x0000024F24B6D700>,) kwargs:{'regex': None, 'keys': None, 'deps': None, 'jp_dict': None}
2023-06-19 15:18:03 | INFO | | end called substitute_data | returnNone, duration0.000002s
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | | called write_back | args: (<common.file_handling.do_excel.DoExcel object at 0x0000024F0C0B12E0>,) kwargs:{'sheet_name': '安全纯净大屏', 'i': 5, 'response_value': '{"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}', 'test_result': 'PASS', 'assert_log': ''}
2023-06-19 15:18:03 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-19 15:18:03 | INFO | -----------分割线-----------
2023-06-19 15:18:03 | INFO | 所有用例执行完毕

View File

@ -1,4 +0,0 @@
2023-06-19 15:17:11,833-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-19 15:17:11,883-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}
2023-06-19 15:17:57,279-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-19 15:17:57,317-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}

View File

@ -1,2 +0,0 @@
2023-06-20 16:31:02 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-20 16:50:27 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None

View File

@ -1,67 +0,0 @@
2023-06-21 11:50:16 | ERROR | 发送请求失败: name 'session' is not defined
2023-06-21 14:19:06 | ERROR | | called clear_date | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-21 14:19:07 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-21 14:19:09 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-21 14:19:12 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-21 14:19:12 | ERROR | 发送请求失败: 'NoneType' object has no attribute 'decode'
2023-06-21 14:19:12 | ERROR | 测试用例执行失败安全纯净大屏_5_劳务基础配置_查询配置:
e
2023-06-21 14:19:12 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,块排查: [Errno 13] Permission denied: 'D:\\apk_api\\api-test-project\\cases\\cases\\test_cases.xlsx'
2023-06-21 14:19:34 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-21 14:19:34 | ERROR | 发送请求失败: 'NoneType' object has no attribute 'decode'
2023-06-21 14:19:34 | ERROR | 测试用例执行失败安全纯净大屏_5_劳务基础配置_查询配置:
e
2023-06-21 14:24:15 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-21 15:57:14 | ERROR | | called replace_dependent_parameter | error: 快看,异常了,别唧唧哇哇,块排查: 'DependentParameter' object has no attribute 'pf'
2023-06-21 17:08:15 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:08:18 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:13:47 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:13:50 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:14:04 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-21 17:14:06 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:14:09 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:15:12 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-21 17:15:14 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:15:17 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:18:08 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-21 17:18:10 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:18:13 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:18:37 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-21 17:18:39 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:18:42 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:37:58 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-21 17:38:01 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常

View File

@ -1,2 +0,0 @@
2023-06-21 14:44:28,329-INFO-logger.py-[ line:64 ] - 日志信息:读取测试用例excel文件D:\apk_api\api-test-project\cases\cases\test_cases.xlsx
2023-06-21 14:44:28,394-INFO-logger.py-[ line:64 ] - 日志信息:如下是初始化得到得数据:{'id': 1, 'environment': 'TEST', 'host': 'https://bimdc.bzlrobot.com', 'path': '/bsp/test/user/ugs', 'databases': '{\n "host": "127.0.0.1",\n "port": 3306,\n "database": "mysql",\n "user":"root",\n "password":"root@3306"\n}', 'sheets': '["安全纯净大屏"]', 'initialize_data': '{\n"{{account}}":"18127813600",\n "{{passwd}}": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8=",\n"{{projectId}}":"104966",\n"{{tenant}}":"216317749963825419"\n}', 'run': 'YES'}

View File

@ -1,177 +0,0 @@
2023-06-25 08:29:10 | ERROR | | called set_bif_fun | error: 快看,异常了,别唧唧哇哇,块排查: set_bif_fun() missing 1 required positional argument: 'model'
2023-06-25 08:29:10 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:28:14 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:28:17 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:28:59 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:29:02 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:29:52 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:29:55 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:49:39 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:49:42 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:50:31 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:50:34 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:58:19 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 15:58:22 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:01:28 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:01:31 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:02:40 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:02:43 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:11:41 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:11:44 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:12:30 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:12:33 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:18:52 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:18:55 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:57:32 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:57:35 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:58:18 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:58:21 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:59:21 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 16:59:24 | ERROR | key:{{get_timestamp()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:01:23 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:11:52 | ERROR | key:<re.Match object; span=(138, 149), match='{{account}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:11:54 | ERROR | key:<re.Match object; span=(153, 166), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:11:57 | ERROR | key:<re.Match object; span=(76, 89), match='{{projectId}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:07 | ERROR | key:<re.Match object; span=(138, 149), match='{{account}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:09 | ERROR | key:<re.Match object; span=(153, 166), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:12 | ERROR | key:<re.Match object; span=(76, 89), match='{{projectId}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:12 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:12:27 | ERROR | key:<re.Match object; span=(138, 149), match='{{account}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:27 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
'TestProjectApi' object has no attribute 'pyt'
2023-06-25 17:12:29 | ERROR | key:<re.Match object; span=(153, 166), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:29 | ERROR | 异常用例: 安全纯净大屏_4_劳务基础配置_绑定TV
'TestProjectApi' object has no attribute 'pyt'
2023-06-25 17:12:32 | ERROR | key:<re.Match object; span=(76, 89), match='{{projectId}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:32 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:12:32 | ERROR | 异常用例: 安全纯净大屏_5_劳务基础配置_查询配置
'TestProjectApi' object has no attribute 'pyt'
2023-06-25 17:12:40 | ERROR | key:<re.Match object; span=(138, 149), match='{{account}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:40 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:12:42 | ERROR | key:<re.Match object; span=(153, 166), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:42 | ERROR | 提取响应失败安全纯净大屏_4_劳务基础配置_绑定TV
regex=None;
keys=None;
deps=None;
jp_dict={"tvSequence": "$..tvSequence"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:12:45 | ERROR | key:<re.Match object; span=(76, 89), match='{{projectId}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:12:45 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:12:45 | ERROR | 提取响应失败安全纯净大屏_5_劳务基础配置_查询配置
regex=None;
keys=None;
deps=None;
jp_dict=None
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:15:01 | ERROR | 提取响应失败安全纯净大屏_2_登录_非BIP用户登录
regex=None;
keys=None;
deps=None;
jp_dict={"BSP_TOKEN": "$.data.bspToken", "BSP_USER_TENANT": "$.data.currentTenantId"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:15:03 | ERROR | key:<re.Match object; span=(153, 166), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:15:03 | ERROR | 提取响应失败安全纯净大屏_4_劳务基础配置_绑定TV
regex=None;
keys=None;
deps=None;
jp_dict={"tvSequence": "$..tvSequence"}
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:15:06 | ERROR | key:<re.Match object; span=(166, 179), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-06-25 17:15:06 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:15:06 | ERROR | 提取响应失败安全纯净大屏_5_劳务基础配置_查询配置
regex=None;
keys=None;
deps=None;
jp_dict=None
'TestProjectApi' object has no attribute 'extractor'
2023-06-25 17:16:19 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:49:16 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:49:16 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 17:49:16 | ERROR | 异常用例: 安全纯净大屏_1_清表_初始化查询sql
'NoneType' object has no attribute 'json'
2023-06-25 17:49:17 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:49:17 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 17:49:17 | ERROR | 异常用例: 安全纯净大屏_3_安全大屏_大盘-隐患类型数据
'NoneType' object has no attribute 'json'
2023-06-25 17:49:22 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:49:22 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:49:22 | ERROR | 发送请求失败: expected string or bytes-like object
2023-06-25 17:49:22 | ERROR | 异常用例: 安全纯净大屏_None_None_None
'NoneType' object has no attribute 'json'
2023-06-25 17:54:21 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:54:21 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 17:54:21 | ERROR | 异常用例: 安全纯净大屏_1_清表_初始化查询sql
'NoneType' object has no attribute 'json'
2023-06-25 17:54:22 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:54:22 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 17:54:22 | ERROR | 异常用例: 安全纯净大屏_3_安全大屏_大盘-隐患类型数据
'NoneType' object has no attribute 'json'
2023-06-25 17:54:27 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:54:27 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 17:54:27 | ERROR | 发送请求失败: expected string or bytes-like object
2023-06-25 17:54:27 | ERROR | 异常用例: 安全纯净大屏_None_None_None
'NoneType' object has no attribute 'json'
2023-06-25 17:58:33 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:01:49 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:02:20 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:02:20 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 18:02:20 | ERROR | 异常用例: 安全纯净大屏_1_清表_初始化查询sql
'NoneType' object has no attribute 'json'
2023-06-25 18:02:21 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:02:21 | ERROR | 发送请求失败: URL cannot be None
2023-06-25 18:02:21 | ERROR | 异常用例: 安全纯净大屏_3_安全大屏_大盘-隐患类型数据
'NoneType' object has no attribute 'json'
2023-06-25 18:02:26 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:02:26 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-06-25 18:02:26 | ERROR | 发送请求失败: expected string or bytes-like object
2023-06-25 18:02:26 | ERROR | 异常用例: 安全纯净大屏_None_None_None
'NoneType' object has no attribute 'json'
2023-06-25 18:04:27 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None

View File

@ -1 +0,0 @@
[{"success": 4, "all": 7, "fail": 1, "skip": 0, "error": 2, "runtime": "0.45 S", "begin_time": "2023-04-21 12:10:31", "pass_rate": "57.14"}, {"success": 0, "all": 1, "fail": 0, "skip": 0, "error": 1, "runtime": "0.01 S", "begin_time": "2023-04-21 12:11:52", "pass_rate": "0.00"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.33 S", "begin_time": "2023-04-21 12:12:54", "pass_rate": "83.33"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.30 S", "begin_time": "2023-04-21 12:13:32", "pass_rate": "83.33"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.28 S", "begin_time": "2023-04-21 14:47:43", "pass_rate": "83.33"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.27 S", "begin_time": "2023-04-21 15:01:06", "pass_rate": "83.33"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.24 S", "begin_time": "2023-04-21 15:03:53", "pass_rate": "83.33"}, {"success": 5, "all": 6, "fail": 1, "skip": 0, "error": 0, "runtime": "0.23 S", "begin_time": "2023-04-21 15:06:10", "pass_rate": "83.33"}, {"success": 6, "all": 7, "fail": 0, "skip": 0, "error": 1, "runtime": "3.00 S", "begin_time": "2023-05-14 23:58:13", "pass_rate": "85.71"}, {"success": 0, "all": 2, "fail": 0, "skip": 0, "error": 2, "runtime": "0.02 S", "begin_time": "2023-05-15 11:52:27", "pass_rate": "0.00"}, {"success": 0, "all": 2, "fail": 0, "skip": 0, "error": 2, "runtime": "0.00 S", "begin_time": "2023-05-15 11:57:23", "pass_rate": "0.00"}, {"success": 6, "all": 7, "fail": 0, "skip": 0, "error": 1, "runtime": "1.38 S", "begin_time": "2023-05-15 11:59:30", "pass_rate": "85.71"}, {"success": 6, "all": 7, "fail": 0, "skip": 0, "error": 1, "runtime": "1.44 S", "begin_time": "2023-05-16 15:11:50", "pass_rate": "85.71"}, {"success": 6, "all": 7, "fail": 0, "skip": 0, "error": 1, "runtime": "1.28 S", "begin_time": "2023-05-17 17:12:52", "pass_rate": "85.71"}, {"success": 0, "all": 1, "fail": 0, "skip": 0, "error": 1, "runtime": "0.00 S", "begin_time": "2023-05-17 17:17:15", "pass_rate": "0.00"}, {"success": 6, "all": 6, "fail": 0, "skip": 0, "error": 0, "runtime": "1.33 S", "begin_time": "2023-05-17 17:21:07", "pass_rate": "100.00"}, {"success": 0, "all": 1, "fail": 0, "skip": 0, "error": 1, "runtime": "0.00 S", "begin_time": "2023-06-14 15:16:14", "pass_rate": "0.00"}, {"success": 82, "all": 82, "fail": 0, "skip": 0, "error": 0, "runtime": "6.38 S", "begin_time": "2023-06-16 16:22:27", "pass_rate": "100.00"}, {"success": 6, "all": 6, "fail": 0, "skip": 0, "error": 0, "runtime": "6.32 S", "begin_time": "2023-06-16 16:26:52", "pass_rate": "100.00"}, {"success": 6, "all": 6, "fail": 0, "skip": 0, "error": 0, "runtime": "6.35 S", "begin_time": "2023-06-16 16:30:50", "pass_rate": "100.00"}, {"success": 6, "all": 6, "fail": 0, "skip": 0, "error": 0, "runtime": "6.33 S", "begin_time": "2023-06-16 16:32:32", "pass_rate": "100.00"}, {"success": 6, "all": 6, "fail": 0, "skip": 0, "error": 0, "runtime": "6.32 S", "begin_time": "2023-06-16 16:36:00", "pass_rate": "100.00"}]

View File

@ -0,0 +1 @@
2023-06-25 22:14:00 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None

Binary file not shown.

34
Pipfile
View File

@ -1,39 +1,11 @@
[[source]]
url = "https://mirrors.aliyun.com/pypi/simple/"
url = "https://pypi.org/simple"
verify_ssl = true
name = "pip_conf_index_global"
name = "pypi"
[packages]
jsonpath = "*"
pymongo = "*"
crypto = "*"
pytesseract = "*"
rsa = "*"
pydes = "*"
pycryptodome = "*"
jsonpath-ng = "*"
redis = "*"
pymysql = "*"
openpyxl = "*"
faker = "*"
pypinyin = "*"
ddt = "*"
rich = "*"
natsort = "*"
ddddocr = "*"
unittestreport = "*"
prettytable = "*"
pytest = "*"
pika = "*"
paho-mqtt = "*"
requests-html = "*"
loguru = "*"
tree = "*"
dbutils = "*"
flask = "*"
[dev-packages]
[requires]
python_version = ">=3.9"
python_full_version = "3.9.5"
python_version = "3.9"

1111
Pipfile.lock generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -14,80 +14,80 @@ import paho.mqtt.client as mqtt
class MQTTClient:
def __init__(self, broker_address, topic):
self.broker_address = broker_address
self.topic = topic
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code " + str(rc))
def on_publish(self, client, userdata, mid):
print("Message " + str(mid) + " published.")
def send_message(self, message):
client = mqtt.Client()
client.on_connect = self.on_connect
client.on_publish = self.on_publish
client.connect(self.broker_address)
client.loop_start()
client.publish(self.topic, json.dumps(message))
client.loop_stop()
def __init__(self, broker_address, topic):
self.broker_address = broker_address
self.topic = topic
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code " + str(rc))
def on_publish(self, client, userdata, mid):
print("Message " + str(mid) + " published.")
def send_message(self, message):
client = mqtt.Client()
client.on_connect = self.on_connect
client.on_publish = self.on_publish
client.connect(self.broker_address)
client.loop_start()
client.publish(self.topic, json.dumps(message))
client.loop_stop()
msg = {
"datapoint": [
{
"value": "492875336",
"type": "string",
"index": "0"
},
{
"value": "2023-04-24T15:48:33.128Z",
"type": "string",
"index": "6"
},
{
"value": 0,
"type": "byte",
"index": "7"
},
{
"value": "11132.00",
"type": "float",
"index": "8"
},
{
"index": "11",
"type": "string",
"value": "粤EJC5V3"
},
{
"index": "12",
"type": "string",
"value": "1"
},
{
"index": "13",
"type": "string",
"value": "http://192.1.14.19/document/fileStore/viewPicture/08188228a79b42ffa6b32a85f08b38ba"
},
{
"index": "14",
"type": "string",
"value": "https://ibs-test.bzlrobot.com/dfs/get?fileName=In-rear-pic.jpg&group=group1&path=M00/0A/4F/CgjLoWDiwteEBoWJAAAAANRLO4A310.jpg"
},
{
"index": "18",
"type": "string",
"value": "20230423174821"
}
],
"from_id": "492875336",
"msg_id": "1682243313128531625",
"time": "2023-04-23T19:48:33.128Z",
"type": "SYNC"
"datapoint": [
{
"value": "492875336",
"type": "string",
"index": "0"
},
{
"value": "2023-04-24T15:48:33.128Z",
"type": "string",
"index": "6"
},
{
"value": 0,
"type": "byte",
"index": "7"
},
{
"value": "11132.00",
"type": "float",
"index": "8"
},
{
"index": "11",
"type": "string",
"value": "粤EJC5V3"
},
{
"index": "12",
"type": "string",
"value": "1"
},
{
"index": "13",
"type": "string",
"value": "http://192.1.14.19/document/fileStore/viewPicture/08188228a79b42ffa6b32a85f08b38ba"
},
{
"index": "14",
"type": "string",
"value": "https://ibs-test.bzlrobot.com/dfs/get?fileName=In-rear-pic.jpg&group=group1&path=M00/0A/4F/CgjLoWDiwteEBoWJAAAAANRLO4A310.jpg"
},
{
"index": "18",
"type": "string",
"value": "20230423174821"
}
],
"from_id": "492875336",
"msg_id": "1682243313128531625",
"time": "2023-04-23T19:48:33.128Z",
"type": "SYNC"
}
if __name__ == '__main__':
p = sys.argv[0]
rab = MQTTClient(broker_address='192.2.3.59', topic='weigh/492875336/rtdata')
rab.send_message(msg)
p = sys.argv[0]
rab = MQTTClient(broker_address='192.2.3.59', topic='weigh/492875336/rtdata')
rab.send_message(msg)

View File

@ -13,110 +13,111 @@ import pika
class RabbitMQClient:
def __init__(self, host, queue_name=None, exchange_name=None, exchange_type=None, routing_key=None):
"""
RabbitMQClient 类的构造函数AMQP 协议默认
参数
- host: RabbitMQ 服务器的主机地址
- queue_name: 队列名称如果指定了该参数则消息将被发送到指定的队列
- exchange_name: 主题交换机名称如果指定了该参数则消息将被发送到指定的主题交换机
- exchange_type: 主题交换机类型如果指定了 exchange_name 参数则必须指定此参数例如'direct' 'topic'
- routing_key: 路由键如果指定了 exchange_name 参数则必须指定此参数路由键用于将消息路由到特定的队列
"""
self.host = host
self.queue_name = queue_name
self.exchange_name = exchange_name
self.exchange_type = exchange_type
self.routing_key = routing_key
self.connection = None
self.channel = None
def connect(self):
"""
连接到 RabbitMQ 服务器并根据需要声明队列和交换机
"""
# 连接到 RabbitMQ 服务器
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host))
self.channel = self.connection.channel()
# 如果指定了 exchange_name 参数,则声明主题交换机
if self.exchange_name:
self.channel.exchange_declare(exchange=self.exchange_name, exchange_type=self.exchange_type)
# 如果指定了 queue_name 参数,则声明队列,并将其绑定到主题交换机上
if self.queue_name:
self.channel.queue_declare(queue=self.queue_name)
if self.exchange_name:
self.channel.queue_bind(queue=self.queue_name, exchange=self.exchange_name,
routing_key=self.routing_key)
def send_message(self, message):
"""
发送一条消息到指定的队列或主题
参数
- message: 要发送的消息
"""
# 如果指定了 queue_name 参数,则将消息发送到指定的队列
if self.queue_name:
self.channel.basic_publish(exchange='', routing_key=self.queue_name, body=message)
# 如果指定了 exchange_name 参数,则将消息发送到指定的主题交换机
elif self.exchange_name:
self.channel.basic_publish(exchange=self.exchange_name, routing_key=self.routing_key, body=message)
def close(self):
"""
关闭与 RabbitMQ 的连接
"""
self.connection.close()
def __init__(self, host, queue_name=None, exchange_name=None, exchange_type=None, routing_key=None):
"""
RabbitMQClient 类的构造函数AMQP 协议默认
参数
- host: RabbitMQ 服务器的主机地址
- queue_name: 队列名称如果指定了该参数则消息将被发送到指定的队列
- exchange_name: 主题交换机名称如果指定了该参数则消息将被发送到指定的主题交换机
- exchange_type: 主题交换机类型如果指定了 exchange_name 参数则必须指定此参数例如'direct' 'topic'
- routing_key: 路由键如果指定了 exchange_name 参数则必须指定此参数路由键用于将消息路由到特定的队列
"""
self.host = host
self.queue_name = queue_name
self.exchange_name = exchange_name
self.exchange_type = exchange_type
self.routing_key = routing_key
self.connection = None
self.channel = None
def connect(self):
"""
连接到 RabbitMQ 服务器并根据需要声明队列和交换机
"""
# 连接到 RabbitMQ 服务器
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host))
self.channel = self.connection.channel()
# 如果指定了 exchange_name 参数,则声明主题交换机
if self.exchange_name:
self.channel.exchange_declare(exchange=self.exchange_name, exchange_type=self.exchange_type)
# 如果指定了 queue_name 参数,则声明队列,并将其绑定到主题交换机上
if self.queue_name:
self.channel.queue_declare(queue=self.queue_name)
if self.exchange_name:
self.channel.queue_bind(queue=self.queue_name, exchange=self.exchange_name,
routing_key=self.routing_key)
def send_message(self, message):
"""
发送一条消息到指定的队列或主题
参数
- message: 要发送的消息
"""
# 如果指定了 queue_name 参数,则将消息发送到指定的队列
if self.queue_name:
self.channel.basic_publish(exchange='', routing_key=self.queue_name, body=message)
# 如果指定了 exchange_name 参数,则将消息发送到指定的主题交换机
elif self.exchange_name:
self.channel.basic_publish(exchange=self.exchange_name, routing_key=self.routing_key,
body=message)
def close(self):
"""
关闭与 RabbitMQ 的连接
"""
self.connection.close()
if __name__ == '__main__':
msg = {
"datapoint": [
{
"value": "492875336",
"type": "string",
"index": "0"
},
{
"value": "2023-04-23T17:48:33.128Z",
"type": "string",
"index": "6"
},
{
"value": 0,
"type": "byte",
"index": "7"
},
{
"value": "11132.00",
"type": "float",
"index": "8"
},
{
"index": "11",
"type": "string",
"value": "粤EJC5V3"
},
{
"index": "12",
"type": "string",
"value": "1"
},
{
"index": "18",
"type": "string",
"value": "20230423174821"
}
],
"from_id": "492875336",
"msg_id": "1682243313128531625",
"time": "2023-04-23T17:48:33.128Z",
"type": "SYNC"
}
rab = RabbitMQClient(host='192.1.1.59:1883', exchange_name='/bridge/492/rtdata',
# exchange_type='topic',
# routing_key='connected'
)
rab.send_message(json.dumps(msg))
msg = {
"datapoint": [
{
"value": "492875336",
"type": "string",
"index": "0"
},
{
"value": "2023-04-23T17:48:33.128Z",
"type": "string",
"index": "6"
},
{
"value": 0,
"type": "byte",
"index": "7"
},
{
"value": "11132.00",
"type": "float",
"index": "8"
},
{
"index": "11",
"type": "string",
"value": "粤EJC5V3"
},
{
"index": "12",
"type": "string",
"value": "1"
},
{
"index": "18",
"type": "string",
"value": "20230423174821"
}
],
"from_id": "492875336",
"msg_id": "1682243313128531625",
"time": "2023-04-23T17:48:33.128Z",
"type": "SYNC"
}
rab = RabbitMQClient(host='192.1.1.59:1883', exchange_name='/bridge/492/rtdata',
# exchange_type='topic',
# routing_key='connected'
)
rab.send_message(json.dumps(msg))

View File

@ -9,4 +9,4 @@
# logger = MyLogger()
if __name__ == '__main__':
pass
pass

View File

@ -15,46 +15,46 @@ __all__ = ['get_current_date', 'get_current_time', 'get_delta_time']
@logger.log_decorator()
def get_current_date(fmt="%Y-%m-%d"):
"""
获取当前日期默认格式为%Y-%m-%d
Args:
fmt: 日期格式
Returns:
"""
return datetime.now().strftime(fmt)
"""
获取当前日期默认格式为%Y-%m-%d
Args:
fmt: 日期格式
Returns:
"""
return datetime.now().strftime(fmt)
@logger.log_decorator()
def get_current_time(fmt="%Y-%m-%d %H:%M:%S"):
"""
获取当前时间默认格式为%Y-%m-%d %H:%M:%S
Args:
fmt: 时间格式
Returns:
"""
return datetime.now().strftime(fmt)
"""
获取当前时间默认格式为%Y-%m-%d %H:%M:%S
Args:
fmt: 时间格式
Returns:
"""
return datetime.now().strftime(fmt)
@logger.log_decorator()
def get_delta_time(days=0, hours=0, minutes=0, seconds=0, fmt="%Y-%m-%d %H:%M:%S"):
"""
获取当前时间指定间隔后的时间
Args:
days:距离当前时间多少天
hours:距离当前时间多少时
minutes:距离当前时间多少分
seconds: 距离当前时间多少秒
fmt: 时间格式
Returns:
"""
return (datetime.now() + timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)).strftime(fmt)
"""
获取当前时间指定间隔后的时间
Args:
days:距离当前时间多少天
hours:距离当前时间多少时
minutes:距离当前时间多少分
seconds: 距离当前时间多少秒
fmt: 时间格式
Returns:
"""
return (datetime.now() + timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)).strftime(fmt)
if __name__ == '__main__':
get_delta_time(4)
get_delta_time(4)

View File

@ -16,17 +16,17 @@ from common.bif_functions import logger
@logger.log_decorator()
def md5_encryption(raw_str, sha_str='', toupper=False):
"""
执行md5加密
Args:
raw_str: 原始字符串
sha_str: md5加密的盐值
toupper: 是否将加密后的结果转大写
Returns: 经md5加密后的字符串
"""
md5_obj = hashlib.md5(sha_str.encode('utf-8'))
md5_obj.update(str(raw_str).encode('utf-8'))
encrypted_str = md5_obj.hexdigest().upper() if toupper else md5_obj.hexdigest()
return encrypted_str
"""
执行md5加密
Args:
raw_str: 原始字符串
sha_str: md5加密的盐值
toupper: 是否将加密后的结果转大写
Returns: 经md5加密后的字符串
"""
md5_obj = hashlib.md5(sha_str.encode('utf-8'))
md5_obj.update(str(raw_str).encode('utf-8'))
encrypted_str = md5_obj.hexdigest().upper() if toupper else md5_obj.hexdigest()
return encrypted_str

View File

@ -16,25 +16,25 @@ __all__ = ['json_dumps', 'json_loads']
@logger.log_decorator()
def json_dumps(obj):
"""
Serialize ``obj`` to a JSON formatted ``str``.
Args:
obj:
Returns:
"""
return json.dumps(obj, ensure_ascii=False)
"""
Serialize ``obj`` to a JSON formatted ``str``.
Args:
obj:
Returns:
"""
return json.dumps(obj, ensure_ascii=False)
@logger.log_decorator()
def json_loads(obj):
"""
Deserialize ``obj`` (a ``str``, ``bytes`` or ``bytearray`` instance containing a JSON document) to a Python object.
Args:
obj:
Returns:
"""
return json.loads(obj)
"""
Deserialize ``obj`` (a ``str``, ``bytes`` or ``bytearray`` instance containing a JSON document) to a Python object.
Args:
obj:
Returns:
"""
return json.loads(obj)

View File

@ -14,65 +14,65 @@ __all__ = ['list_slice', 'sublist']
@logger.log_decorator()
def list_slice(obj, index=None, start=None, end=None, step=1):
"""
切片方法
Args:
obj:
index: 索引
start: 开始索引
end: 结束索引不含
step: 步长
Returns:
"""
if isinstance(obj, (str, tuple, list)):
if index is not None:
try:
return obj[index]
except IndexError:
return
else:
return obj[start:end:step]
return None
"""
切片方法
Args:
obj:
index: 索引
start: 开始索引
end: 结束索引不含
step: 步长
Returns:
"""
if isinstance(obj, (str, tuple, list)):
if index is not None:
try:
return obj[index]
except IndexError:
return
else:
return obj[start:end:step]
return None
@logger.log_decorator()
def sublist(raw_list, start=None, end=None):
"""
截取子列表
Args:
raw_list: 原始列表
start: 字符串开始位置
end: 字符串结束位置
Returns: 截取的字符串或子列表
"""
if isinstance(raw_list, (str, list)) and isinstance(start, (int, str)) and isinstance(end, (int, str)):
try:
start = int(start) if isinstance(start, str) and start.isdigit() else start
end = int(end) if isinstance(end, str) and end.isdigit() else end
if isinstance(raw_list, str):
return list(raw_list[start:end])
else:
return raw_list[start:end]
except TypeError:
pass
return []
"""
截取子列表
Args:
raw_list: 原始列表
start: 字符串开始位置
end: 字符串结束位置
Returns: 截取的字符串或子列表
"""
if isinstance(raw_list, (str, list)) and isinstance(start, (int, str)) and isinstance(end, (int, str)):
try:
start = int(start) if isinstance(start, str) and start.isdigit() else start
end = int(end) if isinstance(end, str) and end.isdigit() else end
if isinstance(raw_list, str):
return list(raw_list[start:end])
else:
return raw_list[start:end]
except TypeError:
pass
return []
if __name__ == '__main__':
# lst = [1, 2, 3, 4, 5]
# print(list_slice(lst, index=2)) # 3
# print(list_slice(lst, start=1, end=4)) # [2, 3, 4]
# print(list_slice(lst, start=1, end=4, step=2)) # [2, 4]
# print(list_slice(123)) # None
raw_list = ['a', 'b', 'c', 'd', 'e']
print(sublist(raw_list, start=1, end=4)) # ['b', 'c', 'd']
print(sublist(raw_list, start='1', end='4')) # ['b', 'c', 'd']
print(sublist(raw_list, start='x', end='4')) # []
print(sublist(raw_list, start=1, end=10)) # ['b', 'c', 'd', 'e']
print(sublist('abcdef', start=1, end=4)) # ['b', 'c', 'd']
print(sublist(123, start=1, end=4)) # []
# lst = [1, 2, 3, 4, 5]
# print(list_slice(lst, index=2)) # 3
# print(list_slice(lst, start=1, end=4)) # [2, 3, 4]
# print(list_slice(lst, start=1, end=4, step=2)) # [2, 4]
# print(list_slice(123)) # None
raw_list = ['a', 'b', 'c', 'd', 'e']
print(sublist(raw_list, start=1, end=4)) # ['b', 'c', 'd']
print(sublist(raw_list, start='1', end='4')) # ['b', 'c', 'd']
print(sublist(raw_list, start='x', end='4')) # []
print(sublist(raw_list, start=1, end=10)) # ['b', 'c', 'd', 'e']
print(sublist('abcdef', start=1, end=4)) # ['b', 'c', 'd']
print(sublist(123, start=1, end=4)) # []

View File

@ -12,44 +12,43 @@ import string
from common.bif_functions import logger
__all__ = ['random_choice', 'gen_random_num', 'gen_random_str']
@logger.log_decorator()
def random_choice(args):
"""
随机选择
Args:
args:
Returns:
"""
return random.choice(args)
"""
随机选择
Args:
args:
Returns:
"""
return random.choice(args)
@logger.log_decorator()
def gen_random_num(length):
"""
随机生成指定长度的数字
Args:
length: 指定长度
Returns:
"""
return random.randint(int('1' + '0' * (length - 1)), int('9' * length))
"""
随机生成指定长度的数字
Args:
length: 指定长度
Returns:
"""
return random.randint(int('1' + '0' * (length - 1)), int('9' * length))
@logger.log_decorator()
def gen_random_str(length):
"""
生成指定长度的随机字符串
Args:
length: 指定长度
Returns:
"""
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
"""
生成指定长度的随机字符串
Args:
length: 指定长度
Returns:
"""
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))

View File

@ -17,25 +17,25 @@ __all__ = ['regex_extract']
@logger.log_decorator()
def regex_extract(string, pattern, group=None):
"""
根据正则表达式提取内容
Args:
string: 字符串
pattern: 正则表达式
group: 分组组号
Returns:
"""
if not isinstance(string, str):
string = json.dumps(string, ensure_ascii=False)
re_obj = re.search(pattern, string)
result = None
if re_obj:
result = re_obj.group(0)
if group:
try:
result = re_obj.group(group)
except IndexError:
pass
return result
"""
根据正则表达式提取内容
Args:
string: 字符串
pattern: 正则表达式
group: 分组组号
Returns:
"""
if not isinstance(string, str):
string = json.dumps(string, ensure_ascii=False)
re_obj = re.search(pattern, string)
result = None
if re_obj:
result = re_obj.group(0)
if group:
try:
result = re_obj.group(group)
except IndexError:
pass
return result

View File

@ -16,48 +16,48 @@ logger = MyLogger()
@logger.log_decorator()
def substr(raw_str, start=None, end=None):
"""
截取字符串
Args:
raw_str: 原始字符串
start: 字符串开始位置
end: 字符串结束位置
Returns: 截取的字符串
"""
try:
start = int(start) if (isinstance(start, str) and start.isdigit()) else start
end = int(end) if (isinstance(end, str) and end.isdigit()) else end
return raw_str[start:end]
except TypeError as e:
return ''
"""
截取字符串
Args:
raw_str: 原始字符串
start: 字符串开始位置
end: 字符串结束位置
Returns: 截取的字符串
"""
try:
start = int(start) if (isinstance(start, str) and start.isdigit()) else start
end = int(end) if (isinstance(end, str) and end.isdigit()) else end
return raw_str[start:end]
except TypeError as e:
return ''
@logger.log_decorator()
def str_join(obj, connector=","):
"""
连接任意数量的字符
Args:
obj: 被连接对象类型listtuple
connector: 连接符
Returns:
"""
if not isinstance(connector, str):
connector = str(connector)
if isinstance(obj, str):
return obj
elif isinstance(obj, (list, tuple)):
temp_obj = []
for item in obj:
if not isinstance(item, str):
item = str(item)
temp_obj.append(item)
return connector.join(temp_obj)
"""
连接任意数量的字符
Args:
obj: 被连接对象类型listtuple
connector: 连接符
Returns:
"""
if not isinstance(connector, str):
connector = str(connector)
if isinstance(obj, str):
return obj
elif isinstance(obj, (list, tuple)):
temp_obj = []
for item in obj:
if not isinstance(item, str):
item = str(item)
temp_obj.append(item)
return connector.join(temp_obj)
if __name__ == '__main__':
substr()
str_join()
substr()
str_join()

View File

@ -16,45 +16,45 @@ __all__ = ['get_timestamp', 'ms_fmt_hms']
@logger.log_decorator("错误原因时间戳的长度只能在10到16位之间默认返回长度为13位的时间戳")
def get_timestamp(length=13):
"""
获取时间戳字符串长度最多为16位默认13位
Args:
length: 时间戳长度
Returns:
"""
if isinstance(length, (int,)) and 10 <= length <= 16:
power = length - 10
timestamp = time.time()
return int(timestamp * 10 ** power)
else:
get_timestamp(13)
"""
获取时间戳字符串长度最多为16位默认13位
Args:
length: 时间戳长度
Returns:
"""
if isinstance(length, (int,)) and 10 <= length <= 16:
power = length - 10
timestamp = time.time()
return int(timestamp * 10 ** power)
else:
get_timestamp(13)
@logger.log_decorator()
def ms_fmt_hms(ms):
"""
将毫秒转换成 h:m:s.ms格式字符串
Args:
ms:
Returns:
"""
ms = int(ms)
sec = ms // 1000
hour = sec // 3600
minute = (sec - hour * 3600) // 60
sec = sec % 60
ms = ms % 1000
hour = str(hour).rjust(2, '0')
minute = str(minute).rjust(2, '0')
sec = str(sec).rjust(2, '0')
ms = str(ms).rjust(2, '0')
return f"{hour}:{minute}:{sec}.{ms}"
"""
将毫秒转换成 h:m:s.ms格式字符串
Args:
ms:
Returns:
"""
ms = int(ms)
sec = ms // 1000
hour = sec // 3600
minute = (sec - hour * 3600) // 60
sec = sec % 60
ms = ms % 1000
hour = str(hour).rjust(2, '0')
minute = str(minute).rjust(2, '0')
sec = str(sec).rjust(2, '0')
ms = str(ms).rjust(2, '0')
return f"{hour}:{minute}:{sec}.{ms}"
if __name__ == '__main__':
get_timestamp()
get_timestamp()

View File

@ -6,109 +6,109 @@ import random
from faker import Faker
__all__ = [
'random_phone', 'random_gps',
"random_string", "random_ssn",
"random_email", "random_id_card",
"random_int", "random_male_name",
"random_female_name", "random_current_time"
'random_phone', 'random_gps',
"random_string", "random_ssn",
"random_email", "random_id_card",
"random_int", "random_male_name",
"random_female_name", "random_current_time"
]
f = Faker(locale='Zh-CN')
def random_gps(base_log=None, base_lat=None, radius=None):
"""
Args:
base_log:
base_lat:
radius:
Returns:
"""
radius_in_degrees = radius / 111300
u = float(random.uniform(0.0, 1.0))
v = float(random.uniform(0.0, 1.0))
w = radius_in_degrees * math.sqrt(u)
t = 2 * math.pi * v
x = w * math.cos(t)
y = w * math.sin(t)
longitude = y + base_log
latitude = x + base_lat
# 这里是想保留6位小数点
loga = '%.6f' % longitude
lat = '%.6f' % latitude
return loga, lat
"""
Args:
base_log:
base_lat:
radius:
Returns:
"""
radius_in_degrees = radius / 111300
u = float(random.uniform(0.0, 1.0))
v = float(random.uniform(0.0, 1.0))
w = radius_in_degrees * math.sqrt(u)
t = 2 * math.pi * v
x = w * math.cos(t)
y = w * math.sin(t)
longitude = y + base_log
latitude = x + base_lat
# 这里是想保留6位小数点
loga = '%.6f' % longitude
lat = '%.6f' % latitude
return loga, lat
def random_string():
"""
:return:随机生成字符串,20
"""
return f.pystr()
"""
:return:随机生成字符串,20
"""
return f.pystr()
def random_ssn():
"""
:return:随机生成省份中
"""
return f.ssn()
"""
:return:随机生成省份中
"""
return f.ssn()
def random_phone(self) -> int:
"""
:return: 随机生成手机号码
"""
return f.phone_number()
"""
:return: 随机生成手机号码
"""
return f.phone_number()
def random_id_card(self) -> int:
"""
:return: 随机生成身份证号码
"""
return f.ssn()
"""
:return: 随机生成身份证号码
"""
return f.ssn()
def random_female_name(self) -> str:
"""
:return: 女生姓名
"""
return f.name_male()
"""
:return: 女生姓名
"""
return f.name_male()
def random_male_name(self) -> str:
"""
:return: 男生姓名
"""
return f.name_female()
"""
:return: 男生姓名
"""
return f.name_female()
def random_email() -> str:
"""
:return: 生成邮箱
"""
return f.email()
"""
:return: 生成邮箱
"""
return f.email()
def random_current_time() -> datetime.datetime:
"""
计算当前时间
:return:
"""
return datetime.datetime.now()
"""
计算当前时间
:return:
"""
return datetime.datetime.now()
def random_int():
"""随机生成 0 - 9999 的数字"""
return f.random_int()
"""随机生成 0 - 9999 的数字"""
return f.random_int()
if __name__ == '__main__':
print(random_current_time())
print(random_current_time())

View File

@ -2,34 +2,34 @@ import os
class Config:
# 根目录路径
# *****************************************************************
base_path = os.path.dirname(os.path.dirname(__file__))
current_path = os.path.dirname(__file__)
# *****************************************************************
# 测试数据所在路径
# *****************************************************************
templates = os.path.join(base_path, "cases", "templates", "template.xlsx") # 模板文件
test_api = os.path.join(base_path, "cases", "cases", "test_cases.xlsx")
# *****************************************************************
# 测试用例脚本目录
# *****************************************************************
script = os.path.join(base_path, "test_script")
# *****************************************************************
# 测试报告及 logger 所在路径
# *****************************************************************
test_report = os.path.join(base_path, "OutPut", "Reports")
log_path = os.path.join(base_path, "OutPut", "Log")
SCRIPTS_DIR = os.path.join(base_path, "scripts")
# 根目录路径
# *****************************************************************
base_path = os.path.dirname(os.path.dirname(__file__))
current_path = os.path.dirname(__file__)
# *****************************************************************
# 测试数据所在路径
# *****************************************************************
templates = os.path.join(base_path, "cases", "templates", "template.xlsx") # 模板文件
test_case = os.path.join(base_path, "cases", "cases", "test_cases.xlsx")
# *****************************************************************
# 测试用例脚本目录
# *****************************************************************
script = os.path.join(base_path, "test_script")
# *****************************************************************
# 测试报告及 logger 所在路径
# *****************************************************************
test_report = os.path.join(base_path, "output", "reports")
log_path = os.path.join(base_path, "output", "log")
SCRIPTS_DIR = os.path.join(base_path, "scripts")
if __name__ == '__main__':
test = Config()
print(test.base_path)
print(test.test_api)
print(test.test_report)
print(test.test_api)
print(test.current_path)
print(test.SCRIPTS_DIR)
test = Config()
print(test.base_path)
print(test.test_case)
print(test.test_report)
print(test.test_case)
print(test.current_path)
print(test.SCRIPTS_DIR)

View File

@ -14,27 +14,27 @@ from extensions import sign
@logger.log_decorator()
class EncryptData:
def encrypt_data(self, headers_crypto, headers, request_data_crypto, request_data):
encryption_methods = {
"MD5": sign.md5_sign,
"sha1": sign.sha1_sign,
"rsa": lambda data: Rsa(data).rsa_encrypt()
}
if headers_crypto:
encrypt_func = encryption_methods.get(headers_crypto)
if encrypt_func:
try:
headers = encrypt_func(headers)
except Exception as e:
logger.error(f"{headers_crypto} 加密失败:{e}")
if request_data_crypto:
encrypt_func = encryption_methods.get(request_data_crypto)
if encrypt_func:
try:
request_data = encrypt_func(request_data)
except Exception as e:
logger.error(f"{request_data_crypto} 加密失败:{e}")
return headers, request_data
def encrypt_data(self, headers_crypto, headers, request_data_crypto, request_data):
encryption_methods = {
"MD5": sign.md5_sign,
"sha1": sign.sha1_sign,
"rsa": lambda data: Rsa(data).rsa_encrypt()
}
if headers_crypto:
encrypt_func = encryption_methods.get(headers_crypto)
if encrypt_func:
try:
headers = encrypt_func(headers)
except Exception as e:
logger.error(f"{headers_crypto} 加密失败:{e}")
if request_data_crypto:
encrypt_func = encryption_methods.get(request_data_crypto)
if encrypt_func:
try:
request_data = encrypt_func(request_data)
except Exception as e:
logger.error(f"{request_data_crypto} 加密失败:{e}")
return headers, request_data

View File

@ -13,38 +13,38 @@ from Crypto.Cipher import AES
class DoAES:
"""
AES 加密
"""
def __init__(self, key):
self.key = key # 将密钥转换为字符型数据
self.mode = AES.MODE_ECB # 操作模式选择ECB
def encrypt(self, text):
"""加密函数"""
file_aes = AES.new(self.key, self.mode) # 创建AES加密对象
text = text.encode('utf-8') # 明文必须编码成字节流数据即数据类型为bytes
while len(text) % 16 != 0: # 对字节型数据进行长度判断
text += b'\x00' # 如果字节型数据长度不是16倍整数就进行补充
en_text = file_aes.encrypt(text) # 明文进行加密,返回加密后的字节流数据
return str(base64.b64encode(en_text), encoding='utf-8') # 将加密后得到的字节流数据进行base64编码并再转换为unicode类型
def decrypt(self, text):
"""解密函数"""
file_aes = AES.new(self.key, self.mode)
text = bytes(text, encoding='utf-8') # 将密文转换为bytes此时的密文还是由basen64编码过的
text = base64.b64decode(text) # 对密文再进行base64解码
de_text = file_aes.decrypt(text) # 密文进行解密返回明文的bytes
return str(de_text, encoding='utf-8').strip() # 将解密后得到的bytes型数据转换为str型并去除末尾的填充
"""
AES 加密
"""
def __init__(self, key):
self.key = key # 将密钥转换为字符型数据
self.mode = AES.MODE_ECB # 操作模式选择ECB
def encrypt(self, text):
"""加密函数"""
file_aes = AES.new(self.key, self.mode) # 创建AES加密对象
text = text.encode('utf-8') # 明文必须编码成字节流数据即数据类型为bytes
while len(text) % 16 != 0: # 对字节型数据进行长度判断
text += b'\x00' # 如果字节型数据长度不是16倍整数就进行补充
en_text = file_aes.encrypt(text) # 明文进行加密,返回加密后的字节流数据
return str(base64.b64encode(en_text), encoding='utf-8') # 将加密后得到的字节流数据进行base64编码并再转换为unicode类型
def decrypt(self, text):
"""解密函数"""
file_aes = AES.new(self.key, self.mode)
text = bytes(text, encoding='utf-8') # 将密文转换为bytes此时的密文还是由basen64编码过的
text = base64.b64decode(text) # 对密文再进行base64解码
de_text = file_aes.decrypt(text) # 密文进行解密返回明文的bytes
return str(de_text, encoding='utf-8').strip() # 将解密后得到的bytes型数据转换为str型并去除末尾的填充
if __name__ == '__main__':
# key = os.urandom(16) #随即产生n个字节的字符串可以作为随机加密key使用
key = '2l4LoWczlWxlMZJAAp5N0g6EygZZd9A6' # 随即产生n个字节的字符串可以作为随机加密key使用
text = '4534' # 需要加密的内容
aes_test = DoAES(key)
cipher_text = aes_test.encrypt(text)
init_text = aes_test.decrypt(cipher_text)
print('加密后:' + cipher_text)
print('解密后:' + init_text)
# key = os.urandom(16) #随即产生n个字节的字符串可以作为随机加密key使用
key = '2l4LoWczlWxlMZJAAp5N0g6EygZZd9A6' # 随即产生n个字节的字符串可以作为随机加密key使用
text = '4534' # 需要加密的内容
aes_test = DoAES(key)
cipher_text = aes_test.encrypt(text)
init_text = aes_test.decrypt(cipher_text)
print('加密后:' + cipher_text)
print('解密后:' + init_text)

File diff suppressed because one or more lines are too long

View File

@ -9,27 +9,27 @@ from common.crypto.encryption_rsa import Rsa
@logger.log_decorator()
def do_encrypt(method, data):
if method == "MD5":
try:
res = sign.md5_sign(data)
return res
except Exception as e:
logger.error(f"MD5 加密失败:{e}")
elif method == "sha1":
try:
res = sign.sha1_sign(data)
return res
except Exception as e:
logger.error(f"sha1 加密失败:{e}")
elif method == 'rsa':
try:
res = Rsa(data).rsa_encrypt()
return res
except Exception as e:
logger.error(f"Rsa 加密失败:{e}")
else:
return data
if method == "MD5":
try:
res = sign.md5_sign(data)
return res
except Exception as e:
logger.error(f"MD5 加密失败:{e}")
elif method == "sha1":
try:
res = sign.sha1_sign(data)
return res
except Exception as e:
logger.error(f"sha1 加密失败:{e}")
elif method == 'rsa':
try:
res = Rsa(data).rsa_encrypt()
return res
except Exception as e:
logger.error(f"Rsa 加密失败:{e}")
else:
return data
if __name__ == '__main__':
do_encrypt("sha1", {})
do_encrypt("sha1", {})

View File

@ -12,28 +12,28 @@ import rsa
class Rsa:
def __init__(self, st: str):
self.st = st
# rsa加密
def rsa_encrypt(self):
# 生成公钥、私钥
(pubkey, privkey) = rsa.newkeys(1024)
print("公钥: ", pubkey)
print("私钥: ", privkey)
# 明文编码格式
content = self.st.encode('utf-8')
# 公钥加密
crypto = rsa.encrypt(content, pubkey)
# # 一般加密的密文会以base64编码的方式输出
b_res = base64.b64encode(crypto).decode()
return b_res, privkey
# rsa解密
def rsa_decrypt(self, pk):
# 私钥解密
st = base64.b64decode(self.st.encode())
content = rsa.decrypt(st, pk)
con = content.decode('utf-8')
return con
def __init__(self, st: str):
self.st = st
# rsa加密
def rsa_encrypt(self):
# 生成公钥、私钥
(pubkey, privkey) = rsa.newkeys(1024)
print("公钥: ", pubkey)
print("私钥: ", privkey)
# 明文编码格式
content = self.st.encode('utf-8')
# 公钥加密
crypto = rsa.encrypt(content, pubkey)
# # 一般加密的密文会以base64编码的方式输出
b_res = base64.b64encode(crypto).decode()
return b_res, privkey
# rsa解密
def rsa_decrypt(self, pk):
# 私钥解密
st = base64.b64decode(self.st.encode())
content = rsa.decrypt(st, pk)
con = content.decode('utf-8')
return con

View File

@ -14,122 +14,123 @@ import binascii
import rsa
from pyDes import des, CBC, PAD_PKCS5
# from Crypto.Cipher import AES
def bs64_data_encode(st):
"""
base64 加密
Args:
st:
Returns:
"""
return base64.b64encode(st.encode("utf-8"))
"""
base64 加密
Args:
st:
Returns:
"""
return base64.b64encode(st.encode("utf-8"))
def bs64_data_decode(st):
"""
base64 解密
Args:
st:
Returns:
"""
return base64.b64decode(st).decode()
"""
base64 解密
Args:
st:
Returns:
"""
return base64.b64decode(st).decode()
def md5(st: str) -> str:
"""
Args:
st:待加密字符串
Returns: 返回MD5 加密后的字符串
"""
md = hashlib.md5() # 创建MD5对象
md.update(st.encode(encoding="utf-8"))
return md.hexdigest()
"""
Args:
st:待加密字符串
Returns: 返回MD5 加密后的字符串
"""
md = hashlib.md5() # 创建MD5对象
md.update(st.encode(encoding="utf-8"))
return md.hexdigest()
def sha1_secret_str(st):
"""
使用sha1加密算法返回str加密后的字符串
Args:
st:
Returns:
"""
sha = hashlib.sha1(st.encode("utf-8"))
return sha.hexdigest()
"""
使用sha1加密算法返回str加密后的字符串
Args:
st:
Returns:
"""
sha = hashlib.sha1(st.encode("utf-8"))
return sha.hexdigest()
def sha256_single(st):
"""
sha256加密
Args:
st: 加密字符串
Returns:加密结果转换为16进制字符串并大写
"""
sha_obj = hashlib.sha256()
sha_obj.update(st.encode("utf-8"))
return sha_obj.hexdigest().upper()
"""
sha256加密
Args:
st: 加密字符串
Returns:加密结果转换为16进制字符串并大写
"""
sha_obj = hashlib.sha256()
sha_obj.update(st.encode("utf-8"))
return sha_obj.hexdigest().upper()
class Des:
def __init__(self, text, key):
self.text = text # 原始字符串
self.KEY = key # 这个key是固定问开发
def des_encrypt(self):
"""DES 加密
Returns:加密后字符串16进制
"""
secret_key = self.KEY # 密码
iv = secret_key # 偏移
# secret_key:加密密钥CBC:加密模式iv:偏移, padmode:填充
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
# 返回为字节
secret_bytes = des_obj.encrypt(self.text.encode("utf-8"), padmode=PAD_PKCS5)
# 返回为16进制
return binascii.b2a_hex(secret_bytes)
def des_decrypt(self):
"""
DES 解密
Returns:解密后的字符串
"""
secret_key = self.KEY
iv = secret_key
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
decrypt_str = des_obj.decrypt(binascii.a2b_hex(self.text), padmode=PAD_PKCS5)
return bytes.decode(decrypt_str) # bytes.decode() 将bit转为str
def __init__(self, text, key):
self.text = text # 原始字符串
self.KEY = key # 这个key是固定问开发
def des_encrypt(self):
"""DES 加密
Returns:加密后字符串16进制
"""
secret_key = self.KEY # 密码
iv = secret_key # 偏移
# secret_key:加密密钥CBC:加密模式iv:偏移, padmode:填充
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
# 返回为字节
secret_bytes = des_obj.encrypt(self.text.encode("utf-8"), padmode=PAD_PKCS5)
# 返回为16进制
return binascii.b2a_hex(secret_bytes)
def des_decrypt(self):
"""
DES 解密
Returns:解密后的字符串
"""
secret_key = self.KEY
iv = secret_key
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
decrypt_str = des_obj.decrypt(binascii.a2b_hex(self.text), padmode=PAD_PKCS5)
return bytes.decode(decrypt_str) # bytes.decode() 将bit转为str
def add_to_16(text: str):
"""
使用空格补足16位数
Args:
text:源字符串
Returns:补位后字符串
"""
b_text = text.encode("utf-8")
add = 0
# 计算需要补的位数
if len(b_text) % 16:
add = 16 - len(b_text) % 16
return b_text + b'\0' * add
"""
使用空格补足16位数
Args:
text:源字符串
Returns:补位后字符串
"""
b_text = text.encode("utf-8")
add = 0
# 计算需要补的位数
if len(b_text) % 16:
add = 16 - len(b_text) % 16
return b_text + b'\0' * add
# class AesEcb:
#
@ -192,5 +193,3 @@ def add_to_16(text: str):
# msg_text = self.aes.decrypt(res)
# decrypt_text = self.unpad(msg_text).decode('utf8')
# return decrypt_text

View File

@ -15,50 +15,50 @@
class AnalysisJson:
def get_target_value(self, key, dic, tmp_list):
"""
:param key: 目标 key 的值
:param dic: json 数据
:param tmp_list: 用于储蓄获取到的数据
:return: 返回储蓄数据的 list
"""
if not isinstance(dic, dict) or not isinstance(tmp_list, list):
msg = "argv[1] not an dict or argv[-1] not an list "
return msg
if key in dic.keys():
tmp_list.append(dic[key]) # 传入数据如果存在 dict 则将字典遍历一次存入到 tmp_list 中
for value in dic.values(): # 传入数据不符合则对其value 值进行遍历
if isinstance(value, dict):
self.get_target_value(key, value, tmp_list) # 传入数据的value 是字典,则直接调用自身
elif isinstance(value, (list, tuple)):
self.get_value(key, value, tmp_list) # 传入数据的value值是列表或者元组则调用 get_value
else:
for value in dic.values(): # 遍历传入的字典值,value 为dic的值
if isinstance(value, dict): # 判断 value 是否字典
self.get_target_value(key, value, tmp_list) # 传入数据的值是字典,则直接调用自身
elif isinstance(value, (list, tuple)): # 判断 value 是否元组或者 list
self.get_value(key, value, tmp_list) # 传入数据的value 值是列表或者元组,则调用 get_value
return tmp_list
def get_value(self, key, val, tmp_list):
"""
:param key:目标 key 的值
:param val:
:param tmp_list:
:return:
"""
for sub_val in val:
if isinstance(sub_val, dict): # 判断 sub_val 的值是否是字典
self.get_target_value(key, sub_val, tmp_list) # 传入数据 value 值是字典 则调用get_target_value
elif isinstance(sub_val, (list, tuple)):
self.get_value(key, sub_val, tmp_list) # 传入数据的 value 值是列表或者元组,则调用自身
def get_target_value(self, key, dic, tmp_list):
"""
:param key: 目标 key 的值
:param dic: json 数据
:param tmp_list: 用于储蓄获取到的数据
:return: 返回储蓄数据的 list
"""
if not isinstance(dic, dict) or not isinstance(tmp_list, list):
msg = "argv[1] not an dict or argv[-1] not an list "
return msg
if key in dic.keys():
tmp_list.append(dic[key]) # 传入数据如果存在 dict 则将字典遍历一次存入到 tmp_list 中
for value in dic.values(): # 传入数据不符合则对其value 值进行遍历
if isinstance(value, dict):
self.get_target_value(key, value, tmp_list) # 传入数据的value 是字典,则直接调用自身
elif isinstance(value, (list, tuple)):
self.get_value(key, value, tmp_list) # 传入数据的value值是列表或者元组则调用 get_value
else:
for value in dic.values(): # 遍历传入的字典值,value 为dic的值
if isinstance(value, dict): # 判断 value 是否字典
self.get_target_value(key, value, tmp_list) # 传入数据的值是字典,则直接调用自身
elif isinstance(value, (list, tuple)): # 判断 value 是否元组或者 list
self.get_value(key, value, tmp_list) # 传入数据的value 值是列表或者元组,则调用 get_value
return tmp_list
def get_value(self, key, val, tmp_list):
"""
:param key:目标 key 的值
:param val:
:param tmp_list:
:return:
"""
for sub_val in val:
if isinstance(sub_val, dict): # 判断 sub_val 的值是否是字典
self.get_target_value(key, sub_val, tmp_list) # 传入数据 value 值是字典 则调用get_target_value
elif isinstance(sub_val, (list, tuple)):
self.get_value(key, sub_val, tmp_list) # 传入数据的 value 值是列表或者元组,则调用自身
if __name__ == '__main__':
test_dic = {'a': '1', 'g': '2', 'c': {
'd': [{'e': [{'f': [{'v': [{'g': '6'}, [{'g': '7'}, [{'g': 8}]]]}, 'm']}]}, 'h', {'g': [10, 12]}]}}
test_list = []
test = AnalysisJson()
resp = test.get_target_value("g", test_dic, test_list)
print(resp)
test_dic = {'a': '1', 'g': '2', 'c': {
'd': [{'e': [{'f': [{'v': [{'g': '6'}, [{'g': '7'}, [{'g': 8}]]]}, 'm']}]}, 'h', {'g': [10, 12]}]}}
test_list = []
test = AnalysisJson()
resp = test.get_target_value("g", test_dic, test_list)
print(resp)

View File

@ -14,103 +14,103 @@ from common.utils.singleton import singleton
@singleton
class AssertDict(object):
@staticmethod
def is_contain(expect_result, response_result):
"""
Args:
response_result:
expect_result:
expect_result:
"""
assert expect_result.items() <= response_result.items()
@staticmethod
def assert_value(expect_result, response_result):
"""
:param expect_result: 预期结果
:param response_result: 响应结果
:return:
"""
contain_expect_key_dict = [] # 所有预期结果的字典key
expect_value_list = [] # 所有预期结果的字典value
tmp_list = []
need_search_key = []
res_list = {}
for key, value in expect_result.items():
expect_value_list.append(value)
need_search_key.append(key)
for expect_value in need_search_key:
# 接收由预期key在实际响应中的所有值,返回的是一个[]
try:
contain_expect_key_dict = (AnalysisJson().get_target_value(
expect_value, response_result, tmp_list))
except Exception as identifier:
print("查找值异常:{}".format(contain_expect_key_dict))
raise identifier
for each_value in expect_value_list:
# 判断是否每一个由预期结果组成的列表中每一个值都存在由预期key组成的实际结果列表中
try:
if each_value in contain_expect_key_dict:
res_list["${}".format(each_value)] = True
else:
res_list["${}".format(each_value)] = False
except Exception as e:
print("字典的key异常{}".format(each_value))
raise e
if False in res_list.values():
flag = 0
else:
flag = 1
return flag, res_list
@staticmethod
def is_contain(expect_result, response_result):
"""
Args:
response_result:
expect_result:
expect_result:
"""
assert expect_result.items() <= response_result.items()
@staticmethod
def assert_value(expect_result, response_result):
"""
:param expect_result: 预期结果
:param response_result: 响应结果
:return:
"""
contain_expect_key_dict = [] # 所有预期结果的字典key
expect_value_list = [] # 所有预期结果的字典value
tmp_list = []
need_search_key = []
res_list = {}
for key, value in expect_result.items():
expect_value_list.append(value)
need_search_key.append(key)
for expect_value in need_search_key:
# 接收由预期key在实际响应中的所有值,返回的是一个[]
try:
contain_expect_key_dict = (AnalysisJson().get_target_value(
expect_value, response_result, tmp_list))
except Exception as identifier:
print("查找值异常:{}".format(contain_expect_key_dict))
raise identifier
for each_value in expect_value_list:
# 判断是否每一个由预期结果组成的列表中每一个值都存在由预期key组成的实际结果列表中
try:
if each_value in contain_expect_key_dict:
res_list["${}".format(each_value)] = True
else:
res_list["${}".format(each_value)] = False
except Exception as e:
print("字典的key异常{}".format(each_value))
raise e
if False in res_list.values():
flag = 0
else:
flag = 1
return flag, res_list
if __name__ == '__main__':
first = {
"data": [{
"saleRatio": "14.29",
"weekDate": "2021-04-15"
}, {
"weekDate": "2021-04-16",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-17",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-18",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-19",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-20",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-21",
"saleRatio": "14.29"
}],
"status": 200
}
second = {"data": [{
"weekDate": "2021-04-19",
"saleRatio": "14.29"
}], "status": 200}
expect = {
"status": "success",
"code": 200,
"message": "OK"
}
response = {
"status": "success",
"code": 200,
"message": "OK",
"data": {
"id": 123,
"name": "John"
}
}
print(AssertDict().assert_value(second, first))
print(AssertDict().assert_value(expect, response))
first = {
"data": [{
"saleRatio": "14.29",
"weekDate": "2021-04-15"
}, {
"weekDate": "2021-04-16",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-17",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-18",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-19",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-20",
"saleRatio": "14.29"
}, {
"weekDate": "2021-04-21",
"saleRatio": "14.29"
}],
"status": 200
}
second = {"data": [{
"weekDate": "2021-04-19",
"saleRatio": "14.29"
}], "status": 200}
expect = {
"status": "success",
"code": 200,
"message": "OK"
}
response = {
"status": "success",
"code": 200,
"message": "OK",
"data": {
"id": 123,
"name": "John"
}
}
print(AssertDict().assert_value(second, first))
print(AssertDict().assert_value(expect, response))

View File

@ -18,9 +18,9 @@ from common.data_extraction import logger
# from common.http_client.http_client import Pyt
REPLACE_DICT = {
"null": None,
"True": True,
"false": False
"null": None,
"True": True,
"false": False
}
@ -28,119 +28,122 @@ REPLACE_DICT = {
class DataExtractor(Variables):
def __init__(self):
super().__init__()
# self.PATTERN = getattr(Variables, "PATTERN") # 预编译正则表达式
@logger.log_decorator("提取参数出现了意想不到的错误!!")
def substitute_data(self, response, regex=None, keys=None, deps=None, jp_dict=None):
"""
方法接收一个正则表达式 regex 和一个关联参数表 deps用于从接口返回的数据中提取关联参数
它会从接口返回的数据中使用正则表达式 regex 和正则表达式返回结果的键列表 keys 提取数据并将其更新到关联参数表中
然后它会使用 subs_deps subs_lists 方法提取更多的关联参数最后它将更新后的关联参数表设置为 Variables 类的静态变量并将其返回
Args:
response: 被提取数据对象
regex: 正则表达式 r'"id": (\d+), "name": "(\w+)",'
keys: 接收正则表达式返回结果的key ["a", "b"]
deps: "name=data[0].name;ok=data[0].id;an=data[0].age[3].a"
jp_dict: jsonpath 提取方式入参{"k": "$.data", "x": "$.data[0].age[3].a"}
Returns:
"""
response = response
if not isinstance(response, (dict, str, list)):
logger.error(f"被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: {response}")
return {}
if regex and keys:
self.substitute_regex(response, regex, keys)
response = response if isinstance(response, (dict, list)) else json.loads(response)
if deps:
self.substitute_route(response, deps)
if jp_dict:
self.substitute_jsonpath(response, jp_dict)
def substitute_regex(self, response, regex, keys):
"""
方法用于使用正则表达式 regex 和正则表达式返回结果的键列表 keys 从接口返回的数据中提取数据并将其更新到关联参数表中
Args:
response:
regex: 正则表达式r'"id": (\d+), "name": "(\w+)",'
keys:结果键列表["a", "b"],
Returns:
"""
response = json.dumps(response) if isinstance(response, (dict, list)) else response
match = re.search(regex, response)
if not match:
return {}
groups = match.groups()
for i, key in enumerate(keys):
try:
self.update_variable(key, groups[i])
except:
self.update_variable(key, None)
def substitute_route(self, response, route_str):
deps_list = re.sub(f"[\r\n]+", "", route_str).split(";")
for dep_item in deps_list:
key, value_path = dep_item.split("=")
value_path_parts = re.findall(r'\w+', value_path)
temp = response
for part in value_path_parts:
if isinstance(temp, dict):
temp = temp.get(part)
elif isinstance(temp, list):
if part.isdigit():
index = int(part)
if index < len(temp):
temp = temp[index]
else:
temp = None
break
else:
temp = None
break
else:
temp = None
break
if isinstance(temp, (dict, list)):
continue
else:
break
if temp is not None:
self.update_variable(key, temp)
def substitute_jsonpath(self, response, json_path_dict):
"""
jsonpath 提取参数
Args:
response: 响应结果
json_path_dict: {"k": "$.data", "x": "$.data[0].age[3].a"}
Returns: 字符串或者list
"""
json_path_dict = json_path_dict if isinstance(json_path_dict, dict) else json.loads(json_path_dict)
for key, expression in json_path_dict.items():
try:
parsed_expression = parse(expression)
data = response
match = parsed_expression.find(data)
result = [m.value for m in match]
self.update_variable(key, result[0]) if len(result) == 1 else self.update_variable(key, result)
except Exception as e:
logger.error(f"jsonpath表达式错误'{expression}': {e}")
def __init__(self):
super().__init__()
# self.PATTERN = getattr(Variables, "PATTERN") # 预编译正则表达式
@logger.log_decorator("提取参数出现了意想不到的错误!!")
def substitute_data(self, response, regex=None, keys=None, deps=None, jp_dict=None):
"""
方法接收一个正则表达式 regex 和一个关联参数表 deps用于从接口返回的数据中提取关联参数
它会从接口返回的数据中使用正则表达式 regex 和正则表达式返回结果的键列表 keys 提取数据并将其更新到关联参数表中
然后它会使用 subs_deps subs_lists 方法提取更多的关联参数最后它将更新后的关联参数表设置为 Variables 类的静态变量并将其返回
Args:
response: 被提取数据对象
regex: 正则表达式 r'"id": (\d+), "name": "(\w+)",'
keys: 接收正则表达式返回结果的key ["a", "b"]
deps: "name=data[0].name;ok=data[0].id;an=data[0].age[3].a"
jp_dict: jsonpath 提取方式入参{"k": "$.data", "x": "$.data[0].age[3].a"}
Returns:
"""
response = response
if not isinstance(response, (dict, str, list)):
logger.error(f"被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: {response}")
return {}
if regex and keys:
self.substitute_regex(response, regex, keys)
response = response if isinstance(response, (dict, list)) else json.loads(response)
if deps:
self.substitute_route(response, deps)
if jp_dict:
self.substitute_jsonpath(response, jp_dict)
def substitute_regex(self, response, regex, keys):
"""
方法用于使用正则表达式 regex 和正则表达式返回结果的键列表 keys 从接口返回的数据中提取数据并将其更新到关联参数表中
Args:
response:
regex: 正则表达式r'"id": (\d+), "name": "(\w+)",'
keys:结果键列表["a", "b"],
Returns:
"""
response = json.dumps(response) if isinstance(response, (dict, list)) else response
match = re.search(regex, response)
if not match:
return {}
groups = match.groups()
for i, key in enumerate(keys):
try:
self.update_variable(key, groups[i])
except:
self.update_variable(key, None)
def substitute_route(self, response, route_str):
deps_list = re.sub(f"[\r\n]+", "", route_str).split(";")
for dep_item in deps_list:
key, value_path = dep_item.split("=")
value_path_parts = re.findall(r'\w+', value_path)
temp = response
for part in value_path_parts:
if isinstance(temp, dict):
temp = temp.get(part)
elif isinstance(temp, list):
if part.isdigit():
index = int(part)
if index < len(temp):
temp = temp[index]
else:
temp = None
break
else:
temp = None
break
else:
temp = None
break
if isinstance(temp, (dict, list)):
continue
else:
break
if temp is not None:
self.update_variable(key, temp)
def substitute_jsonpath(self, response, json_path_dict):
"""
jsonpath 提取参数
Args:
response: 响应结果
json_path_dict: {"k": "$.data", "x": "$.data[0].age[3].a"}
Returns: 字符串或者list
"""
json_path_dict = json_path_dict if isinstance(json_path_dict, dict) else json.loads(json_path_dict)
for key, expression in json_path_dict.items():
try:
parsed_expression = parse(expression)
data = response
# 使用解析器对象进行匹配和提取
match = parsed_expression.find(data)
result = [m.value for m in match]
self.update_variable(key, result[0]) if len(result) == 1 else self.update_variable(key,
result)
except Exception as e:
logger.error(f"jsonpath表达式错误'{expression}': {e}")
if __name__ == '__main__':
# 测试subs函数
res = '{"code": 1,"data": [{"id": 1, "name": "Alice", "age": [20, 21, 22, {"a": "b"}]}]}'
lists = {"k": "$..code", "x": "$.data[0].age[3].a"}
dep_str = "name=data[0].name;ok=data[0].id;an=data[0].age"
regex_str = r'"id": (\d+), "name": "(\w+)",'
regex_key = ["a", "b"]
t = DataExtractor()
t.substitute_data(res, regex=regex_str, keys=regex_key, deps=dep_str, jp_dict=lists)
print("-------->res:", t.get_variable())
# 测试subs函数
res = '{"code": 1,"data": [{"id": 1, "name": "Alice", "age": [20, 21, 22, {"a": "b"}]}]}'
lists = {"k": "$..code", "x": "$.data[0].age[3].a"}
dep_str = "name=data[0].name;ok=data[0].id;an=data[0].age"
regex_str = r'"id": (\d+), "name": "(\w+)",'
regex_key = ["a", "b"]
t = DataExtractor()
t.substitute_data(res, regex=regex_str, keys=regex_key, deps=dep_str, jp_dict=lists)
print("-------->res:", t.get_variable())

View File

@ -16,100 +16,100 @@ from common.data_extraction.data_extractor import DataExtractor
class DependentParameter(DataExtractor):
"""
该类用于替换接口参数它会从字符串中寻找需要替换的参数并将其替换为关联参数表中对应的值
然后它将替换后的字符串转化为字典并返回如果找不到需要替换的参数则直接返回原始字符串
"""
def __init__(self):
super().__init__()
# self.P = self.pattern_l # re.compile(r"{{\s*([^}\s]+)\s*}}(?:\[(\d+)\])?")
# self.pp = self.PATTERN # re.compile(r"{{(.*?)}}")
# self.p = self.pattern # re.compile(r'({)')
# self.pf = self.pattern_fun # re.compile(r"{{(\w+\(\))}}")
@logger.log_decorator()
def replace_dependent_parameter(self, jst):
"""
替换字符串中的关联参数并返回转化后的字典格式
Args:
jst: 包含接口参数的字符串
Returns:转换后的字典或原始字符串
"""
if not jst:
return jst
jst = json.dumps(jst) if isinstance(jst, (dict, list)) else jst
# 循环替换参数
while self.pattern_l.search(jst):
if self.pattern_fun.search(jst):
# 函数替换
key = self.pattern_fun.search(jst).group()
if key in self.get_variable().keys():
# 如果参数名称存在于关联参数表中,则调用相应的函数获取返回值,并替换字符串中的参数
value_ = self.get_variable(key)()
jst = jst.replace(key, str(value_))
else:
logger.error(f"key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break
else:
key = self.pattern_l.search(jst)
# 字符串替换,判断需要替换的字符串是{{key}}还是{{key}}[index]
if "[" and "]" in key.group():
# 如果需要替换的是数组参数,则获取数组下标
index = int(key.group(2))
k = self.PATTERN.search(key.group()).group()
else:
index = ""
k = key.group()
# 如果参数名称存在于关联参数表中,则获取相应的值,并替换字符串中的参数
if k in self.get_variable().keys():
if isinstance(index, int):
value_ = self.get_variable(k)[index]
else:
value_ = self.get_variable(k)
jst = jst.replace(key.group(), str(value_))
else:
logger.error(f"key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break
# 将 True 和 False 转换为小写,并继续循环替换参数
jst = jst.replace("True", "true").replace("False", "false")
print("=========>", self.pattern.search(jst), self.pattern_fun.search(jst), jst, "===", type(jst))
if self.pattern.search(jst) and not self.pattern_fun.search(jst):
try:
print("==6666==")
jst = json.loads(jst)
except json.JSONDecodeError as e:
logger.error(f"JSONDecodeError:{jst}:{e}")
return jst
"""
该类用于替换接口参数它会从字符串中寻找需要替换的参数并将其替换为关联参数表中对应的值
然后它将替换后的字符串转化为字典并返回如果找不到需要替换的参数则直接返回原始字符串
"""
def __init__(self):
super().__init__()
# self.P = self.pattern_l # re.compile(r"{{\s*([^}\s]+)\s*}}(?:\[(\d+)\])?")
# self.pp = self.PATTERN # re.compile(r"{{(.*?)}}")
# self.p = self.pattern # re.compile(r'({)')
# self.pf = self.pattern_fun # re.compile(r"{{(\w+\(\))}}")
@logger.log_decorator()
def replace_dependent_parameter(self, jst):
"""
替换字符串中的关联参数并返回转化后的字典格式
Args:
jst: 包含接口参数的字符串
Returns:转换后的字典或原始字符串
"""
if not jst:
return jst
jst = json.dumps(jst) if isinstance(jst, (dict, list)) else jst
# 循环替换参数
while self.pattern_l.search(jst):
if self.pattern_fun.search(jst):
# 函数替换
key = self.pattern_fun.search(jst).group()
if key in self.get_variable().keys():
# 如果参数名称存在于关联参数表中,则调用相应的函数获取返回值,并替换字符串中的参数
value_ = self.get_variable(key)()
jst = jst.replace(key, str(value_))
else:
logger.error(
f"key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break
else:
key = self.pattern_l.search(jst)
# 字符串替换,判断需要替换的字符串是{{key}}还是{{key}}[index]
if "[" and "]" in key.group():
# 如果需要替换的是数组参数,则获取数组下标
index = int(key.group(2))
k = self.PATTERN.search(key.group()).group()
else:
index = ""
k = key.group()
# 如果参数名称存在于关联参数表中,则获取相应的值,并替换字符串中的参数
if k in self.get_variable().keys():
if isinstance(index, int):
value_ = self.get_variable(k)[index]
else:
value_ = self.get_variable(k)
jst = jst.replace(key.group(), str(value_))
else:
logger.error(
f"key:{key},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常\n")
break
# 将 True 和 False 转换为小写,并继续循环替换参数
jst = jst.replace("True", "true").replace("False", "false")
if self.pattern.search(jst) and not self.pattern_fun.search(jst):
try:
jst = json.loads(jst)
except json.JSONDecodeError as e:
logger.error(f"JSONDecodeError:{jst}:{e}")
return jst
if __name__ == '__main__':
from common.variables import Variables
dps = {
"{{var_a}}": "foo",
"{{var_c}}": 123,
"{{var_d}}": None,
"{{var_e_1}}": True,
"{{var_e_2}}": "bar",
"{{var_f}}": ["baz", False],
"{{var_g}}": {'g': 'gg', 'g1': 'gg', 'g2': 'gg2'}
}
d = Variables()
d.set_variable(dps)
from common.validation import loaders
from common import bif_functions
loaders.Loaders().set_bif_fun(bif_functions)
dat = {
"a": "{{var_a}}",
"b": {"c": "{{var_c}}", "d": "{{var_d}}", "e": ["{{var_e_1}}", "{{var_e_2}}"]},
"f": "{{var_f}}[1]",
"g": "{{var_g}}",
"t": "{{get_timestamp()}}"
}
d = DependentParameter()
print("=====》res: ", d.replace_dependent_parameter(dat))
from common.variables import Variables
dps = {
"{{var_a}}": "foo",
"{{var_c}}": 123,
"{{var_d}}": None,
"{{var_e_1}}": True,
"{{var_e_2}}": "bar",
"{{var_f}}": ["baz", False],
"{{var_g}}": {'g': 'gg', 'g1': 'gg', 'g2': 'gg2'}
}
d = Variables()
d.set_variable(dps)
from common.validation import loaders
from common import bif_functions
loaders.Loaders().set_bif_fun(bif_functions)
dat = {
"a": "{{var_a}}",
"b": {"c": "{{var_c}}", "d": "{{var_d}}", "e": ["{{var_e_1}}", "{{var_e_2}}"]},
"f": "{{var_f}}[1]",
"g": "{{var_g}}",
"t": "{{get_timestamp()}}"
}
d = DependentParameter()
print("=====》res: ", d.replace_dependent_parameter(dat))

View File

@ -7,55 +7,56 @@
def dict_get(dic, locators, default=None):
"""
以参数形式获取字典中特定的值
:param dic: 输入需要在其中取值的原始字典 <dict>
:param locators: 输入取值定位器, :['result', 'msg', '-1', 'status'] <list>
:param default: 进行取值中报错时所返回的默认值 (default: None)
:return: 返回根据参数locators找出的值
"""
if not isinstance(dic, dict) or not isinstance(locators, list):
return default
value = None
for locator in locators:
if not type(value) in [dict, list] and isinstance(locator, str) and not can_convert_to_int(locator):
try:
value = dic[locator]
except KeyError:
return default
continue
if isinstance(value, dict):
try:
value = dict_get(value, [locator])
except KeyError:
return default
continue
if isinstance(value, list) and can_convert_to_int(locator):
try:
value = value[int(locator)]
except IndexError:
return default
continue
return value
"""
以参数形式获取字典中特定的值
:param dic: 输入需要在其中取值的原始字典 <dict>
:param locators: 输入取值定位器, :['result', 'msg', '-1', 'status'] <list>
:param default: 进行取值中报错时所返回的默认值 (default: None)
:return: 返回根据参数locators找出的值
"""
if not isinstance(dic, dict) or not isinstance(locators, list):
return default
value = None
for locator in locators:
if not type(value) in [dict, list] and isinstance(locator, str) and not can_convert_to_int(locator):
try:
value = dic[locator]
except KeyError:
return default
continue
if isinstance(value, dict):
try:
value = dict_get(value, [locator])
except KeyError:
return default
continue
if isinstance(value, list) and can_convert_to_int(locator):
try:
value = value[int(locator)]
except IndexError:
return default
continue
return value
def can_convert_to_int(input_s):
try:
int(input_s)
return True
except Exception:
return False
try:
int(input_s)
return True
except Exception:
return False
if __name__ == '__main__':
# dict_test = {"result": {"code": "110002", "msg": [{'status': 'ok'}, {'status': 'failed'}]}}
# result = dict_get(dict_test, ['result', 'msg', '-1', 'status'])
dict_test = {"data": {"result": [{"taskId": 1, "taskName": "2020-01-23 调研任务", "taskStatus": 2}], "totalCount": 1,
"pageSize": 20},"taskId":2, "msg": "操作成功!", "status": 200}
result = dict_get(dict_test, ['data', 'result', 0, 'taskId'])
print(result)
# dict_test = {"result": {"code": "110002", "msg": [{'status': 'ok'}, {'status': 'failed'}]}}
# result = dict_get(dict_test, ['result', 'msg', '-1', 'status'])
dict_test = {
"data": {"result": [{"taskId": 1, "taskName": "2020-01-23 调研任务", "taskStatus": 2}], "totalCount": 1,
"pageSize": 20}, "taskId": 2, "msg": "操作成功!", "status": 200}
result = dict_get(dict_test, ['data', 'result', 0, 'taskId'])
print(result)

View File

@ -8,43 +8,43 @@ from common.database import logger
@logger.log_decorator()
def execute_sql_files(sql_path, db_config):
"""
批量执行sql语句
Args:
sql_path:文件夹
db_config: 数据库配置
Returns:
"""
connection = pymysql.connect(**db_config)
try:
with connection.cursor() as cur:
# 获取指定目录下的所有SQL文件
sql_files = glob.glob(os.path.join(sql_path, "*.sql"))
for file in sql_files:
with open(file, "r", encoding="utf-8") as f:
sql_statements = f.read().strip().split(";")
for sql_statement in sql_statements:
if sql_statement:
cur.execute(sql_statement)
connection.commit()
finally:
connection.close()
"""
批量执行sql语句
Args:
sql_path:文件夹
db_config: 数据库配置
Returns:
"""
connection = pymysql.connect(**db_config)
try:
with connection.cursor() as cur:
# 获取指定目录下的所有SQL文件
sql_files = glob.glob(os.path.join(sql_path, "*.sql"))
for file in sql_files:
with open(file, "r", encoding="utf-8") as f:
sql_statements = f.read().strip().split(";")
for sql_statement in sql_statements:
if sql_statement:
cur.execute(sql_statement)
connection.commit()
finally:
connection.close()
if __name__ == '__main__':
config = {
"host": "xxxx.xxx.xxx.xx",
"port": 3306,
"database": "db_name",
"user": "root",
"password": "xxxx"
}
execute_sql_files('./sql.sql', config)
config = {
"host": "xxxx.xxx.xxx.xx",
"port": 3306,
"database": "db_name",
"user": "root",
"password": "xxxx"
}
execute_sql_files('./sql.sql', config)

View File

@ -14,77 +14,80 @@ sys.path.append("./common")
class MongodbClient(object):
def __init__(self, db_info):
self.mongo_info = eval(db_info) # mongo数据库配置信息,字典形式
self.mongo_client = pymongo.MongoClient(host=self.mongo_info["host"], port=self.mongo_info["port"]) # 获取连接实例
self.my_db = self.mongo_client.admin # 连接系统默认数据库 admin
self.my_db.authenticate(self.mongo_info["username"], self.mongo_info["password"],
mechanism='SCRAM-SHA-1') # 让 admin数据库去认证密码登录
self.db = self.mongo_client[self.mongo_info["database"]] # 连接自己的数据库需要操作的数据库
def do_mongo(self, **data):
"""
Args:
**data: sql_file 操作语句
Returns:
"""
result = {}
for method, sql_dates in data.items():
if method == "select":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
result_obj = self.db[table_name].find_one(sql)
result["${" + "{}".format(index) + "}"] = result_obj
if method == "delete":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
self.db[table_name].delete_many(sql)
result["#{0}:{1}".format(table_name, sql)] = "删除成功"
if method == "insert":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
self.db[table_name].insert_one(sql)
result["#{0}:{1}".format(table_name, sql)] = "插入成功"
self.mongo_client.close()
return result
def insert_data(self):
base_path = os.path.join(Config.base_path, "data")
names = os.listdir(base_path)
for name in names:
if re.match(r"(.+?).json", name):
table_name = re.match(r"(.*?)\.json", name).group(1)
print(table_name)
actuator = self.db[table_name]
with open(base_path + "\\{}.json".format(table_name), encoding='utf-8') as f:
data = json.load(f)
result_data = []
for sql in data:
if "_id" in sql.keys():
sql.pop("_id")
created_at = jsonpath.jsonpath(sql, "$.createdAt.$date")[0]
updated_at = jsonpath.jsonpath(sql, "$.updatedAt.$date")[0]
sql["createdAt"] = parser.parse(created_at)
sql["updatedAt"] = parser.parse(updated_at)
if "intentionPaymentDate" in sql.keys():
intention_payment_date = jsonpath.jsonpath(sql, "$..intentionPaymentDate.$date")[0]
sql["intentionPaymentDate"] = parser.parse(intention_payment_date)
result_data.append(sql)
else:
result_data.append(sql)
actuator.insert_many(result_data)
print("*" * 50)
self.mongo_client.close()
def __init__(self, db_info):
self.mongo_info = eval(db_info) # mongo数据库配置信息,字典形式
self.mongo_client = pymongo.MongoClient(host=self.mongo_info["host"],
port=self.mongo_info["port"]) # 获取连接实例
self.my_db = self.mongo_client.admin # 连接系统默认数据库 admin
self.my_db.authenticate(self.mongo_info["username"], self.mongo_info["password"],
mechanism='SCRAM-SHA-1') # 让 admin数据库去认证密码登录
self.db = self.mongo_client[self.mongo_info["database"]] # 连接自己的数据库需要操作的数据库
def do_mongo(self, **data):
"""
Args:
**data: sql_file 操作语句
Returns:
"""
result = {}
for method, sql_dates in data.items():
if method == "select":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
result_obj = self.db[table_name].find_one(sql)
result["${" + "{}".format(index) + "}"] = result_obj
if method == "delete":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
self.db[table_name].delete_many(sql)
result["#{0}:{1}".format(table_name, sql)] = "删除成功"
if method == "insert":
for table_name, sql_s in sql_dates.items():
for index, sql in enumerate(sql_s):
self.db[table_name].insert_one(sql)
result["#{0}:{1}".format(table_name, sql)] = "插入成功"
self.mongo_client.close()
return result
def insert_data(self):
base_path = os.path.join(Config.base_path, "data")
names = os.listdir(base_path)
for name in names:
if re.match(r"(.+?).json", name):
table_name = re.match(r"(.*?)\.json", name).group(1)
print(table_name)
actuator = self.db[table_name]
with open(base_path + "\\{}.json".format(table_name), encoding='utf-8') as f:
data = json.load(f)
result_data = []
for sql in data:
if "_id" in sql.keys():
sql.pop("_id")
created_at = jsonpath.jsonpath(sql, "$.createdAt.$date")[0]
updated_at = jsonpath.jsonpath(sql, "$.updatedAt.$date")[0]
sql["createdAt"] = parser.parse(created_at)
sql["updatedAt"] = parser.parse(updated_at)
if "intentionPaymentDate" in sql.keys():
intention_payment_date = \
jsonpath.jsonpath(sql, "$..intentionPaymentDate.$date")[0]
sql["intentionPaymentDate"] = parser.parse(
intention_payment_date)
result_data.append(sql)
else:
result_data.append(sql)
actuator.insert_many(result_data)
print("*" * 50)
self.mongo_client.close()
if __name__ == "__main__":
db_file = Config.test_data_address
excel_handle = DoExcel(db_file)
excel_init = excel_handle.get_excel_init()
mongo_base = excel_init["test_databases"]
MongodbClient(mongo_base).insert_data()
# site = {'name': '我的博客地址', 'alexa': 10000, 'url': 'http://blog.csdn.net/uuihoo/'}
# pop_obj = site.pop('name') # 删除要删除的键值对,如{'name':'我的博客地址'}这个键值对
# print(pop_obj) # 输出 :我的博客地址
# print(site)
db_file = Config.test_data_address
excel_handle = DoExcel(db_file)
excel_init = excel_handle.get_excel_init()
mongo_base = excel_init["test_databases"]
MongodbClient(mongo_base).insert_data()
# site = {'name': '我的博客地址', 'alexa': 10000, 'url': 'http://blog.csdn.net/uuihoo/'}
# pop_obj = site.pop('name') # 删除要删除的键值对,如{'name':'我的博客地址'}这个键值对
# print(pop_obj) # 输出 :我的博客地址
# print(site)

View File

@ -19,150 +19,151 @@ from common.utils.singleton import singleton
@singleton
class MysqlClient:
def __init__(self, db_config):
"""
初始化连接配置
Args:
db_config: 数据库连接配置字典
{
"host": "xxxx.xxx.xxx.xx",
"port": 3306,
"database": "db_name",
"user": "root",
"password": "xxxx"
}
"""
if not db_config:
return
try:
self.db_base = db_config if isinstance(db_config, dict) else json.loads(db_config)
self.pool = PooledDB(creator=pymysql, maxconnections=10, **self.db_base)
except Exception as e:
logger.error(f"数据库链接失败: {e}")
raise
@logger.log_decorator()
def execute_sql(self, sql):
"""
执行 SQL 语句
Args:
sql: SQL 语句字典
{
"delete": {
"sql_name": "DELETE FROM table_name WHERE condition"
},
"update": {
"sql_name": "UPDATE table_name SET column1=value1 WHERE condition"
},
"insert": {
"sql_name": "INSERT INTO table_name (column1, column2) VALUES (value1, value2)"
},
"select": {
"sql_name": "SELECT * FROM table_name WHERE condition"
}
}
Returns:
执行结果字典
{
"sql_name": [result1, result2, ...]
}
"""
if not sql:
return
try:
conn = self.pool.connection()
cur = conn.cursor(DictCursor)
result = {}
for method, sql_data in sql.items():
execute_method = getattr(self, f"_execute_{method}", None)
if not execute_method:
logger.error("sql字典集编写格式不符合规范")
raise ValueError("Invalid SQL method")
execute_method(cur, sql_data, result)
cur.close()
conn.close()
return result
except Exception as e:
logger.error(f"数据库操作异常: {e}")
raise
def _execute_delete(self, cursor, sql_data, result):
"""
执行 DELETE 语句
"""
for sql_name, sql_ in sql_data.items():
try:
cursor.execute(str(sql_))
except Exception as err:
logger.error(f"执行 SQL 异常: {sql_}")
raise err
cursor.connection.commit()
def _execute_update(self, cursor, sql_data, result):
"""
执行 UPDATE 语句
"""
self.execute_delete(cursor, sql_data, result)
def _execute_insert(self, cursor, sql_data, result):
"""
执行 INSERT 语句
"""
self.execute_delete(cursor, sql_data, result)
def _execute_select(self, cursor, sql_data, result):
"""
执行 SELECT 语句
Args:
cursor: 数据库游标
sql_data: SQL 语句数据字典
{
"sql_name": "SELECT * FROM table_name WHERE condition"
}
result: 字典结果
Raises:
Exception: 执行异常
"""
for sql_name, sql_ in sql_data.items():
try:
cursor.execute(sql_)
result[sql_name] = cursor.fetchall()
except Exception as err:
logger.error(f"查询异常 sql: {sql_}")
raise err
def __init__(self, db_config):
"""
初始化连接配置
Args:
db_config: 数据库连接配置字典
{
"host": "xxxx.xxx.xxx.xx",
"port": 3306,
"database": "db_name",
"user": "root",
"password": "xxxx"
}
"""
if not db_config:
return
try:
self.db_base = db_config if isinstance(db_config, dict) else json.loads(db_config)
self.pool = PooledDB(creator=pymysql, maxconnections=10, **self.db_base)
except Exception as e:
logger.error(f"数据库链接失败: {e}")
raise
@logger.log_decorator()
def execute_sql(self, sql):
"""
执行 SQL 语句
Args:
sql: SQL 语句字典
{
"delete": {
"sql_name": "DELETE FROM table_name WHERE condition"
},
"update": {
"sql_name": "UPDATE table_name SET column1=value1 WHERE condition"
},
"insert": {
"sql_name": "INSERT INTO table_name (column1, column2) VALUES (value1, value2)"
},
"select": {
"sql_name": "SELECT * FROM table_name WHERE condition"
}
}
Returns:
执行结果字典
{
"sql_name": [result1, result2, ...]
}
"""
if not sql:
return
try:
conn = self.pool.connection()
cur = conn.cursor(DictCursor)
result = {}
for method, sql_data in sql.items():
execute_method = getattr(self, f"_execute_{method}", None)
if not execute_method:
logger.error("sql字典集编写格式不符合规范")
raise ValueError("Invalid SQL method")
execute_method(cur, sql_data, result)
cur.close()
conn.close()
return result
except Exception as e:
logger.error(f"数据库操作异常: {e}")
raise
def _execute_delete(self, cursor, sql_data, result):
"""
执行 DELETE 语句
"""
for sql_name, sql_ in sql_data.items():
try:
cursor.execute(str(sql_))
except Exception as err:
logger.error(f"执行 SQL 异常: {sql_}")
raise err
cursor.connection.commit()
def _execute_update(self, cursor, sql_data, result):
"""
执行 UPDATE 语句
"""
self.execute_delete(cursor, sql_data, result)
def _execute_insert(self, cursor, sql_data, result):
"""
执行 INSERT 语句
"""
self.execute_delete(cursor, sql_data, result)
def _execute_select(self, cursor, sql_data, result):
"""
执行 SELECT 语句
Args:
cursor: 数据库游标
sql_data: SQL 语句数据字典
{
"sql_name": "SELECT * FROM table_name WHERE condition"
}
result: 字典结果
Raises:
Exception: 执行异常
"""
for sql_name, sql_ in sql_data.items():
try:
cursor.execute(sql_)
result[sql_name] = cursor.fetchall()
except Exception as err:
logger.error(f"查询异常 sql: {sql_}")
raise err
if __name__ == '__main__':
sql_2 = {
"select":
{
"select_sale": "select count(1) total, (case when t1.status = 1 then '待整改' when t1.status = 2 then '待复查' when t1.status = 3 then '整改完成' else '未知类型' end) orderStatus from ibs_ai_iot.ai_rectification_main t1 left join ibs_ai_iot.work_order t3 on t1.id = t3.rectification_id where t1.project_id = 103672 and t1.delete_flag = 0 and t3.is_delete = 0 group by t1.status order by orderStatus desc;",
"select_sale_1": "select count(1) total, (case when t1.status = 1 then '待整改' when t1.status = 2 then '待复查' when t1.status = 3 then '整改完成' else '未知类型' end) orderStatus from ibs_ai_iot.ai_rectification_main t1 left join ibs_ai_iot.work_order t3 on t1.id = t3.rectification_id where t1.project_id = 103672 and t1.delete_flag = 0 and t3.is_delete = 0 group by t1.status order by orderStatus desc;"
}
}
database_2 = {
"host": "10.8.203.25",
"port": 3306,
"database": "ibs_lms_base",
"user": "root",
"password": "gd1234"
}
res = MysqlClient(database_2).execute_sql(sql_2)
print("数据执行结果", res)
from common.data_extraction.data_extractor import DataExtractor
from common.variables import Variables
t = DataExtractor()
t.substitute_data(res,jp_dict={"total": "$.select_sale[0].total", "total_1": "$..total"})
print(Variables.get_variable())
sql_2 = {
"select":
{
"select_sale": "select count(1) total, (case when t1.status = 1 then '待整改' when t1.status = 2 then '待复查' when t1.status = 3 then '整改完成' else '未知类型' end) orderStatus from ibs_ai_iot.ai_rectification_main t1 left join ibs_ai_iot.work_order t3 on t1.id = t3.rectification_id where t1.project_id = 103672 and t1.delete_flag = 0 and t3.is_delete = 0 group by t1.status order by orderStatus desc;",
"select_sale_1": "select count(1) total, (case when t1.status = 1 then '待整改' when t1.status = 2 then '待复查' when t1.status = 3 then '整改完成' else '未知类型' end) orderStatus from ibs_ai_iot.ai_rectification_main t1 left join ibs_ai_iot.work_order t3 on t1.id = t3.rectification_id where t1.project_id = 103672 and t1.delete_flag = 0 and t3.is_delete = 0 group by t1.status order by orderStatus desc;"
}
}
database_2 = {
"host": "10.8.203.25",
"port": 3306,
"database": "ibs_lms_base",
"user": "root",
"password": "gd1234"
}
res = MysqlClient(database_2).execute_sql(sql_2)
print("数据执行结果", res)
from common.data_extraction.data_extractor import DataExtractor
from common.variables import Variables
t = DataExtractor()
t.substitute_data(res, jp_dict={"total": "$.select_sale[0].total", "total_1": "$..total"})
print(Variables.get_variable())

View File

@ -8,83 +8,83 @@ import redis
class RedisClient:
def __init__(self):
self.redis = redis.Redis(host='10.8.203.25', port=6379, password='test2020')
def set_data(self, key, value, expire_time=None):
self.redis.set(key, value)
if expire_time is not None:
self.redis.expire(key, expire_time)
def get_data(self, key):
return self.redis.get(key)
def delete_data(self, key):
self.redis.delete(key)
def hash_set_field(self, key, field, value):
self.redis.hset(key, field, value)
def hash_get_field(self, key, field):
return self.redis.hget(key, field)
def hash_delete_field(self, key, field):
self.redis.hdel(key, field)
def __init__(self):
self.redis = redis.Redis(host='10.8.203.25', port=6379, password='test2020')
def set_data(self, key, value, expire_time=None):
self.redis.set(key, value)
if expire_time is not None:
self.redis.expire(key, expire_time)
def get_data(self, key):
return self.redis.get(key)
def delete_data(self, key):
self.redis.delete(key)
def hash_set_field(self, key, field, value):
self.redis.hset(key, field, value)
def hash_get_field(self, key, field):
return self.redis.hget(key, field)
def hash_delete_field(self, key, field):
self.redis.hdel(key, field)
if __name__ == '__main__':
# r = redis.Redis(host='10.8.203.25', port=6379, password='test2020')
# print(r.select(1)) # 切数据库1
# print(r.dbsize()) # 看 db 大小
#
# # 设置键为"key1"的字符串值为"Hello, Redis!"
# r.set('key1', 'Hello, Redis!')
#
# # 获取键为"key1"的字符串值
# value = r.get('key1')
# print(value) # 输出: b'Hello, Redis!'
#
# # 向名为"list1"的列表左侧插入元素
# r.lpush('list1', 'item1')
# r.lpush('list1', 'item2')
# r.lpush('list1', 'item3')
#
# # 获取名为"list1"的列表所有元素
# items = r.lrange('list1', 0, -1)
# print(items) # 输出: [b'item3', b'item2', b'item1']
#
# # 设置名为"hash1"的哈希表字段和值
# r.hset('hash1', 'field1', 'value1')
# r.hset('hash1', 'field2', 'value2')
#
# # 获取名为"hash1"的哈希表字段和值
# value1 = r.hget('hash1', 'field1')
# value2 = r.hget('hash1', 'field2')
# values = r.hgetall('hash1')
# print(value1, value2) # 输出: b'value1' b'value2
# print(values) # 输出:{b'field1': b'value1', b'field2': b'value2'}
#
# # 向名为"set1"的集合添加元素
# r.sadd('set1', 'item1')
# r.sadd('set1', 'item2')
# r.sadd('set1', 'item3')
#
# # 获取名为"set1"的集合所有元素
# items = r.smembers('set1')
# print(items) # 输出: {b'item1', b'item2', b'item3'}
redis_client = RedisClient()
redis_client.set_data('user1', '100', 3600)
def get_user_info(user_id):
cache_key = f'user1:{user_id}'
user_info = redis_client.get_data(cache_key)
if not user_info:
print("--")
print(f'{user_info}')
get_user_info(100)
# r = redis.Redis(host='10.8.203.25', port=6379, password='test2020')
# print(r.select(1)) # 切数据库1
# print(r.dbsize()) # 看 db 大小
#
# # 设置键为"key1"的字符串值为"Hello, Redis!"
# r.set('key1', 'Hello, Redis!')
#
# # 获取键为"key1"的字符串值
# value = r.get('key1')
# print(value) # 输出: b'Hello, Redis!'
#
# # 向名为"list1"的列表左侧插入元素
# r.lpush('list1', 'item1')
# r.lpush('list1', 'item2')
# r.lpush('list1', 'item3')
#
# # 获取名为"list1"的列表所有元素
# items = r.lrange('list1', 0, -1)
# print(items) # 输出: [b'item3', b'item2', b'item1']
#
# # 设置名为"hash1"的哈希表字段和值
# r.hset('hash1', 'field1', 'value1')
# r.hset('hash1', 'field2', 'value2')
#
# # 获取名为"hash1"的哈希表字段和值
# value1 = r.hget('hash1', 'field1')
# value2 = r.hget('hash1', 'field2')
# values = r.hgetall('hash1')
# print(value1, value2) # 输出: b'value1' b'value2
# print(values) # 输出:{b'field1': b'value1', b'field2': b'value2'}
#
# # 向名为"set1"的集合添加元素
# r.sadd('set1', 'item1')
# r.sadd('set1', 'item2')
# r.sadd('set1', 'item3')
#
# # 获取名为"set1"的集合所有元素
# items = r.smembers('set1')
# print(items) # 输出: {b'item1', b'item2', b'item3'}
redis_client = RedisClient()
redis_client.set_data('user1', '100', 3600)
def get_user_info(user_id):
cache_key = f'user1:{user_id}'
user_info = redis_client.get_data(cache_key)
if not user_info:
print("--")
print(f'{user_info}')
get_user_info(100)

View File

@ -15,148 +15,148 @@ from common.file_handling import logger
@singleton
class DoExcel:
def __init__(self, file_name):
self.file_name = file_name
self.wb = load_workbook(self.file_name)
self.init_sheet = self.wb["init"]
# def __enter__(self):
# self.wb = load_workbook(self.file_name)
# self.init_sheet = self.wb['init']
# return self
#
# def __exit__(self, exc_type, exc_val, exc_tb):
# self.wb.save(self.file_name)
# self.wb.close()
@logger.log_decorator()
def do_excel(self):
"""
通过 title 定位单元格获取所有测试数据
Returns: 读取每一条测试用用例分别保存到字典中然后再将所有用例保存到列表中[{用例1},{用例2},{用例3}]
[{"":""},{},{}]
"""
sheets = eval(self.get_excel_init().get("sheets"))
test_data = []
for sheet_name in sheets: # 遍历存在配置文件里面的字典sheet_name == 每一个 excel 中的 sheetName
sheet = self.wb[sheet_name] # 获取所有 sheet 句柄
max_row = sheet.max_row # 获取最大行
max_column = sheet.max_column # 获取最大列
fist_header = [] # 获取第一行标题所有值
for i in range(1, max_column + 1):
fist_header.append(sheet.cell(1, i).value)
# 定位单元格
for i in range(2, max_row + 1):
sub_data = {} # 列表内的字典(也就是测试数据)
for k in range(1, max_column + 1):
sub_data[fist_header[k - 1]] = sheet.cell(i, k).value
sub_data["sheet"] = sheet_name
test_data.append(sub_data) # 将所有单元格 title 对应的值组成字典添加到列表中。
return test_data
# @logger.log_decorator()
def do_excel_yield(self):
"""
读取excel数据的生成器
Returns:
"""
sheets = eval(self.get_excel_init().get("sheets"))
for sheet_name in sheets:
sheet = self.wb[sheet_name]
max_row = sheet.max_row
max_column = sheet.max_column
first_header = []
for i in range(1, max_column + 1):
first_header.append(sheet.cell(1, i).value)
for i in range(2, max_row + 1):
sub_data = {}
for k in range(1, max_column + 1):
sub_data[first_header[k - 1]] = sheet.cell(i, k).value
sub_data["sheet"] = sheet_name
yield sub_data
@logger.log_decorator()
def write_back(self, sheet_name, i, **kwargs):
"""
Args:
sheet_name:sheet 名称
i:用例 Id
response_value: 响应结果
test_result: 测试结果
assert_log: 报错结果
Returns:
"""
response_value = kwargs.get("response")
test_result = kwargs.get("test_result")
assert_log = kwargs.get("assert_log")
sheet = self.wb[sheet_name]
sheet.cell(i + 1, 22).value = response_value
sheet.cell(i + 1, 23).value = test_result
sheet.cell(i + 1, 24).value = assert_log
self.wb.save(self.file_name)
@logger.log_decorator()
def clear_date(self):
"""
执行清空单元格数据
Returns:
"""
sheets = eval(self.get_excel_init().get("sheets"))
for sheet_name in sheets:
sheet = self.wb[sheet_name]
max_row = sheet.max_row # 获取最大行
for i in range(2, max_row + 1):
sheet.cell(i, 22).value = ""
sheet.cell(i, 23).value = ""
sheet.cell(i, 24).value = ""
self.wb.save(self.file_name)
return f"清空指定 {sheets} 中的单元格成功"
@logger.log_decorator()
def get_excel_init(self):
"""
获取 excel sheet 名称为 init 中的基础数据
Returns:init 表中的所有数据
"""
max_row = self.init_sheet.max_row # 获取最大行
max_column = self.init_sheet.max_column # 获取最大列
first_head = [] # 存储标题的 list
for i in range(max_column):
first_head.append(self.init_sheet.cell(1, i + 1).value)
init = {}
for k in range(2, max_row + 1):
for i, v in enumerate(first_head):
init[v] = self.init_sheet.cell(k, i + 1).value
if init.get("run").upper() == "YES":
break
return init
def get_excel_init_and_cases(self):
"""
Returns:初始化数据及测试用例组成的元组
"""
try:
self.clear_date()
test_case = self.do_excel_yield()
init_data = self.get_excel_init()
except Exception as e:
raise e
return init_data, test_case
def __init__(self, file_name):
self.file_name = file_name
self.wb = load_workbook(self.file_name)
self.init_sheet = self.wb["init"]
# def __enter__(self):
# self.wb = load_workbook(self.file_name)
# self.init_sheet = self.wb['init']
# return self
#
# def __exit__(self, exc_type, exc_val, exc_tb):
# self.wb.save(self.file_name)
# self.wb.close()
@logger.log_decorator()
def do_excel(self):
"""
通过 title 定位单元格获取所有测试数据
Returns: 读取每一条测试用用例分别保存到字典中然后再将所有用例保存到列表中[{用例1},{用例2},{用例3}]
[{"":""},{},{}]
"""
sheets = eval(self.get_excel_init().get("sheets"))
test_data = []
for sheet_name in sheets: # 遍历存在配置文件里面的字典sheet_name == 每一个 excel 中的 sheetName
sheet = self.wb[sheet_name] # 获取所有 sheet 句柄
max_row = sheet.max_row # 获取最大行
max_column = sheet.max_column # 获取最大列
fist_header = [] # 获取第一行标题所有值
for i in range(1, max_column + 1):
fist_header.append(sheet.cell(1, i).value)
# 定位单元格
for i in range(2, max_row + 1):
sub_data = {} # 列表内的字典(也就是测试数据)
for k in range(1, max_column + 1):
sub_data[fist_header[k - 1]] = sheet.cell(i, k).value
sub_data["sheet"] = sheet_name
test_data.append(sub_data) # 将所有单元格 title 对应的值组成字典添加到列表中。
return test_data
# @logger.log_decorator()
def do_excel_yield(self):
"""
读取excel数据的生成器
Returns:
"""
sheets = eval(self.get_excel_init().get("sheets"))
for sheet_name in sheets:
sheet = self.wb[sheet_name]
max_row = sheet.max_row
max_column = sheet.max_column
first_header = []
for i in range(1, max_column + 1):
first_header.append(sheet.cell(1, i).value)
for i in range(2, max_row + 1):
sub_data = {}
for k in range(1, max_column + 1):
sub_data[first_header[k - 1]] = sheet.cell(i, k).value
sub_data["sheet"] = sheet_name
yield sub_data
@logger.log_decorator()
def write_back(self, sheet_name, i, **kwargs):
"""
Args:
sheet_name:sheet 名称
i:用例 Id
response_value: 响应结果
test_result: 测试结果
assert_log: 报错结果
Returns:
"""
response_value = kwargs.get("response")
test_result = kwargs.get("test_result")
assert_log = kwargs.get("assert_log")
sheet = self.wb[sheet_name]
sheet.cell(i + 1, 22).value = response_value
sheet.cell(i + 1, 23).value = test_result
sheet.cell(i + 1, 24).value = assert_log
self.wb.save(self.file_name)
@logger.log_decorator()
def clear_date(self):
"""
执行清空单元格数据
Returns:
"""
sheets = eval(self.get_excel_init().get("sheets"))
for sheet_name in sheets:
sheet = self.wb[sheet_name]
max_row = sheet.max_row # 获取最大行
for i in range(2, max_row + 1):
sheet.cell(i, 22).value = ""
sheet.cell(i, 23).value = ""
sheet.cell(i, 24).value = ""
self.wb.save(self.file_name)
return f"清空指定 {sheets} 中的单元格成功"
@logger.log_decorator()
def get_excel_init(self):
"""
获取 excel sheet 名称为 init 中的基础数据
Returns:init 表中的所有数据
"""
max_row = self.init_sheet.max_row # 获取最大行
max_column = self.init_sheet.max_column # 获取最大列
first_head = [] # 存储标题的 list
for i in range(max_column):
first_head.append(self.init_sheet.cell(1, i + 1).value)
init = {}
for k in range(2, max_row + 1):
for i, v in enumerate(first_head):
init[v] = self.init_sheet.cell(k, i + 1).value
if init.get("run").upper() == "YES":
break
return init
def get_excel_init_and_cases(self):
"""
Returns:初始化数据及测试用例组成的元组
"""
try:
self.clear_date()
test_case = self.do_excel_yield()
init_data = self.get_excel_init()
except Exception as e:
raise e
return init_data, test_case
if __name__ == '__main__':
from common.config import Config
file_n = Config.test_api
excel = DoExcel(file_n)
# excel.get_excel_init()
# excel.do_excel()
# excel.clear_date()
# excel.do_excel()
from common.config import Config
file_n = Config.test_case
excel = DoExcel(file_n)
# excel.get_excel_init()
# excel.do_excel()
# excel.clear_date()
# excel.do_excel()

View File

@ -17,170 +17,170 @@ from common.file_handling import logger
class DoExcel:
"""
excel操作类
"""
def __init__(self, path=None, index_table=0):
"""
:param: path(str):需要打开的文件模板文件/源文件
1. 为None时调用save()方法时需要传入filename
2. 如果不为空表示打开已有文件
:param: index_table(int):excel中的那个单元
"""
if path:
self.wb = load_workbook(path)
else:
self.wb = Workbook()
self.path = path
self.index_table = index_table
# sheets = self.wb.sheetnames
# sheet = sheets[self.index_table]
# self.sheet = self.wb[sheet]
# self.cell = self.sheet.cell
def set_value_by_cell(self, sheet, row, column, value):
"""
通过cell设置值
:param: row(int):
:param: column(int):
:param: value(str):设置值
"""
ws = self.wb[sheet]
ws.cell(row, column).value = value
def set_value_by_table(self, sheet, tag, value):
"""
通过A1坐标设置值
例如设置A1的值为hello
set_value_by_table('A1', 'hello')
:param: tag(str):具体坐标
:param: value(str):
"""
ws = self.wb[sheet]
ws.sheet[tag] = value
def get_value_by_table(self, sheet, tag):
"""
通过A1坐标获取值
例如获取A1的值为hello
get_value_by_table('A1')
:param: tag(str):具体坐标
:param: value(str):
:return <Cell 'Sheet'.A1>对象
"""
ws = self.wb[sheet]
return ws.sheet[tag].value
def get_value_by_cell(self, sheet, row, column):
"""
通过cell坐标设置值 row行 column
例如获取第一行第一列的值
get_value_by_cell(self,1,1)
:param: row(str):
:param: column(str):
"""
ws = self.wb[sheet]
return ws.cell(row, column).value
def get_max_row(self, sheet):
"""获取最大行数 """
ws = self.wb[sheet]
return ws.sheet.max_row
def get_max_col(self, sheet):
"""获取最大列数 """
ws = self.wb[sheet]
return ws.sheet.max_column
def get_col_value(self, sheet, column, row_start=1, row_end=None):
"""
获取某列多少行的值默认为所有
introduce
:param: column(int):第几列
:param: row_start(int):开始的行默认第一行
:param: row_end(int):结束的行默认获取全部
:return list()
"""
ws = self.wb[sheet]
if not row_end:
row_end = self.get_max_row(sheet)
column_data = []
for i in range(row_start, row_end + 1):
cell_value = ws.cell(row=i, column=column).value
column_data.append(cell_value)
return column_data
# 获取某行所有值
def get_row_value(self, sheet, row, col_start=1, col_end=None):
"""
获取某行多少列的值默认为所有
introduce
:param: row(int):第几行
:param: col_start(int):开始的列默认第一列
:param: col_end(int):结束的列默认获取全部
:return list()
"""
ws = self.wb[sheet]
if not col_end:
col_end = self.get_max_col(sheet)
row_data = []
for i in range(col_start, col_end + 1):
cell_value = ws.cell(row=row, column=i).value
row_data.append(cell_value)
return row_data
@logger.log_decorator()
def save(self, filename=None):
"""
获取文件名
:param: filename(str):保存的文件名
:return:bool
"""
if filename:
self.wb.save(filename)
elif self.path:
self.wb.save(self.path)
else:
# print("保存失败:没有设置文件名")
return False
# print("保存成功")
return True
@logger.log_decorator()
def do_main(self, output_filename=None, *data):
"""
动态保存列表嵌套字典的数据到 excel
:param: output_filename(str):另存为的文件名
:param: *data(list):传入的数据列表
:return: bool
"""
sheet_names = self.wb.sheetnames
target_sheet = sheet_names[self.index_table]
ws = self.wb[target_sheet]
# 清空目标sheet除第一行外的数据
ws.delete_rows(2, ws.max_row)
for i, val in enumerate(data):
c = 0
for k, v in val.items():
# key 作为第一行标题写入
self.set_value_by_cell(target_sheet, 1, c + 1, k)
# value 作为每一条数据写入
self.set_value_by_cell(target_sheet, i + 2, c + 1, v)
c += 1
self.save(output_filename)
"""
excel操作类
"""
def __init__(self, path=None, index_table=0):
"""
:param: path(str):需要打开的文件模板文件/源文件
1. 为None时调用save()方法时需要传入filename
2. 如果不为空表示打开已有文件
:param: index_table(int):excel中的那个单元
"""
if path:
self.wb = load_workbook(path)
else:
self.wb = Workbook()
self.path = path
self.index_table = index_table
# sheets = self.wb.sheetnames
# sheet = sheets[self.index_table]
# self.sheet = self.wb[sheet]
# self.cell = self.sheet.cell
def set_value_by_cell(self, sheet, row, column, value):
"""
通过cell设置值
:param: row(int):
:param: column(int):
:param: value(str):设置值
"""
ws = self.wb[sheet]
ws.cell(row, column).value = value
def set_value_by_table(self, sheet, tag, value):
"""
通过A1坐标设置值
例如设置A1的值为hello
set_value_by_table('A1', 'hello')
:param: tag(str):具体坐标
:param: value(str):
"""
ws = self.wb[sheet]
ws.sheet[tag] = value
def get_value_by_table(self, sheet, tag):
"""
通过A1坐标获取值
例如获取A1的值为hello
get_value_by_table('A1')
:param: tag(str):具体坐标
:param: value(str):
:return <Cell 'Sheet'.A1>对象
"""
ws = self.wb[sheet]
return ws.sheet[tag].value
def get_value_by_cell(self, sheet, row, column):
"""
通过cell坐标设置值 row行 column
例如获取第一行第一列的值
get_value_by_cell(self,1,1)
:param: row(str):
:param: column(str):
"""
ws = self.wb[sheet]
return ws.cell(row, column).value
def get_max_row(self, sheet):
"""获取最大行数 """
ws = self.wb[sheet]
return ws.sheet.max_row
def get_max_col(self, sheet):
"""获取最大列数 """
ws = self.wb[sheet]
return ws.sheet.max_column
def get_col_value(self, sheet, column, row_start=1, row_end=None):
"""
获取某列多少行的值默认为所有
introduce
:param: column(int):第几列
:param: row_start(int):开始的行默认第一行
:param: row_end(int):结束的行默认获取全部
:return list()
"""
ws = self.wb[sheet]
if not row_end:
row_end = self.get_max_row(sheet)
column_data = []
for i in range(row_start, row_end + 1):
cell_value = ws.cell(row=i, column=column).value
column_data.append(cell_value)
return column_data
# 获取某行所有值
def get_row_value(self, sheet, row, col_start=1, col_end=None):
"""
获取某行多少列的值默认为所有
introduce
:param: row(int):第几行
:param: col_start(int):开始的列默认第一列
:param: col_end(int):结束的列默认获取全部
:return list()
"""
ws = self.wb[sheet]
if not col_end:
col_end = self.get_max_col(sheet)
row_data = []
for i in range(col_start, col_end + 1):
cell_value = ws.cell(row=row, column=i).value
row_data.append(cell_value)
return row_data
@logger.log_decorator()
def save(self, filename=None):
"""
获取文件名
:param: filename(str):保存的文件名
:return:bool
"""
if filename:
self.wb.save(filename)
elif self.path:
self.wb.save(self.path)
else:
# print("保存失败:没有设置文件名")
return False
# print("保存成功")
return True
@logger.log_decorator()
def do_main(self, output_filename=None, *data):
"""
动态保存列表嵌套字典的数据到 excel
:param: output_filename(str):另存为的文件名
:param: *data(list):传入的数据列表
:return: bool
"""
sheet_names = self.wb.sheetnames
target_sheet = sheet_names[self.index_table]
ws = self.wb[target_sheet]
# 清空目标sheet除第一行外的数据
ws.delete_rows(2, ws.max_row)
for i, val in enumerate(data):
c = 0
for k, v in val.items():
# key 作为第一行标题写入
self.set_value_by_cell(target_sheet, 1, c + 1, k)
# value 作为每一条数据写入
self.set_value_by_cell(target_sheet, i + 2, c + 1, v)
c += 1
self.save(output_filename)
if __name__ == '__main__':
data = [{"url": "1234", "header": "2134", "method": "get", "body": "hhh", "ok": 12345},
{"url": "1234", "header": "2134"},
{"url": "1234", "header": "2134", "method": "{}sss", "body": json.dumps({})}]
from common.config import Config
template_file = Config.templates
excel = DoExcel(path=template_file)
out_file = r'..\..\OutPut\另存为的文件.xlsx'
excel.do_main(out_file, *data)
data = [{"url": "1234", "header": "2134", "method": "get", "body": "hhh", "ok": 12345},
{"url": "1234", "header": "2134"},
{"url": "1234", "header": "2134", "method": "{}sss", "body": json.dumps({})}]
from common.config import Config
template_file = Config.templates
excel = DoExcel(path=template_file)
out_file = r'..\..\OutPut\另存为的文件.xlsx'
excel.do_main(out_file, *data)

View File

@ -16,150 +16,156 @@ import yaml
class FileUtils:
@staticmethod
def get_all_path(open_file_path):
"""
递归获取目录下所有的文件的路径
Args:
open_file_path: 指定目录路径
@staticmethod
def get_all_path(open_file_path):
"""
递归获取目录下所有的文件的路径
Args:
open_file_path: 指定目录路径
Returns:
包含所有文件路径的列表
"""
path_list = []
for root, dirs, files in os.walk(open_file_path):
path_list.extend([os.path.join(root, file) for file in files])
return path_list
@staticmethod
def get_files_in_folder(folder_path):
"""
获取指定文件夹内的所有文件
Args:
folder_path: 指定文件夹路径
Returns:
包含所有文件名的列表
"""
if not os.path.isdir(folder_path):
raise ValueError("Invalid folder path")
file_list = []
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
file_list.append(filename)
return file_list
@staticmethod
def get_folders_in_path(dir_path):
"""
获取指定路径下的所有文件夹
Args:
dir_path: 指定路径
Returns:
包含所有文件夹名的列表
"""
if not os.path.isdir(dir_path):
raise ValueError("Invalid directory path")
folder_list = []
for foldername in os.listdir(dir_path):
folder_path = os.path.join(dir_path, foldername)
if os.path.isdir(folder_path):
folder_list.append(foldername)
return folder_list
@staticmethod
def read_file(file_path):
"""
读取文件内容
Args:
file_path: 文件路径
Returns:
文件内容的字符串
"""
if not os.path.isfile(file_path):
raise ValueError("Invalid file path")
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
@staticmethod
def read_json_file(file_path):
"""
读取 JSON 文件
Args:
file_path: JSON 文件路径
Returns:
解析后的 JSON 数据
"""
content = FileUtils.read_file(file_path)
try:
return json.loads(content)
except json.JSONDecodeError as e:
raise ValueError("Invalid JSON file: {}".format(e))
@staticmethod
def read_yaml_file(file_path):
"""
读取 YAML 文件
Args:
file_path: YAML 文件路径
Returns:
解析后的 YAML 数据
"""
with open(file_path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
@staticmethod
def get_value_from_dict(data, key_path):
"""
从嵌套字典中获取指定键路径的值
Args:
data: 嵌套字典
key_path: 键路径可以是用点分隔的字符串或字符串列表
Returns:
指定键路径的值如果路径不存在则返回 None
"""
if isinstance(key_path, str):
key_path = key_path.split('.')
for key in key_path:
if isinstance(data, dict) and key in data:
data = data[key]
else:
return None
return data
@staticmethod
def read_config_data(file_path, section, option):
"""
读取配置文件中的数据
Args:
file_path: 配置文件路径
section: 文件中的 section
option: 文件中的 option
Returns:
配置文件中指定数据的值
"""
cf = RawConfigParser()
cf.read(file_path, encoding="UTF-8")
return eval(cf.get(section, option))
@staticmethod
def read_json_data(file_path):
"""
读取 JSON 文件中的数据
Args:
file_path: JSON 文件路径
Returns:
JSON 文件中的数据
"""
with open(file_path, "r", encoding="utf-8") as fb:
return json.load(fb)
Returns:
包含所有文件路径的列表
"""
path_list = []
for root, dirs, files in os.walk(open_file_path):
path_list.extend([os.path.join(root, file) for file in files])
return path_list
@staticmethod
def get_files_in_folder(folder_path):
"""
获取指定文件夹内的所有文件
Args:
folder_path: 指定文件夹路径
Returns:
包含所有文件名的列表
"""
if not os.path.isdir(folder_path):
raise ValueError("Invalid folder path")
file_list = []
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
file_list.append(filename)
return file_list
@staticmethod
def get_folders_in_path(dir_path):
"""
获取指定路径下的所有文件夹
Args:
dir_path: 指定路径
Returns:
包含所有文件夹名的列表
"""
if not os.path.isdir(dir_path):
raise ValueError("Invalid directory path")
folder_list = []
for foldername in os.listdir(dir_path):
folder_path = os.path.join(dir_path, foldername)
if os.path.isdir(folder_path):
folder_list.append(foldername)
return folder_list
@staticmethod
def read_file(file_path):
"""
读取文件内容
Args:
file_path: 文件路径
Returns:
文件内容的字符串
"""
if not os.path.isfile(file_path):
raise ValueError("Invalid file path")
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
@staticmethod
def read_json_file(file_path):
"""
读取 JSON 文件
Args:
file_path: JSON 文件路径
Returns:
解析后的 JSON 数据
"""
content = FileUtils.read_file(file_path)
try:
return json.loads(content)
except json.JSONDecodeError as e:
raise ValueError("Invalid JSON file: {}".format(e))
@staticmethod
def read_yaml_file(file_path):
"""
读取 YAML 文件
Args:
file_path: YAML 文件路径
Returns:
解析后的 YAML 数据
"""
with open(file_path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
@staticmethod
def get_value_from_dict(data, key_path):
"""
从嵌套字典中获取指定键路径的值
Args:
data: 嵌套字典
key_path: 键路径可以是用点分隔的字符串或字符串列表
Returns:
指定键路径的值如果路径不存在则返回 None
"""
if isinstance(key_path, str):
key_path = key_path.split('.')
for key in key_path:
if isinstance(data, dict) and key in data:
data = data[key]
else:
return None
return data
@staticmethod
def read_config_data(file_path, section, option):
"""
读取配置文件中的数据
Args:
file_path: 配置文件路径
section: 文件中的 section
option: 文件中的 option
Returns:
配置文件中指定数据的值
"""
cf = RawConfigParser()
cf.read(file_path, encoding="UTF-8")
return eval(cf.get(section, option))
@staticmethod
def read_json_data(file_path):
"""
读取 JSON 文件中的数据
Args:
file_path: JSON 文件路径
Returns:
JSON 文件中的数据
"""
with open(file_path, "r", encoding="utf-8") as fb:
return json.load(fb)
if __name__ == '__main__':
fu = FileUtils()
rest = fu.read_yaml_file(r'../../config.yaml')
print(rest)

View File

@ -13,25 +13,25 @@ from common.utils.logger import MyLog
@MyLog().decorator_log("读取excel中初始化数据异常")
def get_init(test_file):
"""
Returns:返回初始化数据及测试用例
"""
MyLog().my_log(f"读取测试用例excel文件{test_file}", "info")
excel_handle = DoExcel(test_file) # 实例化对象
try:
excel_handle.clear_date() # 清空 excel 中实际结果列的数据
# test_case = excel_handle.do_excel() # 获取 excel 中的测试用例
test_case = excel_handle.do_excel_yield() # 获取 excel 中的测试用例
init_data = excel_handle.get_excel_init() # 获取初始化基本数据
MyLog().my_log(f"如下是初始化得到得数据:{init_data}", "info")
except Exception as e:
raise e
return excel_handle, init_data, test_case
"""
Returns:返回初始化数据及测试用例
"""
MyLog().my_log(f"读取测试用例excel文件{test_file}", "info")
excel_handle = DoExcel(test_file) # 实例化对象
try:
excel_handle.clear_date() # 清空 excel 中实际结果列的数据
# test_case = excel_handle.do_excel() # 获取 excel 中的测试用例
test_case = excel_handle.do_excel_yield() # 获取 excel 中的测试用例
init_data = excel_handle.get_excel_init() # 获取初始化基本数据
MyLog().my_log(f"如下是初始化得到得数据:{init_data}", "info")
except Exception as e:
raise e
return excel_handle, init_data, test_case
if __name__ == '__main__':
from common.config import Config
init = get_init(Config.test_api)
print(init)
from common.config import Config
init = get_init(Config.test_case)
print(init)

View File

@ -17,83 +17,83 @@ from common.validation.load_modules_from_folder import LoadModulesFromFolder
# @singleton
class Pyt(LoadModulesFromFolder):
# 类属性,保存一个会话对象,防止每次都创建一个新的会话,节省资源
session = requests.Session()
def __init__(self):
super().__init__()
self.request = None
self.response = None
# @staticmethod
def log_decorator(msg="请求异常"):
def decorator(func):
def wrapper(*args, **kwargs):
try:
print(f"发送请求的参数: {kwargs}")
response = func(*args, **kwargs)
print(f"请求地址 --> {response.request.url}")
print(f"请求头 --> {response.request.headers}")
print(f"请求 body --> {response.request.body}")
print(f"接口状态--> {response.status_code}")
print(f"接口耗时--> {response.elapsed}")
print(f"接口响应--> {response.text}")
return response
except Exception as e:
logger.error(f"发送请求失败: {e}")
return
return wrapper
return decorator
@log_decorator()
def http_client(self, host, url, method, **kwargs):
"""
发送 http 请求
@param host: 域名
@param __url: 接口 __url
@param method: http 请求方法
# @param request_data_type: 请求数据类型
# @param headers: 请求头部信息,默认为 None
@param kwargs: 接受 requests 原生的关键字参数
@return: 响应对象
"""
# 关闭 https 警告信息
urllib3.disable_warnings()
if not url:
raise ValueError("URL cannot be None")
__url = f'{host}{url}' if not re.match(r"https?", url) else url
# 获取session 中的请求方法
# func = getattr(session, method.lower())
# 增加兼容
# 处理 headers 参数为字符串类型的情况
if 'headers' in kwargs and isinstance(kwargs['headers'], str):
kwargs['headers'] = json.loads(kwargs['headers'])
# 处理 json 参数为字符串类型的情况
if 'json' in kwargs and isinstance(kwargs['json'], str):
kwargs['json'] = json.loads(kwargs['json'])
# 发送请求
# return func(__url, verify=True, timeout=30, **kwargs)
self.request = requests.Request(method, __url, **kwargs)
self.response = self.session.send(self.request.prepare(), timeout=30, verify=True)
return self.response
# 类属性,保存一个会话对象,防止每次都创建一个新的会话,节省资源
session = requests.Session()
def __init__(self):
super().__init__()
self.request = None
self.response = None
# @staticmethod
def log_decorator(msg="请求异常"):
def decorator(func):
def wrapper(*args, **kwargs):
try:
print(f"发送请求的参数: {kwargs}")
response = func(*args, **kwargs)
print(f"请求地址 --> {response.request.url}")
print(f"请求头 --> {response.request.headers}")
print(f"请求 body --> {response.request.body}")
print(f"接口状态--> {response.status_code}")
print(f"接口耗时--> {response.elapsed}")
print(f"接口响应--> {response.text}")
return response
except Exception as e:
logger.error(f"发送请求失败: {e}")
return
return wrapper
return decorator
@log_decorator()
def http_client(self, host, url, method, **kwargs):
"""
发送 http 请求
@param host: 域名
@param __url: 接口 __url
@param method: http 请求方法
# @param request_data_type: 请求数据类型
# @param headers: 请求头部信息,默认为 None
@param kwargs: 接受 requests 原生的关键字参数
@return: 响应对象
"""
# 关闭 https 警告信息
urllib3.disable_warnings()
if not url:
raise ValueError("URL cannot be None")
__url = f'{host}{url}' if not re.match(r"https?", url) else url
# 获取session 中的请求方法
# func = getattr(session, method.lower())
# 增加兼容
# 处理 headers 参数为字符串类型的情况
if 'headers' in kwargs and isinstance(kwargs['headers'], str):
kwargs['headers'] = json.loads(kwargs['headers'])
# 处理 json 参数为字符串类型的情况
if 'json' in kwargs and isinstance(kwargs['json'], str):
kwargs['json'] = json.loads(kwargs['json'])
# 发送请求
# return func(__url, verify=True, timeout=30, **kwargs)
self.request = requests.Request(method, __url, **kwargs)
self.response = self.session.send(self.request.prepare(), timeout=30, verify=True)
return self.response
if __name__ == '__main__':
hst = 'https://ibs-test.bzlrobot.com'
url = '/api/ibs-auth/ibs_platform/login?t=168672334'
method = 'post'
kwargs = {
'json': '{"account": "luoshunwen005", "grantType": "password", "isBip": "false","password": "o+t2SnEEylblxlfIspJUvGFa0gCDNrU2dC34LjVFqIiTmxa855YDBE/6J7eRVBGaQwR7mozSKComk9n6kjSNRjSX1m574dRZdESIeYsmM/xk2Nt5n5dqB268qCMivJMXpHQMygpT4RpDiYoOiEqlOi9eG5G7v/5rixHiZ9xv98m34xVD1VdlaCbphoB9JI7T9HmVFJniSWt01ruC5t+aFUvfxLjOpRmYmfz8GwtSd5XXKaKr29ce1C39Fg+PtqOkQ3cOLVS9hXgzz6s2zud0++T4vwgVtrHx86aMrrozhCdKzrQuWPEO1cSsaEaNVdSUsT54je+4O+xKzxkJhoGMnQ=="}',
'headers': None}
pyt = Pyt()
pyt.http_client(hst, url, method, **kwargs)
# print(pyt.request.json)
# print(pyt.request.headers)
# print(pyt.response.text)
hst = 'https://ibs-test.bzlrobot.com'
url = '/api/ibs-auth/ibs_platform/login?t=168672334'
method = 'post'
kwargs = {
'json': '{"account": "luoshunwen005", "grantType": "password", "isBip": "false","password": "o+t2SnEEylblxlfIspJUvGFa0gCDNrU2dC34LjVFqIiTmxa855YDBE/6J7eRVBGaQwR7mozSKComk9n6kjSNRjSX1m574dRZdESIeYsmM/xk2Nt5n5dqB268qCMivJMXpHQMygpT4RpDiYoOiEqlOi9eG5G7v/5rixHiZ9xv98m34xVD1VdlaCbphoB9JI7T9HmVFJniSWt01ruC5t+aFUvfxLjOpRmYmfz8GwtSd5XXKaKr29ce1C39Fg+PtqOkQ3cOLVS9hXgzz6s2zud0++T4vwgVtrHx86aMrrozhCdKzrQuWPEO1cSsaEaNVdSUsT54je+4O+xKzxkJhoGMnQ=="}',
'headers': None}
pyt = Pyt()
pyt.http_client(hst, url, method, **kwargs)
# print(pyt.request.json)
# print(pyt.request.headers)
# print(pyt.response.text)

View File

@ -1,36 +1,36 @@
class Hooks:
def __init__(self):
self.before_request_funcs = [] # 存放 before_request 钩子函数的列表
self.after_request_funcs = [] # 存放 after_request 钩子函数的列表
def before_request(self, func):
"""
注册 before_request 钩子函数将其添加到 before_request_funcs 列表中
"""
self.before_request_funcs.append(func)
print(self.before_request_funcs)
return func
def after_request(self, func):
"""
注册 after_request 钩子函数将其添加到 after_request_funcs 列表中
"""
self.after_request_funcs.append(func)
print(self.after_request_funcs)
return func
def run_before_request_funcs(self, request):
"""
依次执行 before_request 钩子函数处理请求参数并返回处理后的请求对象
"""
for func in self.before_request_funcs:
request = func(request)
return request
def run_after_request_funcs(self, response):
"""
依次执行 after_request 钩子函数处理响应结果并返回处理后的响应对象
"""
for func in self.after_request_funcs:
response = func(response)
return response
def __init__(self):
self.before_request_funcs = [] # 存放 before_request 钩子函数的列表
self.after_request_funcs = [] # 存放 after_request 钩子函数的列表
def before_request(self, func):
"""
注册 before_request 钩子函数将其添加到 before_request_funcs 列表中
"""
self.before_request_funcs.append(func)
print(self.before_request_funcs)
return func
def after_request(self, func):
"""
注册 after_request 钩子函数将其添加到 after_request_funcs 列表中
"""
self.after_request_funcs.append(func)
print(self.after_request_funcs)
return func
def run_before_request_funcs(self, request):
"""
依次执行 before_request 钩子函数处理请求参数并返回处理后的请求对象
"""
for func in self.before_request_funcs:
request = func(request)
return request
def run_after_request_funcs(self, response):
"""
依次执行 after_request 钩子函数处理响应结果并返回处理后的响应对象
"""
for func in self.after_request_funcs:
response = func(response)
return response

View File

@ -11,54 +11,54 @@ hooks = Hooks()
@logger.log_decorator()
@hooks.before_request
def update_url(request):
"""更新url"""
request.url = dep_par.replace_dependent_parameter(request.url)
print(request.url)
return request
"""更新url"""
request.url = dep_par.replace_dependent_parameter(request.url)
print(request.url)
return request
@logger.log_decorator()
@hooks.before_request
def update_header(request):
"""更新请求头"""
request.headers = dep_par.replace_dependent_parameter(request.headers)
print(request.headers)
return request
"""更新请求头"""
request.headers = dep_par.replace_dependent_parameter(request.headers)
print(request.headers)
return request
@logger.log_decorator()
@hooks.before_request
def update_body(request):
"""更新请求参数"""
if request.json:
request.json = dep_par.replace_dependent_parameter(request.json)
if request.encryption:
request.data = do_encrypt(request.encryption, request.json) # 数据加密MD5  
else:
request.data = dep_par.replace_dependent_parameter(request.data)
if request.encryption:
request.data = do_encrypt(request.encryption, request.data) # 数据加密MD5  
return request
"""更新请求参数"""
if request.json:
request.json = dep_par.replace_dependent_parameter(request.json)
if request.encryption:
request.data = do_encrypt(request.encryption, request.json) # 数据加密MD5  
else:
request.data = dep_par.replace_dependent_parameter(request.data)
if request.encryption:
request.data = do_encrypt(request.encryption, request.data) # 数据加密MD5  
return request
@logger.log_decorator()
@hooks.before_request
def update_expected(request):
"""更新预期结果"""
request.expected = dep_par.replace_dependent_parameter(request.expected)
print(request.expected)
return request
"""更新预期结果"""
request.expected = dep_par.replace_dependent_parameter(request.expected)
print(request.expected)
return request
@logger.log_decorator()
@hooks.after_request
def parse_json(response):
"""
尝试将响应中的内容解析为 JSON 格式
"""
try:
response.json_data = response.json()
except ValueError:
response.json_data = None
return response
"""
尝试将响应中的内容解析为 JSON 格式
"""
try:
response.json_data = response.json()
except ValueError:
response.json_data = None
return response

View File

@ -3,69 +3,69 @@ import random
class RandomBankCard(object):
def __init__(self, csv_path=""):
self.card_bin_csv = csv.reader(open("{0}cardbin.csv".format(csv_path), "r", encoding='utf-8'))
self.card_bin_head = next(self.card_bin_csv)
self.card_bin_data = [item for item in self.card_bin_csv]
# print(self.card_bin_data)
def _get_bank_card(self, bank_name=""):
bank_card_list = []
if bank_name:
for item in self.card_bin_data:
if item[0] == bank_name and item[2] == "银行卡":
bank_card_list.append(item)
else:
for item in self.card_bin_data:
if item[2] == "银行卡":
bank_card_list.append(item)
return bank_card_list
def _get_credit_card(self, bank_name=""):
bank_card_list = []
if bank_name:
for item in self.card_bin_data:
if item[0] == bank_name and item[2] == "信用卡":
bank_card_list.append(item)
else:
for item in self.card_bin_data:
if item[2] == "信用卡":
bank_card_list.append(item)
return bank_card_list
def _get_check_num(self, bank_card):
check_sum = 0
for i in bank_card[-1::-2]:
for m in str(int(i) * 2):
check_sum = check_sum + int(m)
for j in bank_card[-2::-2]:
check_sum = check_sum + int(j)
if check_sum % 10 == 0:
check_num = '0'
else:
check_num = str(10 - check_sum % 10)
return check_num
def _get_card_num(self, bank_item):
bin_num = bank_item[1]
mid_num = "".join([str(random.randint(0, 9)) for i in range(int(bank_item[3]) - len(bin_num))])
check_num = self._get_check_num("".join([bin_num, mid_num]))
return "".join([bin_num, mid_num, check_num])
def get_bank_card(self, bank_name="", bank_type=""):
if bank_type == "银行卡":
bank_card = self._get_bank_card(bank_name)
elif bank_type == "信用卡":
bank_card = self._get_credit_card(bank_name)
else:
bank_card = self.card_bin_data
bank_card_num = self._get_card_num(random.choice(bank_card))
return bank_card_num
def __init__(self, csv_path=""):
self.card_bin_csv = csv.reader(open("{0}cardbin.csv".format(csv_path), "r", encoding='utf-8'))
self.card_bin_head = next(self.card_bin_csv)
self.card_bin_data = [item for item in self.card_bin_csv]
# print(self.card_bin_data)
def _get_bank_card(self, bank_name=""):
bank_card_list = []
if bank_name:
for item in self.card_bin_data:
if item[0] == bank_name and item[2] == "银行卡":
bank_card_list.append(item)
else:
for item in self.card_bin_data:
if item[2] == "银行卡":
bank_card_list.append(item)
return bank_card_list
def _get_credit_card(self, bank_name=""):
bank_card_list = []
if bank_name:
for item in self.card_bin_data:
if item[0] == bank_name and item[2] == "信用卡":
bank_card_list.append(item)
else:
for item in self.card_bin_data:
if item[2] == "信用卡":
bank_card_list.append(item)
return bank_card_list
def _get_check_num(self, bank_card):
check_sum = 0
for i in bank_card[-1::-2]:
for m in str(int(i) * 2):
check_sum = check_sum + int(m)
for j in bank_card[-2::-2]:
check_sum = check_sum + int(j)
if check_sum % 10 == 0:
check_num = '0'
else:
check_num = str(10 - check_sum % 10)
return check_num
def _get_card_num(self, bank_item):
bin_num = bank_item[1]
mid_num = "".join([str(random.randint(0, 9)) for i in range(int(bank_item[3]) - len(bin_num))])
check_num = self._get_check_num("".join([bin_num, mid_num]))
return "".join([bin_num, mid_num, check_num])
def get_bank_card(self, bank_name="", bank_type=""):
if bank_type == "银行卡":
bank_card = self._get_bank_card(bank_name)
elif bank_type == "信用卡":
bank_card = self._get_credit_card(bank_name)
else:
bank_card = self.card_bin_data
bank_card_num = self._get_card_num(random.choice(bank_card))
return bank_card_num
if __name__ == '__main__':
bank_card_obj = RandomBankCard()
print(bank_card_obj.get_bank_card())
bank_card_obj = RandomBankCard()
print(bank_card_obj.get_bank_card())

View File

@ -9,152 +9,154 @@ import sys
sys.path.append('../../../')
sys.path.append('../..')
# from common.config import Config
class Social(object):
'''
统一社会信用代码 + 组织结构代码校验
'''
def __init__(self):
'''
Constructor
'''
# 统一社会信用代码中不使用I,O,S,V,Z
# ''.join([str(i) for i in range(10)])
# import string
# string.ascii_uppercase # ascii_lowercase | ascii_letters
# dict([i for i in zip(list(self.string), range(len(self.string)))])
# dict(enumerate(self.string))
# list(d.keys())[list(d.values()).index(10)]
# chr(97) --> 'a'
self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17,
'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
# 第i位置上的加权因子
self.social_credit_weighting_factor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
# GB11714-1997全国组织机构代码编制规则中代码字符集
self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.ORGANIZATION_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,
'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26,
'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35}
# 第i位置上的加权因子
self.organization_weighting_factor = [3, 7, 9, 10, 5, 8, 4, 2]
def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
'''
@param weighting_factor: 加权因子
@param ontology_code:本体代码
@param modulus: 模数(求余用)
@param check_code_dict: 字符字典
'''
total = 0
for i in range(len(ontology_code)):
if ontology_code[i].isdigit():
# print(ontology_code[i], weighting_factor[i])
total += int(ontology_code[i]) * weighting_factor[i]
else:
num = check_code_dict.get(ontology_code[i], -1)
if num < 0:
return -1
total += num * weighting_factor[i]
diff = modulus - total % modulus
return diff
'''
统一社会信用代码 + 组织结构代码校验
'''
def __init__(self):
'''
Constructor
'''
# 统一社会信用代码中不使用I,O,S,V,Z
# ''.join([str(i) for i in range(10)])
# import string
# string.ascii_uppercase # ascii_lowercase | ascii_letters
# dict([i for i in zip(list(self.string), range(len(self.string)))])
# dict(enumerate(self.string))
# list(d.keys())[list(d.values()).index(10)]
# chr(97) --> 'a'
self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17,
'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
# 第i位置上的加权因子
self.social_credit_weighting_factor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
# GB11714-1997全国组织机构代码编制规则中代码字符集
self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.ORGANIZATION_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,
'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26,
'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35}
# 第i位置上的加权因子
self.organization_weighting_factor = [3, 7, 9, 10, 5, 8, 4, 2]
def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
'''
@param weighting_factor: 加权因子
@param ontology_code:本体代码
@param modulus: 模数(求余用)
@param check_code_dict: 字符字典
'''
total = 0
for i in range(len(ontology_code)):
if ontology_code[i].isdigit():
# print(ontology_code[i], weighting_factor[i])
total += int(ontology_code[i]) * weighting_factor[i]
else:
num = check_code_dict.get(ontology_code[i], -1)
if num < 0:
return -1
total += num * weighting_factor[i]
diff = modulus - total % modulus
return diff
def unified_social_credit_code():
"""统一社会信用代码"""
department = "123456789999999999999999" # 登记管理部门代码
agency = "11111111111111112121212345999" # 机构类别
organization_num = str(random.randint(11111111, 99999999))
u = Social()
# 组织机构代码校验位
check_code = u.gen_check_code(u.organization_weighting_factor, organization_num, 11, u.ORGANIZATION_CHECK_CODE_DICT)
organization_code = organization_num + str(check_code) # 组织机构代码
address_code = get_address(True)
# 没有校验码的社会统一代码
un_code = random.choice(department) + random.choice(agency) + str(address_code) + organization_code
# 社会 校验位
social_num = u.gen_check_code(u.social_credit_weighting_factor, un_code, 31, u.SOCIAL_CREDIT_CHECK_CODE_DICT)
if social_num == 31:
social_num = 0
social_dict = {value: key for key, value in u.SOCIAL_CREDIT_CHECK_CODE_DICT.items()}
# 两位证书 转换成 协议里面的值
social_key = social_dict[social_num]
code = un_code + social_key
return code
"""统一社会信用代码"""
department = "123456789999999999999999" # 登记管理部门代码
agency = "11111111111111112121212345999" # 机构类别
organization_num = str(random.randint(11111111, 99999999))
u = Social()
# 组织机构代码校验位
check_code = u.gen_check_code(u.organization_weighting_factor, organization_num, 11,
u.ORGANIZATION_CHECK_CODE_DICT)
organization_code = organization_num + str(check_code) # 组织机构代码
address_code = get_address(True)
# 没有校验码的社会统一代码
un_code = random.choice(department) + random.choice(agency) + str(address_code) + organization_code
# 社会 校验位
social_num = u.gen_check_code(u.social_credit_weighting_factor, un_code, 31, u.SOCIAL_CREDIT_CHECK_CODE_DICT)
if social_num == 31:
social_num = 0
social_dict = {value: key for key, value in u.SOCIAL_CREDIT_CHECK_CODE_DICT.items()}
# 两位证书 转换成 协议里面的值
social_key = social_dict[social_num]
code = un_code + social_key
return code
def get_address(code=False, random_switch=True, all_info=False, **kwargs):
"""
:param code: 只返回 地区码
:param random_switch: 自定义区域 然后随机地区
:param kwargs: province_num = city_info = district_info =
:return: code False 省市区 code True 地区吗
"""
import json
address_path = os.path.join(os.path.dirname(__file__), "address.json")
with open(address_path, 'r', encoding='UTF-8') as file:
info = json.load(file)
i = 0
province_num = None
city_info = None
district_info = None
error_num = 0
while True:
try:
if random_switch:
province_num = random.randint(0, len(info) - 1)
else:
for address_info in info:
if kwargs['province_name'] == address_info['name']:
province_num = i
break
i += 1
province_date = info[province_num]
province_name = province_date['name']
if 'city_name' in kwargs.keys():
for city in province_date['child']:
if city['name'] == kwargs['city_name']:
city_info = city
break
city_name = kwargs['city_name']
else:
city_info = random.choice(province_date['child'])
city_name = city_info['name']
if 'district_name' in kwargs.keys():
for district in city_info['child']:
if district['name'] == kwargs['district_name']:
district_info = district
else:
district_info = random.choice(city_info['child'])
district_name = district_info['name'].replace(' ', '')
if code and not all_info:
return district_info['code']
elif code and all_info:
return province_name, city_name, district_name, district_info['code']
else:
return province_name, city_name, district_name
except Exception as e:
error_num += 1
if error_num >= 3:
raise Exception(e)
"""
:param code: 只返回 地区码
:param random_switch: 自定义区域 然后随机地区
:param kwargs: province_num = city_info = district_info =
:return: code False 省市区 code True 地区吗
"""
import json
address_path = os.path.join(os.path.dirname(__file__), "address.json")
with open(address_path, 'r', encoding='UTF-8') as file:
info = json.load(file)
i = 0
province_num = None
city_info = None
district_info = None
error_num = 0
while True:
try:
if random_switch:
province_num = random.randint(0, len(info) - 1)
else:
for address_info in info:
if kwargs['province_name'] == address_info['name']:
province_num = i
break
i += 1
province_date = info[province_num]
province_name = province_date['name']
if 'city_name' in kwargs.keys():
for city in province_date['child']:
if city['name'] == kwargs['city_name']:
city_info = city
break
city_name = kwargs['city_name']
else:
city_info = random.choice(province_date['child'])
city_name = city_info['name']
if 'district_name' in kwargs.keys():
for district in city_info['child']:
if district['name'] == kwargs['district_name']:
district_info = district
else:
district_info = random.choice(city_info['child'])
district_name = district_info['name'].replace(' ', '')
if code and not all_info:
return district_info['code']
elif code and all_info:
return province_name, city_name, district_name, district_info['code']
else:
return province_name, city_name, district_name
except Exception as e:
error_num += 1
if error_num >= 3:
raise Exception(e)
if __name__ == '__main__':
t = get_address()
c = unified_social_credit_code()
# print(t)
print(c)
t = get_address()
c = unified_social_credit_code()
# print(t)
print(c)

View File

@ -7,195 +7,195 @@ import re
class UnifiedSocialCreditIdentifier(object):
'''
统一社会信用代码 + 组织结构代码校验
'''
def __init__(self):
'''
Constructor
'''
# 统一社会信用代码中不使用I,O,S,V,Z
# ''.join([str(i) for i in range(10)])
# import string
# string.ascii_uppercase # ascii_lowercase | ascii_letters
# dict([i for i in zip(list(self.string), range(len(self.string)))])
# dict(enumerate(self.string))
# list(d.keys())[list(d.values()).index(10)]
# chr(97) --> 'a'
self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17,
'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
# 第i位置上的加权因子
self.social_credit_weighting_factor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
# GB11714-1997全国组织机构代码编制规则中代码字符集
self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.ORGANIZATION_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,
'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26,
'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35}
# 第i位置上的加权因子
self.organization_weighting_factor = [3, 7, 9, 10, 5, 8, 4, 2]
def check_social_credit_code(self, code):
'''
统一社会信用代码校验
国家标准GB32100201518位统一社会信用代码从2015年10月1日正式实行
标准规定统一社会信用代码用18位阿拉伯数字或大写英文字母不使用IOZSV表示
分别是1位登记管理部门代码1位机构类别代码6位登记管理机关行政区划码9位主体标识码组织机构代码1位校验码
税号 = 6位行政区划码 + 9位组织机构代码
计算校验码公式:
C18 = 31-mod(sum(Ci*Wi)31)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C18为校验码
c18=30, Y; c18=31, 0
'''
# 主要是避免缺失值乱入
# if type(code) != str: return False
# 转大写
code = code.upper()
# 1. 长度限制
if len(code) != 18:
print('{} -- 统一社会信用代码长度不等18'.format(code))
return False
# 2. 不含IOSVZ -- 组成限制, 非字典表给个非常大的数, 不超过15000
'''lst = list('IOSVZ')
for s in lst:
if s in code:
print('包含非组成字符:%s' % (s))
return False'''
# 2. 组成限制
# 登记管理部门1=机构编制; 5=民政; 9=工商; Y=其他
# 机构类别代码:
'''
机构编制=11=机关 | 2=事业单位 | 3=中央编办直接管理机构编制的群众团体 | 9=其他
民政=51=社会团体 | 2=民办非企业单位 | 3=基金会 | 9=其他
工商=91=企业 | 2=个体工商户 | 3=农民专业合作社
其他=Y1=其他
'''
reg = r'^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}\w{9}\w$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False
# 3. 校验码验证
# 本体代码
ontology_code = code[:17]
# 校验码
check_code = code[17]
# 计算校验码
tmp_check_code = self.gen_check_code(self.social_credit_weighting_factor,
ontology_code,
31,
self.SOCIAL_CREDIT_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False
tmp_check_code = (0 if tmp_check_code == 31 else tmp_check_code)
if self.string1[tmp_check_code] == check_code:
# print('{} -- 统一社会信用代码校验正确!'.format(code))
return True
else:
print('{} -- 统一社会信用代码校验错误!'.format(code))
return False
def check_organization_code(self, code):
'''
组织机构代码校验
该规则按照GB 11714编制统一社会信用代码的第9~17位为主体标识码(组织机构代码)共九位字符
计算校验码公式:
C9 = 11-mod(sum(Ci*Wi)11)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C9为校验码
C9=10, X; C9=11, 0
@param code: 统一社会信用代码 / 组织机构代码
'''
# 主要是避免缺失值乱入
# if type(code) != str: return False
# 1. 长度限制
if len(code) != 9:
print('{} -- 组织机构代码长度不等9'.format(code))
return False
# 2. 组成限制
reg = r'^\w{9}$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False
# 3. 校验码验证
# 本体代码
ontology_code = code[:8]
# 校验码
check_code = code[8]
# 计算校验码
tmp_check_code = self.gen_check_code(self.organization_weighting_factor,
ontology_code,
11,
self.ORGANIZATION_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False
tmp_check_code = (0 if tmp_check_code == 11
else (33 if tmp_check_code == 10 else tmp_check_code))
if self.string2[tmp_check_code] == check_code:
# print('{} -- 组织机构代码校验正确!'.format(code))
return True
else:
print('{} -- 组织机构代码校验错误!'.format(code))
return False
def check_code(self, code, code_type='sc'):
'''Series类型
@code_type {org, sc}'''
# try:
if type(code) != str: return False
if code_type == 'sc':
return self.check_social_credit_code(code)
elif code_type == 'org':
return self.check_organization_code(code)
else:
if len(code) == 18:
return self.check_social_credit_code(code)
else:
return self.check_organization_code(code) if len(code) == 9 else False
# except Exception as err:
# print(err)
# print('code:', code)
def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
'''
@param weighting_factor: 加权因子
@param ontology_code:本体代码
@param modulus: 模数(求余用)
@param check_code_dict: 字符字典
'''
total = 0
for i in range(len(ontology_code)):
if ontology_code[i].isdigit():
# print(ontology_code[i], weighting_factor[i])
total += int(ontology_code[i]) * weighting_factor[i]
else:
num = check_code_dict.get(ontology_code[i], -1)
if num < 0: return -1
total += num * weighting_factor[i]
diff = modulus - total % modulus
# print(diff)
return diff
'''
统一社会信用代码 + 组织结构代码校验
'''
def __init__(self):
'''
Constructor
'''
# 统一社会信用代码中不使用I,O,S,V,Z
# ''.join([str(i) for i in range(10)])
# import string
# string.ascii_uppercase # ascii_lowercase | ascii_letters
# dict([i for i in zip(list(self.string), range(len(self.string)))])
# dict(enumerate(self.string))
# list(d.keys())[list(d.values()).index(10)]
# chr(97) --> 'a'
self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17,
'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
# 第i位置上的加权因子
self.social_credit_weighting_factor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
# GB11714-1997全国组织机构代码编制规则中代码字符集
self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.ORGANIZATION_CHECK_CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,
'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26,
'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35}
# 第i位置上的加权因子
self.organization_weighting_factor = [3, 7, 9, 10, 5, 8, 4, 2]
def check_social_credit_code(self, code):
'''
统一社会信用代码校验
国家标准GB32100201518位统一社会信用代码从2015年10月1日正式实行
标准规定统一社会信用代码用18位阿拉伯数字或大写英文字母不使用IOZSV表示
分别是1位登记管理部门代码1位机构类别代码6位登记管理机关行政区划码9位主体标识码组织机构代码1位校验码
税号 = 6位行政区划码 + 9位组织机构代码
计算校验码公式:
C18 = 31-mod(sum(Ci*Wi)31)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C18为校验码
c18=30, Y; c18=31, 0
'''
# 主要是避免缺失值乱入
# if type(code) != str: return False
# 转大写
code = code.upper()
# 1. 长度限制
if len(code) != 18:
print('{} -- 统一社会信用代码长度不等18'.format(code))
return False
# 2. 不含IOSVZ -- 组成限制, 非字典表给个非常大的数, 不超过15000
'''lst = list('IOSVZ')
for s in lst:
if s in code:
print('包含非组成字符:%s' % (s))
return False'''
# 2. 组成限制
# 登记管理部门1=机构编制; 5=民政; 9=工商; Y=其他
# 机构类别代码:
'''
机构编制=11=机关 | 2=事业单位 | 3=中央编办直接管理机构编制的群众团体 | 9=其他
民政=51=社会团体 | 2=民办非企业单位 | 3=基金会 | 9=其他
工商=91=企业 | 2=个体工商户 | 3=农民专业合作社
其他=Y1=其他
'''
reg = r'^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}\w{9}\w$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False
# 3. 校验码验证
# 本体代码
ontology_code = code[:17]
# 校验码
check_code = code[17]
# 计算校验码
tmp_check_code = self.gen_check_code(self.social_credit_weighting_factor,
ontology_code,
31,
self.SOCIAL_CREDIT_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False
tmp_check_code = (0 if tmp_check_code == 31 else tmp_check_code)
if self.string1[tmp_check_code] == check_code:
# print('{} -- 统一社会信用代码校验正确!'.format(code))
return True
else:
print('{} -- 统一社会信用代码校验错误!'.format(code))
return False
def check_organization_code(self, code):
'''
组织机构代码校验
该规则按照GB 11714编制统一社会信用代码的第9~17位为主体标识码(组织机构代码)共九位字符
计算校验码公式:
C9 = 11-mod(sum(Ci*Wi)11)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C9为校验码
C9=10, X; C9=11, 0
@param code: 统一社会信用代码 / 组织机构代码
'''
# 主要是避免缺失值乱入
# if type(code) != str: return False
# 1. 长度限制
if len(code) != 9:
print('{} -- 组织机构代码长度不等9'.format(code))
return False
# 2. 组成限制
reg = r'^\w{9}$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False
# 3. 校验码验证
# 本体代码
ontology_code = code[:8]
# 校验码
check_code = code[8]
# 计算校验码
tmp_check_code = self.gen_check_code(self.organization_weighting_factor,
ontology_code,
11,
self.ORGANIZATION_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False
tmp_check_code = (0 if tmp_check_code == 11
else (33 if tmp_check_code == 10 else tmp_check_code))
if self.string2[tmp_check_code] == check_code:
# print('{} -- 组织机构代码校验正确!'.format(code))
return True
else:
print('{} -- 组织机构代码校验错误!'.format(code))
return False
def check_code(self, code, code_type='sc'):
'''Series类型
@code_type {org, sc}'''
# try:
if type(code) != str: return False
if code_type == 'sc':
return self.check_social_credit_code(code)
elif code_type == 'org':
return self.check_organization_code(code)
else:
if len(code) == 18:
return self.check_social_credit_code(code)
else:
return self.check_organization_code(code) if len(code) == 9 else False
# except Exception as err:
# print(err)
# print('code:', code)
def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
'''
@param weighting_factor: 加权因子
@param ontology_code:本体代码
@param modulus: 模数(求余用)
@param check_code_dict: 字符字典
'''
total = 0
for i in range(len(ontology_code)):
if ontology_code[i].isdigit():
# print(ontology_code[i], weighting_factor[i])
total += int(ontology_code[i]) * weighting_factor[i]
else:
num = check_code_dict.get(ontology_code[i], -1)
if num < 0: return -1
total += num * weighting_factor[i]
diff = modulus - total % modulus
# print(diff)
return diff
if __name__ == '__main__':
# 统一社会信用代码及组织机构代码校验
u = UnifiedSocialCreditIdentifier()
# print(u.check_social_credit_code(code='91330382575324831A'))
# print(u.check_social_credit_code(code='91330382575324831A'))
print(u.check_organization_code(code='575324831'))
print(u.check_organization_code(code='575324831'))
# 统一社会信用代码及组织机构代码校验
u = UnifiedSocialCreditIdentifier()
# print(u.check_social_credit_code(code='91330382575324831A'))
# print(u.check_social_credit_code(code='91330382575324831A'))
print(u.check_organization_code(code='575324831'))
print(u.check_organization_code(code='575324831'))

View File

@ -4,50 +4,50 @@ import pypinyin
class RandomEmail(object):
'''随机Email'''
def __init__(self, csv_path=""):
'''
Args:
email_csv: 邮箱csv文件
email_head: 邮箱csv字段名称
email_data: 邮箱数据集
'''
self.email_csv = csv.reader(open("{0}free_email.csv".format(csv_path), "r", encoding='utf-8'))
self.email_head = next(self.email_csv)
self.email_data = [item for item in self.email_csv]
def _chinese_to_pinyin(self, chinese_name):
'''中文转拼音
Args
chinese_name: str, 中文名字
Returns:
pinyin_name: str, 拼音名字
'''
pinyin_name = ''
for i in pypinyin.pinyin(chinese_name, style=pypinyin.NORMAL):
pinyin_name += ''.join(i)
return pinyin_name
'''随机Email'''
def __init__(self, csv_path=""):
'''
Args:
email_csv: 邮箱csv文件
email_head: 邮箱csv字段名称
email_data: 邮箱数据集
'''
self.email_csv = csv.reader(open("{0}free_email.csv".format(csv_path), "r", encoding='utf-8'))
self.email_head = next(self.email_csv)
self.email_data = [item for item in self.email_csv]
def _chinese_to_pinyin(self, chinese_name):
'''中文转拼音
Args
chinese_name: str, 中文名字
Returns:
pinyin_name: str, 拼音名字
'''
pinyin_name = ''
for i in pypinyin.pinyin(chinese_name, style=pypinyin.NORMAL):
pinyin_name += ''.join(i)
return pinyin_name
def get_email(self, chinese_name, email_types=None):
'''随机生成邮箱地址,
Args:
chinese_name: str, 中文名字
email_types: list, ["163"]类型为@163.com的邮箱地址, 随机范围
Returns:
email: str, 邮箱地址
'''
if email_types:
email_address = [item[1] for item in self.email_data if item[0] in email_types]
else:
email_address = [item[1] for item in self.email_data]
email = self._chinese_to_pinyin(chinese_name) + random.choice(email_address)
return email
def get_email(self, chinese_name, email_types=None):
'''随机生成邮箱地址,
Args:
chinese_name: str, 中文名字
email_types: list, ["163"]类型为@163.com的邮箱地址, 随机范围
Returns:
email: str, 邮箱地址
'''
if email_types:
email_address = [item[1] for item in self.email_data if item[0] in email_types]
else:
email_address = [item[1] for item in self.email_data]
email = self._chinese_to_pinyin(chinese_name) + random.choice(email_address)
return email
if __name__ == "__main__":
random_email_obj = RandomEmail()
name_list = ["焦荷丹", "李咏叶", "罗红", "蔡朋", "杨浩伦", "李峰", "牛玉美", "孔群", "李巧"]
for name in name_list:
email = random_email_obj.get_email(name, email_types=["sina_cn", "gmail"])
print(email)
random_email_obj = RandomEmail()
name_list = ["焦荷丹", "李咏叶", "罗红", "蔡朋", "杨浩伦", "李峰", "牛玉美", "孔群", "李巧"]
for name in name_list:
email = random_email_obj.get_email(name, email_types=["sina_cn", "gmail"])
print(email)

View File

@ -6,148 +6,152 @@ from datetime import datetime, timedelta
class IdCard(object):
"""身份证号"""
id_number_15_regex = r"^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$"
id_number_18_regex = r"^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$"
def __init__(self, id_number):
self.id = id_number
self.area_id = int(self.id[0:6])
self.birth_year = int(self.id[6:10])
self.birth_month = int(self.id[10:12])
self.birth_day = int(self.id[12:14])
@property
def birthday(self):
"""通过身份证号获取出生日期"""
birth_year = str(self.birth_year)
birth_month = "0" + str(self.birth_month) if len(str(self.birth_month)) == 1 else str(self.birth_month)
birth_day = "0" + str(self.birth_day) if len(str(self.birth_day)) == 1 else str(self.birth_day)
return "{0}-{1}-{2}".format(birth_year, birth_month, birth_day)
@property
def age(self):
"""通过身份证号获取年龄"""
now = (datetime.now() + timedelta(days=1))
year, month, day = now.year, now.month, now.day
if year == self.birth_year:
return 0
else:
if self.birth_month > month or (self.birth_month == month and self.birth_day > day):
return year - self.birth_year - 1
else:
return year - self.birth_year
@property
def sex(self):
"""通过身份证号获取性别, 0: 女生, 1: 男生"""
return int(self.id[16:17]) % 2
def get_check_digit(self):
"""通过身份证号获取校验码"""
check_sum = 0
for i in range(0, 17):
check_sum += ((1 << (17 - i)) % 11) * int(self.id[i])
check_digit = (12 - (check_sum % 11)) % 11
return check_digit if check_digit < 10 else 'X'
@classmethod
def verify_id(cls, id_number):
"""校验身份证是否正确
Args
id_number: str, 身份证号.
Returns:
bool
"""
if re.match(cls.id_number_18_regex, id_number):
check_digit = cls(id_number).get_check_digit()
return str(check_digit) == id_number[-1]
else:
return bool(re.match(cls.id_number_15_regex, id_number))
"""身份证号"""
id_number_15_regex = r"^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$"
id_number_18_regex = r"^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$"
def __init__(self, id_number):
self.id = id_number
self.area_id = int(self.id[0:6])
self.birth_year = int(self.id[6:10])
self.birth_month = int(self.id[10:12])
self.birth_day = int(self.id[12:14])
@property
def birthday(self):
"""通过身份证号获取出生日期"""
birth_year = str(self.birth_year)
birth_month = "0" + str(self.birth_month) if len(str(self.birth_month)) == 1 else str(self.birth_month)
birth_day = "0" + str(self.birth_day) if len(str(self.birth_day)) == 1 else str(self.birth_day)
return "{0}-{1}-{2}".format(birth_year, birth_month, birth_day)
@property
def age(self):
"""通过身份证号获取年龄"""
now = (datetime.now() + timedelta(days=1))
year, month, day = now.year, now.month, now.day
if year == self.birth_year:
return 0
else:
if self.birth_month > month or (self.birth_month == month and self.birth_day > day):
return year - self.birth_year - 1
else:
return year - self.birth_year
@property
def sex(self):
"""通过身份证号获取性别, 0: 女生, 1: 男生"""
return int(self.id[16:17]) % 2
def get_check_digit(self):
"""通过身份证号获取校验码"""
check_sum = 0
for i in range(0, 17):
check_sum += ((1 << (17 - i)) % 11) * int(self.id[i])
check_digit = (12 - (check_sum % 11)) % 11
return check_digit if check_digit < 10 else 'X'
@classmethod
def verify_id(cls, id_number):
"""校验身份证是否正确
Args
id_number: str, 身份证号.
Returns:
bool
"""
if re.match(cls.id_number_18_regex, id_number):
check_digit = cls(id_number).get_check_digit()
return str(check_digit) == id_number[-1]
else:
return bool(re.match(cls.id_number_15_regex, id_number))
class RandomIdCard(object):
"""随机身份证号"""
def __init__(self, csv_path=""):
"""
Args:
area_csv: 地区编号和名称csv文件
area_head: 地区编号和名称csv字段名称
area_data: 地区编号和名称数据集
id_number_15_regex: 15位身份证号码校验正则
id_number_18_regex: 18位身份证号码校验正则
"""
self.area_csv = csv.reader(open("{0}area.csv".format(csv_path), "r", encoding='utf-8'))
self.area_head = next(self.area_csv)
self.area_data = [item for item in self.area_csv]
def get_generate_id(self, sex=None, birth_days=None, arrer_numbers=None):
"""随机生成身份证号,
Args
sex: int, 0表示女性, 1表示男性.
birth_days: list, ["1990-01-01"]长度为1表示生成指定日期身份证号, ["1990-01-01", "1995-12-31"]长度为2表示生成指定范围日期身份证号.
arrer_numbers: list, 生成指定区域编号的身份证号, 默认全部.
Returns:
id_number: str, 身份证号.
"""
if not arrer_numbers:
arrer_number = str(random.choice([item[0] for item in self.area_data]))
else:
arrer_number = str(random.choice(arrer_numbers))
if isinstance(birth_days, list) and len(birth_days) == 1:
birth_day = datetime.strftime(datetime.strptime(birth_days[0], "%Y-%m-%d"), "%Y%m%d")
elif isinstance(birth_days, list) and len(birth_days) == 2:
start, end = datetime.strptime(birth_days[0], "%Y-%m-%d"), datetime.strptime(birth_days[1], "%Y-%m-%d")
birth_day = datetime.strftime(start + timedelta(random.randint(0, (end - start).days)), "%Y%m%d")
else:
start, end = datetime.strptime("1960-01-01", "%Y-%m-%d"), datetime.strptime("2000-12-31", "%Y-%m-%d")
birth_day = datetime.strftime(start + timedelta(random.randint(0, (end - start).days)), "%Y%m%d")
if not sex:
sex = random.randint(0, 1)
id_number = str(arrer_number)
id_number += birth_day
id_number += str(random.randint(10, 99))
id_number += str(random.randrange(sex, 10, step=2))
return id_number + str(IdCard(id_number).get_check_digit())
def get_birthday(self, id_number):
return IdCard(id_number).birthday
def get_age(self, id_number):
return IdCard(id_number).age
def get_sex(self, id_number):
return IdCard(id_number).sex
def get_area_id(self, id_number):
return IdCard(id_number).area_id
def get_area_name(self, id_number):
area_ids = [int(item[0]) for item in self.area_data]
area_names = [item[1] for item in self.area_data]
return area_names[area_ids.index(IdCard(id_number).area_id)]
"""随机身份证号"""
def __init__(self, csv_path=""):
"""
Args:
area_csv: 地区编号和名称csv文件
area_head: 地区编号和名称csv字段名称
area_data: 地区编号和名称数据集
id_number_15_regex: 15位身份证号码校验正则
id_number_18_regex: 18位身份证号码校验正则
"""
self.area_csv = csv.reader(open("{0}area.csv".format(csv_path), "r", encoding='utf-8'))
self.area_head = next(self.area_csv)
self.area_data = [item for item in self.area_csv]
def get_generate_id(self, sex=None, birth_days=None, arrer_numbers=None):
"""随机生成身份证号,
Args
sex: int, 0表示女性, 1表示男性.
birth_days: list, ["1990-01-01"]长度为1表示生成指定日期身份证号, ["1990-01-01", "1995-12-31"]长度为2表示生成指定范围日期身份证号.
arrer_numbers: list, 生成指定区域编号的身份证号, 默认全部.
Returns:
id_number: str, 身份证号.
"""
if not arrer_numbers:
arrer_number = str(random.choice([item[0] for item in self.area_data]))
else:
arrer_number = str(random.choice(arrer_numbers))
if isinstance(birth_days, list) and len(birth_days) == 1:
birth_day = datetime.strftime(datetime.strptime(birth_days[0], "%Y-%m-%d"), "%Y%m%d")
elif isinstance(birth_days, list) and len(birth_days) == 2:
start, end = datetime.strptime(birth_days[0], "%Y-%m-%d"), datetime.strptime(birth_days[1],
"%Y-%m-%d")
birth_day = datetime.strftime(start + timedelta(random.randint(0, (end - start).days)),
"%Y%m%d")
else:
start, end = datetime.strptime("1960-01-01", "%Y-%m-%d"), datetime.strptime("2000-12-31",
"%Y-%m-%d")
birth_day = datetime.strftime(start + timedelta(random.randint(0, (end - start).days)),
"%Y%m%d")
if not sex:
sex = random.randint(0, 1)
id_number = str(arrer_number)
id_number += birth_day
id_number += str(random.randint(10, 99))
id_number += str(random.randrange(sex, 10, step=2))
return id_number + str(IdCard(id_number).get_check_digit())
def get_birthday(self, id_number):
return IdCard(id_number).birthday
def get_age(self, id_number):
return IdCard(id_number).age
def get_sex(self, id_number):
return IdCard(id_number).sex
def get_area_id(self, id_number):
return IdCard(id_number).area_id
def get_area_name(self, id_number):
area_ids = [int(item[0]) for item in self.area_data]
area_names = [item[1] for item in self.area_data]
return area_names[area_ids.index(IdCard(id_number).area_id)]
if __name__ == "__main__":
random_idcard_obj = RandomIdCard()
print(random_idcard_obj.get_generate_id()) # 随机生成男或女, 出生日期在1960~2000, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(sex=1)) # 生成性别为男的身份证号, 出生日期在1960~2000, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(birth_days=["1993-03-18"])) # 随机生成男或女, 出生日期是"1993-03-18", 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(
birth_days=["1990-01-01", "1995-12-31"])) # 随机生成男或女, 出生日期在1990~1995之间, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(arrer_numbers=["110108"])) # 随机生成男或女, 出生日期在1960~2000, 区域地址为北京海淀区的身份证号.
id_number = random_idcard_obj.get_generate_id()
print(random_idcard_obj.get_area_id(id_number)) # 根据身份证号获取区域地址编号.
print(random_idcard_obj.get_area_name(id_number)) # 根据身份证号获取区域地址.
print(random_idcard_obj.get_birthday(id_number)) # 根据身份证号获取出生日期.
print(random_idcard_obj.get_age(id_number)) # 根据身份证号获取年龄.
print("" if random_idcard_obj.get_sex(id_number) else "") # 根据身份证号获取性别, 0表示女, 1表示男.
random_idcard_obj = RandomIdCard()
print(random_idcard_obj.get_generate_id()) # 随机生成男或女, 出生日期在1960~2000, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(sex=1)) # 生成性别为男的身份证号, 出生日期在1960~2000, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(birth_days=["1993-03-18"])) # 随机生成男或女, 出生日期是"1993-03-18", 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(
birth_days=["1990-01-01", "1995-12-31"])) # 随机生成男或女, 出生日期在1990~1995之间, 区域地址为全国的身份证号.
print(random_idcard_obj.get_generate_id(arrer_numbers=["110108"])) # 随机生成男或女, 出生日期在1960~2000, 区域地址为北京海淀区的身份证号.
id_number = random_idcard_obj.get_generate_id()
print(random_idcard_obj.get_area_id(id_number)) # 根据身份证号获取区域地址编号.
print(random_idcard_obj.get_area_name(id_number)) # 根据身份证号获取区域地址.
print(random_idcard_obj.get_birthday(id_number)) # 根据身份证号获取出生日期.
print(random_idcard_obj.get_age(id_number)) # 根据身份证号获取年龄.
print("" if random_idcard_obj.get_sex(id_number) else "") # 根据身份证号获取性别, 0表示女, 1表示男.

View File

@ -1,67 +1,74 @@
#-*-coding:utf-8-*-
# -*-coding:utf-8-*-
import csv
import random
class RandomName(object):
'''随机姓名'''
def __init__(self, csv_path=""):
'''
Args:
last_name_csv: 姓氏csv文件
last_name_head: 姓氏csv字段名称
last_name_data: 姓氏数据集
first_name_girl_csv: 女孩名字csv文件
first_name_girl_head: 女孩名字csv字段名称
first_name_girl_data: 女孩名字数据集
first_name_boy_csv: 男孩名字csv文件
first_name_boy_head: 男孩名字csv字段名称
first_name_boy_data: 男孩名字csv文件
'''
self.last_name_csv = csv.reader(open("{0}last_name.csv".format(csv_path), "r", encoding='utf-8'))
self.last_name_head = next(self.last_name_csv)
self.last_name_data = [item for item in self.last_name_csv]
self.first_name_girl_csv = csv.reader(open("{0}first_name_girl.csv".format(csv_path), "r", encoding='utf-8'))
self.first_name_girl_head = next(self.first_name_girl_csv)
self.first_name_girl_data = [item for item in self.first_name_girl_csv]
self.first_name_boy_csv = csv.reader(open("{0}first_name_boy.csv".format(csv_path), "r", encoding='utf-8'))
self.first_name_boy_head = next(self.first_name_boy_csv)
self.first_name_boy_data = [item for item in self.first_name_boy_csv]
def get_girl(self, name_len=None):
'''随机生成女孩名字
Args
name_len: int, 名字长度
Returns:
name: str, 女孩名字
'''
name = random.choices([item[1] for item in self.last_name_data], weights=[int(item[0]) for item in self.last_name_data])[0]
name_length = name_len if name_len else random.randint(1, 2)
for i in range(name_length):
name += random.choices([item[1] for item in self.first_name_girl_data], weights=[int(item[0]) for item in self.first_name_girl_data])[0]
return name
def get_boy(self, name_len=None):
'''随机生成男孩名字
Args
name_len: int, 名字长度
Returns:
name: str, 男孩名字
'''
name = random.choices([item[1] for item in self.last_name_data], weights=[int(item[0]) for item in self.last_name_data])[0]
name_length = name_len if name_len else random.randint(1, 2)
for i in range(name_length):
name += random.choices([item[1] for item in self.first_name_boy_data], weights=[int(item[0]) for item in self.first_name_boy_data])[0]
return name
'''随机姓名'''
def __init__(self, csv_path=""):
'''
Args:
last_name_csv: 姓氏csv文件
last_name_head: 姓氏csv字段名称
last_name_data: 姓氏数据集
first_name_girl_csv: 女孩名字csv文件
first_name_girl_head: 女孩名字csv字段名称
first_name_girl_data: 女孩名字数据集
first_name_boy_csv: 男孩名字csv文件
first_name_boy_head: 男孩名字csv字段名称
first_name_boy_data: 男孩名字csv文件
'''
self.last_name_csv = csv.reader(open("{0}last_name.csv".format(csv_path), "r", encoding='utf-8'))
self.last_name_head = next(self.last_name_csv)
self.last_name_data = [item for item in self.last_name_csv]
self.first_name_girl_csv = csv.reader(
open("{0}first_name_girl.csv".format(csv_path), "r", encoding='utf-8'))
self.first_name_girl_head = next(self.first_name_girl_csv)
self.first_name_girl_data = [item for item in self.first_name_girl_csv]
self.first_name_boy_csv = csv.reader(
open("{0}first_name_boy.csv".format(csv_path), "r", encoding='utf-8'))
self.first_name_boy_head = next(self.first_name_boy_csv)
self.first_name_boy_data = [item for item in self.first_name_boy_csv]
def get_girl(self, name_len=None):
'''随机生成女孩名字
Args
name_len: int, 名字长度
Returns:
name: str, 女孩名字
'''
name = random.choices([item[1] for item in self.last_name_data],
weights=[int(item[0]) for item in self.last_name_data])[0]
name_length = name_len if name_len else random.randint(1, 2)
for i in range(name_length):
name += random.choices([item[1] for item in self.first_name_girl_data],
weights=[int(item[0]) for item in self.first_name_girl_data])[0]
return name
def get_boy(self, name_len=None):
'''随机生成男孩名字
Args
name_len: int, 名字长度
Returns:
name: str, 男孩名字
'''
name = random.choices([item[1] for item in self.last_name_data],
weights=[int(item[0]) for item in self.last_name_data])[0]
name_length = name_len if name_len else random.randint(1, 2)
for i in range(name_length):
name += random.choices([item[1] for item in self.first_name_boy_data],
weights=[int(item[0]) for item in self.first_name_boy_data])[0]
return name
if __name__ == "__main__":
random_name_obj = RandomName()
for i in range(10): # 生成10个姓名.
if random.randint(0, 1) == 0: # 随机男女, 0表示女, 1表示男.
print("{:6}\t{:2}".format(random_name_obj.get_girl(), ""))
else:
print("{:6}\t{:2}".format(random_name_obj.get_boy(), ""))
random_name_obj = RandomName()
for i in range(10): # 生成10个姓名.
if random.randint(0, 1) == 0: # 随机男女, 0表示女, 1表示男.
print("{:6}\t{:2}".format(random_name_obj.get_girl(), ""))
else:
print("{:6}\t{:2}".format(random_name_obj.get_boy(), ""))

View File

@ -1,56 +1,56 @@
#-*-coding:utf-8-*-
# -*-coding:utf-8-*-
import csv
import random
class RandomPhone(object):
"""随机电话号码"""
def __init__(self, csv_path=""):
self.tele_phone_csv = csv.reader(open("{0}phone_area.csv".format(csv_path), "r", encoding='utf-8'))
self.tele_phone_head = next(self.tele_phone_csv)
self.tele_phone_data = [item for item in self.tele_phone_csv]
def _number_start(self):
"""获取手机号码前三位"""
one_number = 1
two_number = [3, 4, 5, 7, 8][random.randint(0, 4)]
three_number = {
3: random.randint(0, 9),
4: [5, 7, 9][random.randint(0, 2)],
5: [i for i in range(10) if i != 4][random.randint(0, 8)],
7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
8: random.randint(0, 9),
}[two_number]
return one_number, two_number, three_number
"""随机电话号码"""
def __init__(self, csv_path=""):
self.tele_phone_csv = csv.reader(open("{0}phone_area.csv".format(csv_path), "r", encoding='utf-8'))
self.tele_phone_head = next(self.tele_phone_csv)
self.tele_phone_data = [item for item in self.tele_phone_csv]
def _number_start(self):
"""获取手机号码前三位"""
one_number = 1
two_number = [3, 4, 5, 7, 8][random.randint(0, 4)]
three_number = {
3: random.randint(0, 9),
4: [5, 7, 9][random.randint(0, 2)],
5: [i for i in range(10) if i != 4][random.randint(0, 8)],
7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
8: random.randint(0, 9),
}[two_number]
return one_number, two_number, three_number
def get_mobile_number(self):
"""随机获取手机号码"""
one_number, two_number, three_number = self._number_start()
phone_number = [str(one_number), str(two_number), str(three_number)]
phone_number.extend([str(random.randint(0, 9)) for n in range(8)])
return "".join(phone_number)
def get_tele_number(self, area_ids=None):
if area_ids:
area_id = random.choice(area_ids)
if len(area_id) != 3 or len(area_id) != 4:
area_id = str(random.choice([item[0] for item in self.tele_phone_data]))
else:
area_id = str(random.choice([item[0] for item in self.tele_phone_data]))
if len(area_id) == 3:
number = [str(random.randint(0, 9)) for n in range(8)]
return "{0}-{1}".format(area_id, "".join(number))
elif len(area_id) == 4:
number = [str(random.randint(0, 9)) for n in range(7)]
return "{0}-{1}".format(area_id, "".join(number))
def get_mobile_number(self):
"""随机获取手机号码"""
one_number, two_number, three_number = self._number_start()
phone_number = [str(one_number), str(two_number), str(three_number)]
phone_number.extend([str(random.randint(0, 9)) for n in range(8)])
return "".join(phone_number)
def get_tele_number(self, area_ids=None):
if area_ids:
area_id = random.choice(area_ids)
if len(area_id) != 3 or len(area_id) != 4:
area_id = str(random.choice([item[0] for item in self.tele_phone_data]))
else:
area_id = str(random.choice([item[0] for item in self.tele_phone_data]))
if len(area_id) == 3:
number = [str(random.randint(0, 9)) for n in range(8)]
return "{0}-{1}".format(area_id, "".join(number))
elif len(area_id) == 4:
number = [str(random.randint(0, 9)) for n in range(7)]
return "{0}-{1}".format(area_id, "".join(number))
if __name__ == "__main__":
random_phone_obj = RandomPhone()
for i in range(10): # 随机生成10个电话号和手机
tele_number = random_phone_obj.get_tele_number()
mobile_number = random_phone_obj.get_mobile_number()
print("电话: {0} 手机: {1}".format(tele_number, mobile_number))
random_phone_obj = RandomPhone()
for i in range(10): # 随机生成10个电话号和手机
tele_number = random_phone_obj.get_tele_number()
mobile_number = random_phone_obj.get_mobile_number()
print("电话: {0} 手机: {1}".format(tele_number, mobile_number))

View File

@ -16,94 +16,95 @@ urllib3.disable_warnings()
class WxWorkSms:
# header = {"Content-Type": "multipart/form-data"}
headers = {"Content-Type": "application/json"}
def __init__(self, key):
self.send_url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}"
self.up_url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={key}&type=file"
def send_markdown(self, project_name, project_port, total_cases, pass_rate, success_cases, fail_cases, skip_cases,
error_cases, report_url):
"""
发送markdown 请求
Returns:
"""
send_markdown_data = {
"msgtype": "markdown", # 消息类型此时固定为markdown
"markdown": {
"content": f"# **提醒!自动化测试反馈**\n#### **请相关同事注意,及时跟进!**\n"
f"> 项目名称:<font color=\"info\">{project_name}</font> \n"
f"> 项目指定端:<font color=\"info\">{project_port}</font> \n"
f"> 测试用例总数:<font color=\"info\">{total_cases}条</font>;测试用例通过率:<font color=\"info\">{pass_rate}</font>\n"
"> **--------------------运行详情--------------------**\n"
f"> **成功数:**<font color=\"info\">{success_cases}</font>\n**失败数:**<font color=\"warning\">{fail_cases}</font>\n "
f"> **跳过数:**<font color=\"info\">{skip_cases}</font>\n**错误数:**<font color=\"comment\">{error_cases}</font>\n"
f"> ##### **报告链接:** [jenkins报告,请点击后进入查看]{report_url}"
# 加粗:**需要加粗的字**
# 引用:> 需要引用的文字
# 字体颜色(只支持3种内置颜色)
# 标题 支持1至6级标题注意#与文字中间要有空格)
# 绿色info、灰色comment、橙红warning
}
}
requests.post(url=self.send_url, headers=self.headers, json=send_markdown_data, verify=False).json()
def send_file(self, file_path):
"""
文件路径
Args:
file_path:
Returns:
"""
media_id = self.upload_media(file_path)
for i in media_id:
send_data = {"msgtype": "file", "file": {"media_id": i}}
requests.post(self.send_url, headers=self.headers, json=send_data, verify=False)
time.sleep(2)
def upload_media(self, file_path) -> list:
"""
Args:
file_path: 文件路径
Returns:上传文件后返回的每一个文件id
"""
# print(f"file path: {file_path}")
media_ids = []
for fp in file_path:
with open(fp, "rb") as f:
send_data = {"media": f}
res_html = requests.post(self.up_url, files=send_data, verify=False).json()
media_id = res_html.get("media_id")
media_ids.append(media_id)
return media_ids
def send_main(self, folder_path, project_name, project_port, total_cases, pass_rate, success_cases, fail_cases,
skip_cases,
error_cases, report_url):
"""
发送markdown及上传文件
Args:
dirs文件夹路径
Returns:
"""
self.send_markdown(
project_name, project_port, total_cases, pass_rate, success_cases, fail_cases, skip_cases,
error_cases, report_url
)
file_path = FileUtils.get_all_path(folder_path)
self.send_file(file_path)
# header = {"Content-Type": "multipart/form-data"}
headers = {"Content-Type": "application/json"}
def __init__(self, key):
self.send_url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}"
self.up_url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={key}&type=file"
def send_markdown(self, project_name, project_port, total_cases, pass_rate, success_cases, fail_cases,
skip_cases,
error_cases, report_url):
"""
发送markdown 请求
Returns:
"""
send_markdown_data = {
"msgtype": "markdown", # 消息类型此时固定为markdown
"markdown": {
"content": f"# **提醒!自动化测试反馈**\n#### **请相关同事注意,及时跟进!**\n"
f"> 项目名称:<font color=\"info\">{project_name}</font> \n"
f"> 项目指定端:<font color=\"info\">{project_port}</font> \n"
f"> 测试用例总数:<font color=\"info\">{total_cases}条</font>;测试用例通过率:<font color=\"info\">{pass_rate}</font>\n"
"> **--------------------运行详情--------------------**\n"
f"> **成功数:**<font color=\"info\">{success_cases}</font>\n**失败数:**<font color=\"warning\">{fail_cases}</font>\n "
f"> **跳过数:**<font color=\"info\">{skip_cases}</font>\n**错误数:**<font color=\"comment\">{error_cases}</font>\n"
f"> ##### **报告链接:** [jenkins报告,请点击后进入查看]{report_url}"
# 加粗:**需要加粗的字**
# 引用:> 需要引用的文字
# 字体颜色(只支持3种内置颜色)
# 标题 支持1至6级标题注意#与文字中间要有空格)
# 绿色info、灰色comment、橙红warning
}
}
requests.post(url=self.send_url, headers=self.headers, json=send_markdown_data, verify=False).json()
def send_file(self, file_path):
"""
文件路径
Args:
file_path:
Returns:
"""
media_id = self.upload_media(file_path)
for i in media_id:
send_data = {"msgtype": "file", "file": {"media_id": i}}
requests.post(self.send_url, headers=self.headers, json=send_data, verify=False)
time.sleep(2)
def upload_media(self, file_path) -> list:
"""
Args:
file_path: 文件路径
Returns:上传文件后返回的每一个文件id
"""
# print(f"file path: {file_path}")
media_ids = []
for fp in file_path:
with open(fp, "rb") as f:
send_data = {"media": f}
res_html = requests.post(self.up_url, files=send_data, verify=False).json()
media_id = res_html.get("media_id")
media_ids.append(media_id)
return media_ids
def send_main(self, folder_path, project_name, project_port, total_cases, pass_rate, success_cases, fail_cases,
skip_cases,
error_cases, report_url):
"""
发送markdown及上传文件
Args:
dirs文件夹路径
Returns:
"""
self.send_markdown(
project_name, project_port, total_cases, pass_rate, success_cases, fail_cases, skip_cases,
error_cases, report_url
)
file_path = FileUtils.get_all_path(folder_path)
self.send_file(file_path)
if __name__ == '__main__':
dirs = r'D:\apk_api\api-test-project\OutPut\Reports'
WxWorkSms('8b1647d4-dc32-447c-b524-548acf18a938').send_main(dirs, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# WxWorkSms('8b1647d4-dc32-447c-b524-548acf18a938').send_markdown(1, 2, 3, 4, 5, 6, 7, 8, 9)
dirs = r'D:\apk_api\api-test-project\OutPut\Reports'
WxWorkSms('8b1647d4-dc32-447c-b524-548acf18a938').send_main(dirs, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# WxWorkSms('8b1647d4-dc32-447c-b524-548acf18a938').send_markdown(1, 2, 3, 4, 5, 6, 7, 8, 9)

View File

@ -12,22 +12,22 @@ import ddddocr
def captcha(file_path):
"""
失败图片验证码
Args:
file_path:
Returns:返回图片的验证码
"""
orc = ddddocr.DdddOcr()
with open(file_path, 'rb') as f:
img_bytes = f.read()
res = orc.classification(img_bytes)
print(str(res))
"""
失败图片验证码
Args:
file_path:
Returns:返回图片的验证码
"""
orc = ddddocr.DdddOcr()
with open(file_path, 'rb') as f:
img_bytes = f.read()
res = orc.classification(img_bytes)
print(str(res))
if __name__ == '__main__':
file = r'/image/origina388l.png'
captcha(file)
file = r'/image/origina388l.png'
captcha(file)

View File

@ -3,11 +3,11 @@ from functools import wraps
def fn_time(func):
def inner(*args, **kwargs):
t0 = time.time()
func(*args, **kwargs)
t1 = time.time()
print(f"{func.__name__}总共运行:{str(t1 - t0)}")
# return func(*args, **kwargs)
return inner
def inner(*args, **kwargs):
t0 = time.time()
func(*args, **kwargs)
t1 = time.time()
print(f"{func.__name__}总共运行:{str(t1 - t0)}")
# return func(*args, **kwargs)
return inner

View File

@ -11,53 +11,53 @@ logger = MyLogger()
class ScriptNotFoundError(Exception):
pass
pass
class LoadScript:
# @logger.log_decorator()
def load_script(self, script_path):
"""
加载脚本文件并返回模块对象
Args:
script_path (str): 脚本文件的路径
Returns:
module: 脚本文件对应的模块对象
"""
try:
spec = importlib.util.spec_from_file_location(os.path.basename(script_path), script_path)
script_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(script_module)
return script_module
except FileNotFoundError:
raise ScriptNotFoundError(script_path)
@logger.log_decorator()
def load_and_execute_script(self, script_directory, script_name, method_name, request):
"""
加载并执行脚本文件中的指定方法
Args:
request: 请求数据
script_directory (str): 脚本文件所在的目录
script_name (str): 脚本文件的名称
method_name (str): 要执行的方法的名称
"""
script_path = os.path.join(script_directory, script_name)
try:
script = self.load_script(script_path)
if hasattr(script, method_name):
method = getattr(script, method_name)
return method(request)
except ScriptNotFoundError:
return request
# @logger.log_decorator()
def load_script(self, script_path):
"""
加载脚本文件并返回模块对象
Args:
script_path (str): 脚本文件的路径
Returns:
module: 脚本文件对应的模块对象
"""
try:
spec = importlib.util.spec_from_file_location(os.path.basename(script_path), script_path)
script_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(script_module)
return script_module
except FileNotFoundError:
raise ScriptNotFoundError(script_path)
@logger.log_decorator()
def load_and_execute_script(self, script_directory, script_name, method_name, request):
"""
加载并执行脚本文件中的指定方法
Args:
request: 请求数据
script_directory (str): 脚本文件所在的目录
script_name (str): 脚本文件的名称
method_name (str): 要执行的方法的名称
"""
script_path = os.path.join(script_directory, script_name)
try:
script = self.load_script(script_path)
if hasattr(script, method_name):
method = getattr(script, method_name)
return method(request)
except ScriptNotFoundError:
return request
if __name__ == '__main__':
from common.config import Config
SCRIPTS_DIR = Config.SCRIPTS_DIR
load_and_exe_s = LoadScript()
load_and_exe_s.load_and_execute_script(SCRIPTS_DIR, 'request_script_sheetname_id.py', 'setup', {"y": "z"})
from common.config import Config
SCRIPTS_DIR = Config.SCRIPTS_DIR
load_and_exe_s = LoadScript()
load_and_exe_s.load_and_execute_script(SCRIPTS_DIR, 'request_script_sheetname_id.py', 'setup', {"y": "z"})

View File

@ -14,84 +14,86 @@ from common.config import Config
class MyLog:
level_relations = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warning": logging.WARNING,
"error": logging.ERROR,
"critic": logging.CRITICAL
} # 日志级别关系映射
def my_log(self, msg, level="error", when="D", back_count=10):
"""
实例化 TimeRotatingFileHandler
interval 是时间间隔 backupCount 是备份文件的个数如果超过这个个数就会自动删除when 是间隔的时间单位单位有以下几种
S
M
H 小时
D
每星期interval == 0 时代表星期一
midnight 每天凌晨
"""
file_name = Config.log_path
my_logger = logging.getLogger() # 定义日志收集器 my_logger
my_logger.setLevel(self.level_relations.get(level)) # 设置日志级别
format_str = logging.Formatter(
"%(asctime)s-%(levelname)s-%(filename)s-[ line:%(lineno)d ] - 日志信息:%(message)s") # 设置日志格式
# 创建输出渠道
sh = logging.StreamHandler() # 往屏幕输出
sh.setFormatter(format_str) # 设置屏幕上显示的格式
current = time.strftime("%Y-%m-%d", time.localtime()) # 设置当前日期
if level == "error":
th = handlers.TimedRotatingFileHandler(filename=f'{file_name}/{current}_{level}.logger', when=when,
backupCount=back_count, encoding="utf-8")
else:
th = handlers.TimedRotatingFileHandler(filename=file_name + "/{}_info.logger".format(current), when=when,
backupCount=back_count,
encoding="utf-8") # 往文件里写日志
th.setFormatter(format_str) # 设置文件里写入的格式
my_logger.addHandler(sh) # 将对象加入logger里
my_logger.addHandler(th)
if level == "debug":
my_logger.debug(msg)
elif level == "error":
my_logger.error(msg)
elif level == "info":
my_logger.info(msg)
elif level == "warning":
my_logger.warning(msg)
else:
my_logger.critical(msg)
my_logger.removeHandler(sh)
my_logger.removeHandler(th)
logging.shutdown()
def decorator_log(self, msg=None):
def warp(fun):
def inner(*args, **kwargs):
try:
return fun(*args, **kwargs)
except Exception as e:
self.my_log(f"{msg}: {e}", "error")
return inner
return warp
level_relations = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warning": logging.WARNING,
"error": logging.ERROR,
"critic": logging.CRITICAL
} # 日志级别关系映射
def my_log(self, msg, level="error", when="D", back_count=10):
"""
实例化 TimeRotatingFileHandler
interval 是时间间隔 backupCount 是备份文件的个数如果超过这个个数就会自动删除when 是间隔的时间单位单位有以下几种
S
M
H 小时
D
每星期interval == 0 时代表星期一
midnight 每天凌晨
"""
file_name = Config.log_path
my_logger = logging.getLogger() # 定义日志收集器 my_logger
my_logger.setLevel(self.level_relations.get(level)) # 设置日志级别
format_str = logging.Formatter(
"%(asctime)s-%(levelname)s-%(filename)s-[ line:%(lineno)d ] - 日志信息:%(message)s") # 设置日志格式
# 创建输出渠道
sh = logging.StreamHandler() # 往屏幕输出
sh.setFormatter(format_str) # 设置屏幕上显示的格式
current = time.strftime("%Y-%m-%d", time.localtime()) # 设置当前日期
if level == "error":
th = handlers.TimedRotatingFileHandler(filename=f'{file_name}/{current}_{level}.logger',
when=when,
backupCount=back_count, encoding="utf-8")
else:
th = handlers.TimedRotatingFileHandler(filename=file_name + "/{}_info.logger".format(current),
when=when,
backupCount=back_count,
encoding="utf-8") # 往文件里写日志
th.setFormatter(format_str) # 设置文件里写入的格式
my_logger.addHandler(sh) # 将对象加入logger里
my_logger.addHandler(th)
if level == "debug":
my_logger.debug(msg)
elif level == "error":
my_logger.error(msg)
elif level == "info":
my_logger.info(msg)
elif level == "warning":
my_logger.warning(msg)
else:
my_logger.critical(msg)
my_logger.removeHandler(sh)
my_logger.removeHandler(th)
logging.shutdown()
def decorator_log(self, msg=None):
def warp(fun):
def inner(*args, **kwargs):
try:
return fun(*args, **kwargs)
except Exception as e:
self.my_log(f"{msg}: {e}", "error")
return inner
return warp
if __name__ == '__main__':
# for i in range(2):
# MyLog().my_log("hhhh{}".format(i), "info")
# time.sleep(0.04)
@MyLog().decorator_log("知错了嘛?")
def add():
print("试一下")
raise "不好使,异常了。"
add()
# for i in range(2):
# MyLog().my_log("hhhh{}".format(i), "info")
# time.sleep(0.04)
@MyLog().decorator_log("知错了嘛?")
def add():
print("试一下")
raise "不好使,异常了。"
add()

View File

@ -19,102 +19,102 @@ LOG_DIR = Config.log_path
@singleton
class MyLogger:
"""
根据时间文件大小切割日志
"""
def __init__(self, log_dir=LOG_DIR, max_size=20, retention='7 days'):
self.log_dir = log_dir
self.max_size = max_size
self.retention = retention
self.logger = self.configure_logger()
def configure_logger(self):
"""
Returns:
"""
# 创建日志目录
os.makedirs(self.log_dir, exist_ok=True)
shared_config = {
"level": "ERROR",
"enqueue": True,
"backtrace": False,
"format": "{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
}
# 添加按照日期和大小切割的文件 handler
logger.add(
sink=f"{self.log_dir}/{{time:YYYY-MM-DD}}.log",
rotation=f"{self.max_size} MB",
retention=self.retention,
**shared_config
)
# 配置按照等级划分的文件 handler 和控制台输出
logger.add(sink=self.get_log_path, **shared_config)
return logger
def get_log_path(self, message: str) -> str:
"""
根据等级返回日志路径
Args:
message:
Returns:
"""
log_level = message.record["level"].name.lower()
log_file = f"{log_level}.log"
log_path = os.path.join(self.log_dir, log_file)
return log_path
def __getattr__(self, level: str):
return getattr(self.logger, level)
def log_decorator(self, msg="快看,异常了,别唧唧哇哇,块排查"):
"""
日志装饰器记录函数的名称参数返回值运行时间和异常信息
Args:
logger: 日志记录器对象
Returns:
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
self.logger.info(f'-----------分割线-----------')
# self.logger.info(f'| called {func.__name__} | args: {args} kwargs:{kwargs}')
start = perf_counter() # 开始时间
try:
result = func(*args, **kwargs)
end = perf_counter() # 结束时间
duration = end - start
# self.logger.info(f"| end called {func.__name__}, duration{duration:4f}s")
return result
except Exception as e:
self.logger.error(f"| called {func.__name__} | error: {msg}: {e}")
self.logger.info(f"-----------分割线-----------")
return wrapper
return decorator
"""
根据时间文件大小切割日志
"""
def __init__(self, log_dir=LOG_DIR, max_size=20, retention='7 days'):
self.log_dir = log_dir
self.max_size = max_size
self.retention = retention
self.logger = self.configure_logger()
def configure_logger(self):
"""
Returns:
"""
# 创建日志目录
os.makedirs(self.log_dir, exist_ok=True)
shared_config = {
"level": "ERROR",
"enqueue": True,
"backtrace": False,
"format": "{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
}
# 添加按照日期和大小切割的文件 handler
logger.add(
sink=f"{self.log_dir}/{{time:YYYY-MM-DD}}.log",
rotation=f"{self.max_size} MB",
retention=self.retention,
**shared_config
)
# 配置按照等级划分的文件 handler 和控制台输出
logger.add(sink=self.get_log_path, **shared_config)
return logger
def get_log_path(self, message: str) -> str:
"""
根据等级返回日志路径
Args:
message:
Returns:
"""
log_level = message.record["level"].name.lower()
log_file = f"{log_level}.log"
log_path = os.path.join(self.log_dir, log_file)
return log_path
def __getattr__(self, level: str):
return getattr(self.logger, level)
def log_decorator(self, msg="快看,异常了,别唧唧哇哇,块排查"):
"""
日志装饰器记录函数的名称参数返回值运行时间和异常信息
Args:
logger: 日志记录器对象
Returns:
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# self.logger.info(f'-----------分割线-----------')
self.logger.info(f'| 调用函数: {func.__name__} | args: {args} kwargs:{kwargs}')
start = perf_counter() # 开始时间
try:
result = func(*args, **kwargs)
end = perf_counter() # 结束时间
duration = end - start
self.logger.info(f"| 结束调用函数: {func.__name__}, duration{duration:4f}s")
return result
except Exception as e:
self.logger.error(f"| called {func.__name__} | error: {msg}: {e}")
# self.logger.info(f"-----------分割线-----------")
return wrapper
return decorator
if __name__ == '__main__':
log = MyLogger()
@log.log_decorator("勇哥也不知道错在哪里")
def test_zero_division_error(a, b):
return a / b
for i in range(1000):
log.error('错误信息')
log.critical('严重错误信息')
test_zero_division_error(1, 0)
log.debug('调试信息')
log.info('普通信息')
log.success('成功信息')
log.warning('警告信息')
log = MyLogger()
@log.log_decorator("勇哥也不知道错在哪里")
def test_zero_division_error(a, b):
return a / b
for i in range(1000):
log.error('错误信息')
log.critical('严重错误信息')
test_zero_division_error(1, 0)
log.debug('调试信息')
log.info('普通信息')
log.success('成功信息')
log.warning('警告信息')

View File

@ -5,103 +5,103 @@ from common.utils import logger
# @logger.log_decorator()
def parsing_openapi(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
count = 1
test_cases = []
paths = data.get('paths')
for path, methods in paths.items():
for method, details in methods.items():
test_case = {
"id": count,
"name": "openapi",
"description": details.get("summary"),
"Run": "yes",
"Time": "0.1",
'method': method,
'url': path,
'headers': json.dumps(extract_parameters(details.get('parameters', []), 'header')),
'Headers是否加密': "",
'params': json.dumps(extract_parameters(details.get('parameters', []), 'query')),
'request_data_type': determine_request_type(details.get('requestBody')),
'request_data': json.dumps(extract_request_body(details.get('requestBody'))),
'请求参数是否加密': '',
'提取请求参数': '',
'Jsonpath': '',
'正则表达式': '',
'正则变量': '',
'绝对路径表达式': '',
'SQL': '',
'sql变量': '',
'预期结果': '',
'响应结果': '',
'断言结果': '',
'报错日志': ''}
test_cases.append(test_case)
count += 1
return test_cases
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
count = 1
test_cases = []
paths = data.get('paths')
for path, methods in paths.items():
for method, details in methods.items():
test_case = {
"id": count,
"name": "openapi",
"description": details.get("summary"),
"Run": "yes",
"Time": "0.1",
'method': method,
'url': path,
'headers': json.dumps(extract_parameters(details.get('parameters', []), 'header')),
'Headers是否加密': "",
'params': json.dumps(extract_parameters(details.get('parameters', []), 'query')),
'request_data_type': determine_request_type(details.get('requestBody')),
'request_data': json.dumps(extract_request_body(details.get('requestBody'))),
'请求参数是否加密': '',
'提取请求参数': '',
'Jsonpath': '',
'正则表达式': '',
'正则变量': '',
'绝对路径表达式': '',
'SQL': '',
'sql变量': '',
'预期结果': '',
'响应结果': '',
'断言结果': '',
'报错日志': ''}
test_cases.append(test_case)
count += 1
return test_cases
# @logger.log_decorator()
def extract_parameters(parameters, parameter_location):
extracted_parameters = {}
for param in parameters:
if param.get('in') == parameter_location:
param_name = param.get('name')
param_example = param.get('example')
if param_name and param_example:
extracted_parameters[param_name] = param_example
return extracted_parameters
extracted_parameters = {}
for param in parameters:
if param.get('in') == parameter_location:
param_name = param.get('name')
param_example = param.get('example')
if param_name and param_example:
extracted_parameters[param_name] = param_example
return extracted_parameters
# @logger.log_decorator()
def determine_request_type(request_body):
if request_body:
content = request_body.get('content', {})
if 'multipart/form-data' in content:
return 'files'
elif 'application/json' in content:
return 'json'
elif 'application/x-www-form-urlencoded' in content:
return 'data'
return ''
if request_body:
content = request_body.get('content', {})
if 'multipart/form-data' in content:
return 'files'
elif 'application/json' in content:
return 'json'
elif 'application/x-www-form-urlencoded' in content:
return 'data'
return ''
# @logger.log_decorator()
def extract_request_body(request_body):
if request_body:
content = request_body.get('content', {})
if 'multipart/form-data' in content:
schema = content['multipart/form-data'].get('schema', {})
if schema.get('type') == 'object':
properties = schema.get('properties', {})
extracted_body = {}
for prop_name, prop_details in properties.items():
if prop_details.get('type') == 'string':
example = prop_details.get('example')
if example:
extracted_body[prop_name] = example
return extracted_body
elif 'application/json' in content:
example = content['application/json'].get('example')
if example:
return example
elif 'application/x-www-form-urlencoded' in content:
schema = content['application/x-www-form-urlencoded'].get('schema', {})
if schema.get('type') == 'object':
properties = schema.get('properties', {})
extracted_body = {}
for prop_name, prop_details in properties.items():
if prop_details.get('type') == 'string':
example = prop_details.get('example')
if example:
extracted_body[prop_name] = example
return extracted_body
return {}
if request_body:
content = request_body.get('content', {})
if 'multipart/form-data' in content:
schema = content['multipart/form-data'].get('schema', {})
if schema.get('type') == 'object':
properties = schema.get('properties', {})
extracted_body = {}
for prop_name, prop_details in properties.items():
if prop_details.get('type') == 'string':
example = prop_details.get('example')
if example:
extracted_body[prop_name] = example
return extracted_body
elif 'application/json' in content:
example = content['application/json'].get('example')
if example:
return example
elif 'application/x-www-form-urlencoded' in content:
schema = content['application/x-www-form-urlencoded'].get('schema', {})
if schema.get('type') == 'object':
properties = schema.get('properties', {})
extracted_body = {}
for prop_name, prop_details in properties.items():
if prop_details.get('type') == 'string':
example = prop_details.get('example')
if example:
extracted_body[prop_name] = example
return extracted_body
return {}
if __name__ == '__main__':
file = f'../../cases/temporary_file/openapi.json'
res = parsing_openapi(file)
print(res)
file = f'../../cases/temporary_file/openapi.json'
res = parsing_openapi(file)
print(res)

View File

@ -7,113 +7,121 @@ result = []
def parsing_postman(path):
"""
解析postman到处的json文件
Args:
path:
Returns:
"""
data = FileUtils.read_json_data(path)
def _parse_api(content):
global result
global id_count
api = {}
if isinstance(content, list):
for item in content:
_parse_api(content=item)
elif isinstance(content, dict):
if 'item' in content.keys():
_parse_api(content=content.get('item'))
elif 'request' in content.keys():
id_count += 1
api['id'] = id_count
api['name'] = 'postman'
api['description'] = content.get('name')
request = content.get('request')
api['Run'] = 'yes'
api['Time'] = 0.5
if request:
# api请求方法
api['Method'] = request.get('method', 'GET').upper()
header = request.get('header')
header = {item.get('key'): item.get('value') for item in header} if header else {}
auth = request.get('auth')
if auth:
auth_type = auth.get('type')
if auth.get(auth_type):
auth_value = {item.get('key'): item.get('value') for item in auth.get(auth_type) if
(item and item.get('key'))}
header.update(auth_value)
# api 请求地址
url = request.get('url')
if url:
api['Url'] = url.get('raw')
# if url and url.get('path'):
# # api请求URL
# api['Url'] = r'/'.join(url.get('path'))
#
# if url and url.get('query'):
# # api查询参数
# api['Request Data'] = '&'.join(
# [item.get('key') + '=' + (item.get('value') or '') for item in url.get('query') if item])
# api请求头
api['Headers'] = json.dumps(header, ensure_ascii=False)
api['Headers是否加密'] = ''
api['params'] = ''
body = request.get('body')
if body:
# api接口请求参数类型
request_mode = body.get('mode')
if 'raw' == request_mode:
api['request_data_type'] = 'json'
elif 'formdata' == request_mode:
api['request_data_type'] = 'data'
elif 'urlencoded' == request_mode:
api['request_data_type'] = 'data'
# api接口请求参数
request_data = body.get(request_mode)
api['Request Data'] = {}
if request_data and 'raw' == request_mode:
api['Request Data'].update(
json.loads(request_data.replace('\t', '').replace('\n', '').replace('\r', '')))
elif request_data and 'formdata' == request_mode:
if isinstance(request_data, list):
for item in request_data:
if item.get("type") == "text":
api['Request Data'].update({item.get('key'): item.get("value", "")})
elif item.get("type") == "file":
api["Request Data"].update({item.get('key'): item.get("src", "")})
api["request_data_type"] = "files"
api["Request Data"] = json.dumps(api["Request Data"], ensure_ascii=False)
api['请求参数是否加密'] = ''
api['提取请求参数'] = ''
api['Jsonpath'] = ''
api['正则表达式'] = ''
api['正则变量'] = ''
api['绝对路径表达式'] = ''
api['SQL'] = ''
api['sql变量'] = ''
api['预期结果'] = ''
api['响应结果'] = ''
api['断言结果'] = ''
api['报错日志'] = ''
result.append(api)
for _ in data:
_parse_api(content=data)
return result
"""
解析postman到处的json文件
Args:
path:
Returns:
"""
data = FileUtils.read_json_data(path)
def _parse_api(content):
global result
global id_count
api = {}
if isinstance(content, list):
for item in content:
_parse_api(content=item)
elif isinstance(content, dict):
if 'item' in content.keys():
_parse_api(content=content.get('item'))
elif 'request' in content.keys():
id_count += 1
api['id'] = id_count
api['name'] = 'postman'
api['description'] = content.get('name')
request = content.get('request')
api['Run'] = 'yes'
api['Time'] = 0.5
if request:
# api请求方法
api['Method'] = request.get('method', 'GET').upper()
header = request.get('header')
header = {item.get('key'): item.get('value') for item in
header} if header else {}
auth = request.get('auth')
if auth:
auth_type = auth.get('type')
if auth.get(auth_type):
auth_value = {item.get('key'): item.get('value') for item in
auth.get(auth_type) if
(item and item.get('key'))}
header.update(auth_value)
# api 请求地址
url = request.get('url')
if url:
api['Url'] = url.get('raw')
# if url and url.get('path'):
# # api请求URL
# api['Url'] = r'/'.join(url.get('path'))
#
# if url and url.get('query'):
# # api查询参数
# api['Request Data'] = '&'.join(
# [item.get('key') + '=' + (item.get('value') or '') for item in url.get('query') if item])
# api请求头
api['Headers'] = json.dumps(header, ensure_ascii=False)
api['Headers是否加密'] = ''
api['params'] = ''
body = request.get('body')
if body:
# api接口请求参数类型
request_mode = body.get('mode')
if 'raw' == request_mode:
api['request_data_type'] = 'json'
elif 'formdata' == request_mode:
api['request_data_type'] = 'data'
elif 'urlencoded' == request_mode:
api['request_data_type'] = 'data'
# api接口请求参数
request_data = body.get(request_mode)
api['Request Data'] = {}
if request_data and 'raw' == request_mode:
api['Request Data'].update(
json.loads(request_data.replace('\t', '').replace('\n',
'').replace(
'\r', '')))
elif request_data and 'formdata' == request_mode:
if isinstance(request_data, list):
for item in request_data:
if item.get("type") == "text":
api['Request Data'].update({item.get(
'key'): item.get("value", "")})
elif item.get("type") == "file":
api["Request Data"].update({item.get(
'key'): item.get("src", "")})
api["request_data_type"] = "files"
api["Request Data"] = json.dumps(api["Request Data"],
ensure_ascii=False)
api['请求参数是否加密'] = ''
api['提取请求参数'] = ''
api['Jsonpath'] = ''
api['正则表达式'] = ''
api['正则变量'] = ''
api['绝对路径表达式'] = ''
api['SQL'] = ''
api['sql变量'] = ''
api['预期结果'] = ''
api['响应结果'] = ''
api['断言结果'] = ''
api['报错日志'] = ''
result.append(api)
for _ in data:
_parse_api(content=data)
return result
if __name__ == '__main__':
pat = r'E:\apitest\cases\temporary_file\postman.json'
res = parsing_postman(pat)
from common.file_handling.excel import DoExcel
from common.config import Config
templates = Config.templates # 使用标准模板
ex = DoExcel(templates)
ex.do_main("postman.xlsx", *res)
pat = r'E:\apitest\cases\temporary_file\postman.json'
res = parsing_postman(pat)
from common.file_handling.excel import DoExcel
from common.config import Config
templates = Config.templates # 使用标准模板
ex = DoExcel(templates)
ex.do_main("postman.xlsx", *res)

View File

@ -11,20 +11,20 @@ from functools import wraps
def singleton(cls):
"""
单例模式类装饰器
Args:
cls:被装饰类
Returns:
"""
instance = {}
@wraps(cls)
def get_instance(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return get_instance
"""
单例模式类装饰器
Args:
cls:被装饰类
Returns:
"""
instance = {}
@wraps(cls)
def get_instance(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return get_instance

View File

@ -12,23 +12,23 @@ __all__ = ['comparator_dict']
# 比较器名词释义
comparator_dict = {
'eq': 'eq:实际值与期望值相等',
'lt': 'lt:实际值小于期望值',
'lte': 'lte:实际值小于或等于期望值',
'gt': 'gt:实际值大于期望值',
'gte': 'gte:实际值大于或等于期望值',
'neq': 'neq:实际值与期望值不相等',
'str_eq': 'str_eq:字符串实际值与期望值相同',
'length_eq': 'length_eq:实际值的长度等于期望长度',
'length_gt': 'length_gt:实际值的长度大于期望长度',
'length_gte': 'length_gte:实际值的长度大于或等于期望长度',
'length_lt': 'length_lt:实际值的长度小于期望长度',
'length_lte': 'length_lte:实际值的长度小于或等于期望长度',
'contains': 'contains:期望值包含在实际值中',
'contained_by': 'contained_by:实际值被包含在期望值中',
'type_match': 'type_match:实际值的类型与期望值的类型相匹配',
'regex_match': 'type_match:正则匹配(从字符串的起始位置匹配)',
'regex_search': 'regex_search:正则匹配(从字符串的任意位置匹配)',
'startswith': 'startswith:实际值是以期望值开始',
'endswith': 'endswith:实际值是以期望值结束',
'eq': 'eq:实际值与期望值相等',
'lt': 'lt:实际值小于期望值',
'lte': 'lte:实际值小于或等于期望值',
'gt': 'gt:实际值大于期望值',
'gte': 'gte:实际值大于或等于期望值',
'neq': 'neq:实际值与期望值不相等',
'str_eq': 'str_eq:字符串实际值与期望值相同',
'length_eq': 'length_eq:实际值的长度等于期望长度',
'length_gt': 'length_gt:实际值的长度大于期望长度',
'length_gte': 'length_gte:实际值的长度大于或等于期望长度',
'length_lt': 'length_lt:实际值的长度小于期望长度',
'length_lte': 'length_lte:实际值的长度小于或等于期望长度',
'contains': 'contains:期望值包含在实际值中',
'contained_by': 'contained_by:实际值被包含在期望值中',
'type_match': 'type_match:实际值的类型与期望值的类型相匹配',
'regex_match': 'type_match:正则匹配(从字符串的起始位置匹配)',
'regex_search': 'regex_search:正则匹配(从字符串的任意位置匹配)',
'startswith': 'startswith:实际值是以期望值开始',
'endswith': 'endswith:实际值是以期望值结束',
}

View File

@ -12,274 +12,274 @@ import re
def eq(actual_value, expect_value):
"""
实际值与期望值相等
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value == expect_value
"""
实际值与期望值相等
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value == expect_value
def lt(actual_value, expect_value):
"""
实际值小于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value < expect_value
"""
实际值小于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value < expect_value
def lte(actual_value, expect_value):
"""
实际值小于或等于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value <= expect_value
"""
实际值小于或等于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value <= expect_value
def gt(actual_value, expect_value):
"""
实际值大于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value > expect_value
"""
实际值大于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value > expect_value
def gte(actual_value, expect_value):
"""
实际值大于或等于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value >= expect_value
"""
实际值大于或等于期望值
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value >= expect_value
def neq(actual_value, expect_value):
"""
实际值与期望值不相等
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value != expect_value
"""
实际值与期望值不相等
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert actual_value != expect_value
def str_eq(actual_value, expect_value):
"""
字符串实际值与期望值相同
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value) == str(expect_value)
"""
字符串实际值与期望值相同
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value) == str(expect_value)
def length_eq(actual_value, expect_value):
"""
实际值的长度等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) == expect_value
"""
实际值的长度等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) == expect_value
def length_gt(actual_value, expect_value):
"""
实际值的长度大于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) > expect_value
"""
实际值的长度大于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) > expect_value
def length_gte(actual_value, expect_value):
"""
实际值的长度大于或等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) >= expect_value
"""
实际值的长度大于或等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) >= expect_value
def length_lt(actual_value, expect_value):
"""
实际值的长度小于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) < expect_value
"""
实际值的长度小于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) < expect_value
def length_lte(actual_value, expect_value):
"""
实际值的长度小于或等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) <= expect_value
"""
实际值的长度小于或等于期望长度
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (int,))
assert len(actual_value) <= expect_value
def contains(actual_value, expect_value):
"""
期望值包含在实际值中
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(actual_value, (list, tuple, dict, str, bytes))
assert expect_value in actual_value
"""
期望值包含在实际值中
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(actual_value, (list, tuple, dict, str, bytes))
assert expect_value in actual_value
def contained_by(actual_value, expect_value):
"""
实际值被包含在期望值中
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (list, tuple, dict, str, bytes))
assert actual_value in expect_value
"""
实际值被包含在期望值中
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert isinstance(expect_value, (list, tuple, dict, str, bytes))
assert actual_value in expect_value
def type_match(actual_value, expect_value):
"""
实际值的类型与期望值的类型相匹配
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
def get_type(name):
if isinstance(name, type):
return name
elif isinstance(name, (str, bytes)):
try:
return __builtins__[name]
except KeyError:
raise ValueError(name)
else:
raise ValueError(name)
assert isinstance(actual_value, get_type(expect_value))
"""
实际值的类型与期望值的类型相匹配
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
def get_type(name):
if isinstance(name, type):
return name
elif isinstance(name, (str, bytes)):
try:
return __builtins__[name]
except KeyError:
raise ValueError(name)
else:
raise ValueError(name)
assert isinstance(actual_value, get_type(expect_value))
def regex_match(actual_value, expect_value):
"""
正则匹配(从字符串的起始位置匹配)
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
if not isinstance(actual_value, str):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.match(expect_value, actual_value)
"""
正则匹配(从字符串的起始位置匹配)
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
if not isinstance(actual_value, str):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.match(expect_value, actual_value)
def regex_search(actual_value, expect_value):
"""
正则匹配(从字符串的任意位置匹配)
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
if not isinstance(actual_value, str):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.search(expect_value, actual_value)
"""
正则匹配(从字符串的任意位置匹配)
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
if not isinstance(actual_value, str):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.search(expect_value, actual_value)
def startswith(actual_value, expect_value):
"""
实际值是以期望值开始
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value).startswith(str(expect_value))
"""
实际值是以期望值开始
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value).startswith(str(expect_value))
def endswith(actual_value, expect_value):
"""
实际值是以期望值结束
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value).endswith(str(expect_value))
"""
实际值是以期望值结束
Args:
actual_value: 实际值
expect_value: 期望值
Returns:
"""
assert str(actual_value).endswith(str(expect_value))

View File

@ -16,76 +16,77 @@ from common.validation import logger
class Extractor:
"""
提取器
主要功能
1格式化输出变量
2从响应中提取需要输出的变量信息并返回
"""
def __init__(self):
self.output_variables_mapping = {}
def uniform_output(self, output_variables):
"""
统一格式化测试用例的输出变量output
Args:
output_variables: listdictstr 示例["a","b",{"a":"ac"}] or {"a":"ac"} or "a"
Returns: 示例[{"alias_key":"original_key"}]
list
"""
if isinstance(output_variables, list):
for output_variable in output_variables:
self.uniform_output(output_variable)
elif isinstance(output_variables, dict):
for alias_key, original_key in output_variables.items():
if not isinstance(alias_key, str):
alias_key = json.dumps(alias_key, ensure_ascii=False)
if not isinstance(original_key, str):
original_key = json.dumps(original_key, ensure_ascii=False)
self.output_variables_mapping.update({alias_key: original_key})
elif isinstance(output_variables, str):
self.output_variables_mapping.update({output_variables: output_variables})
else:
raise Exception("参数格式错误!")
def extract_output(self, resp_obj=None):
"""
从接口返回中提取待输出变量的值
Args:
resp_obj: ResponseObject对象的resp_obj属性
Returns: output_variables_mapping 从resp_obj中提取后的mapping
"""
return {alias_key: self.extract_value_by_jsonpath(resp_obj=resp_obj, expr=original_key) for
alias_key, original_key in self.output_variables_mapping.items()}
@staticmethod
def extract_value_by_jsonpath(resp_obj=None, expr=None):
"""
根据jsonpath从resp_obj中提取相应的值
Args:
resp_obj: ResponseObject实例
expr: 提取条件
Returns:
"""
logger.debug(f'正在执行数据提取:提取数据源内容:{resp_obj},{type(resp_obj)}')
logger.debug('正在执行数据提取:提取表达式:{expr}'.format(expr=expr))
result = jsonpath.jsonpath(resp_obj if isinstance(resp_obj, (dict, list)) else json.dumps(resp_obj), expr)
if result is False:
result = []
logger.error(f'提取失败:提取表达式:{expr},没有提取到对应的值')
elif isinstance(result, list):
if len(result) == 1:
result = result[0]
logger.info(f'提取成功,输出结果,提取表达式:{expr},提取结果:{result}')
return result
"""
提取器
主要功能
1格式化输出变量
2从响应中提取需要输出的变量信息并返回
"""
def __init__(self):
self.output_variables_mapping = {}
def uniform_output(self, output_variables):
"""
统一格式化测试用例的输出变量output
Args:
output_variables: listdictstr 示例["a","b",{"a":"ac"}] or {"a":"ac"} or "a"
Returns: 示例[{"alias_key":"original_key"}]
list
"""
if isinstance(output_variables, list):
for output_variable in output_variables:
self.uniform_output(output_variable)
elif isinstance(output_variables, dict):
for alias_key, original_key in output_variables.items():
if not isinstance(alias_key, str):
alias_key = json.dumps(alias_key, ensure_ascii=False)
if not isinstance(original_key, str):
original_key = json.dumps(original_key, ensure_ascii=False)
self.output_variables_mapping.update({alias_key: original_key})
elif isinstance(output_variables, str):
self.output_variables_mapping.update({output_variables: output_variables})
else:
raise Exception("参数格式错误!")
def extract_output(self, resp_obj=None):
"""
从接口返回中提取待输出变量的值
Args:
resp_obj: ResponseObject对象的resp_obj属性
Returns: output_variables_mapping 从resp_obj中提取后的mapping
"""
return {alias_key: self.extract_value_by_jsonpath(resp_obj=resp_obj, expr=original_key) for
alias_key, original_key in self.output_variables_mapping.items()}
@staticmethod
def extract_value_by_jsonpath(resp_obj=None, expr=None):
"""
根据jsonpath从resp_obj中提取相应的值
Args:
resp_obj: ResponseObject实例
expr: 提取条件
Returns:
"""
logger.debug(f'正在执行数据提取:提取数据源内容:{resp_obj},{type(resp_obj)}')
logger.debug('正在执行数据提取:提取表达式:{expr}'.format(expr=expr))
result = jsonpath.jsonpath(resp_obj if isinstance(resp_obj, (dict, list)) else json.dumps(resp_obj),
expr)
if result is False:
result = []
logger.error(f'提取失败:提取表达式:{expr},没有提取到对应的值')
elif isinstance(result, list):
if len(result) == 1:
result = result[0]
logger.info(f'提取成功,输出结果,提取表达式:{expr},提取结果:{result}')
return result
if __name__ == '__main__':
r_obg = {"data": ["key", 1, "val", 2]}
Extractor.extract_value_by_jsonpath(r_obg, "$.data[0]")
r_obg = {"data": ["key", 1, "val", 2]}
Extractor.extract_value_by_jsonpath(r_obg, "$.data[0]")

View File

@ -19,43 +19,43 @@ from common.validation import logger
class LoadModulesFromFolder(DependentParameter):
def __init__(self):
super().__init__()
@logger.log_decorator()
def load_modules_from_folder(self, folder_path):
"""
动态加载指定文件夹下的模块并读取其中的函数存储在字典这样的数据结构中
通过访问字典的 key 可以获取到对应的函数值并调用
Args:
folder_path (str): 要加载模块的文件夹路径
Returns:
dict: 存储函数的字典键为函数名值为函数对象
"""
if not os.path.exists(folder_path): # 检查文件夹路径是否存在
raise ValueError("Folder path does not exist.")
for file_name in os.listdir(folder_path): # 遍历指定文件夹下的所有文件
module_name, ext = os.path.splitext(file_name)
if ext == '.py' and module_name != '__init__': # 如果是 Python 模块文件
module_path = os.path.join(folder_path, file_name) # 获取模块文件的完整路径
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
try:
spec.loader.exec_module(module) # 加载模块文件并执行其中的代码,将函数定义添加到 module 对象中
except Exception as e:
continue
# 遍历 module 对象中的所有属性,找出函数并添加到 functions 字典中
for name, obj in vars(module).items():
if callable(obj):
self.update_variable(name, obj)
def __init__(self):
super().__init__()
@logger.log_decorator()
def load_modules_from_folder(self, folder_path):
"""
动态加载指定文件夹下的模块并读取其中的函数存储在字典这样的数据结构中
通过访问字典的 key 可以获取到对应的函数值并调用
Args:
folder_path (str): 要加载模块的文件夹路径
Returns:
dict: 存储函数的字典键为函数名值为函数对象
"""
if not os.path.exists(folder_path): # 检查文件夹路径是否存在
raise ValueError("Folder path does not exist.")
for file_name in os.listdir(folder_path): # 遍历指定文件夹下的所有文件
module_name, ext = os.path.splitext(file_name)
if ext == '.py' and module_name != '__init__': # 如果是 Python 模块文件
module_path = os.path.join(folder_path, file_name) # 获取模块文件的完整路径
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
try:
spec.loader.exec_module(module) # 加载模块文件并执行其中的代码,将函数定义添加到 module 对象中
except Exception as e:
continue
# 遍历 module 对象中的所有属性,找出函数并添加到 functions 字典中
for name, obj in vars(module).items():
if callable(obj):
self.update_variable(name, obj)
if __name__ == '__main__':
lmff = LoadModulesFromFolder()
lmff.load_modules_from_folder(r'D:\apk_api\api-test-project\extensions')
print(lmff.get_variable())
lmff = LoadModulesFromFolder()
lmff.load_modules_from_folder(r'D:\apk_api\api-test-project\extensions')
print(lmff.get_variable())

View File

@ -15,60 +15,60 @@ from common.validation import logger
class Loaders(Pyt):
def __init__(self):
super().__init__()
@logger.log_decorator()
def load_built_in_functions(self, model):
"""
加载bif_functions包中的内建方法
Returns:
"""
built_in_functions = {}
for name, item in vars(model).items():
if isinstance(item, types.FunctionType):
built_in_functions[name] = item
return built_in_functions
@logger.log_decorator()
def load_built_in_comparators(self) -> object:
"""
加载包中的内建比较器
Returns:
"""
built_in_comparators = {}
for name, item in vars(comparators).items():
if isinstance(item, types.FunctionType):
built_in_comparators[name] = item
return built_in_comparators
# def load_model_fun(model):
# """
# 加载指定模块中的所有函数
# Returns:
#
# """
# for name, item in vars(model).items():
# if isinstance(item, types.FunctionType):
# Variables.update_variable(f"{name}()", item)
@logger.log_decorator()
def set_bif_fun(self, model):
"""
将所有内置方法加载到依赖表中
Returns:
"""
for k, v in self.load_built_in_functions(model).items():
self.update_variable(f"{k}()", v)
def __init__(self):
super().__init__()
@logger.log_decorator()
def load_built_in_functions(self, model):
"""
加载bif_functions包中的内建方法
Returns:
"""
built_in_functions = {}
for name, item in vars(model).items():
if isinstance(item, types.FunctionType):
built_in_functions[name] = item
return built_in_functions
@logger.log_decorator()
def load_built_in_comparators(self) -> object:
"""
加载包中的内建比较器
Returns:
"""
built_in_comparators = {}
for name, item in vars(comparators).items():
if isinstance(item, types.FunctionType):
built_in_comparators[name] = item
return built_in_comparators
# def load_model_fun(model):
# """
# 加载指定模块中的所有函数
# Returns:
#
# """
# for name, item in vars(model).items():
# if isinstance(item, types.FunctionType):
# Variables.update_variable(f"{name}()", item)
@logger.log_decorator()
def set_bif_fun(self, model):
"""
将所有内置方法加载到依赖表中
Returns:
"""
for k, v in self.load_built_in_functions(model).items():
self.update_variable(f"{k}()", v)
if __name__ == '__main__':
from common.bif_functions import random_tools
loaders = Loaders()
loaders.load_built_in_comparators()
loaders.set_bif_fun(random_tools)
print(loaders.get_variable())
from common.bif_functions import random_tools
loaders = Loaders()
loaders.load_built_in_comparators()
loaders.set_bif_fun(random_tools)
print(loaders.get_variable())

View File

@ -5,43 +5,43 @@ from dataclasses import dataclass
@dataclass
class Variables:
variables = {} # 定义依赖表
pattern_l = re.compile(r"{{\s*([^}\s]+)\s*}}(?:\[(\d+)\])?")
PATTERN = re.compile(r"{{(.*?)}}") # 预编译正则表达式
pattern = re.compile(r'({)')
pattern_fun = re.compile(r"{{(\w+\(\))}}")
@classmethod
def update_variable(cls, key, value):
"""更新依赖表"""
cls.variables[f"{{{{{key}}}}}"] = value
@classmethod
def get_variable(cls, key=None):
"""获取依赖表 或 依赖表中key对应的值"""
return cls.variables if not key else cls.variables.get(key)
@classmethod
def set_variable(cls, value):
"""设置依赖表"""
cls.variables = value
@classmethod
def reset(cls):
"""重置"""
cls.variables.clear()
cls.request = None
cls.response = None
variables = {} # 定义依赖表
pattern_l = re.compile(r"{{\s*([^}\s]+)\s*}}(?:\[(\d+)\])?")
PATTERN = re.compile(r"{{(.*?)}}") # 预编译正则表达式
pattern = re.compile(r'({)')
pattern_fun = re.compile(r"{{(\w+\(\))}}")
@classmethod
def update_variable(cls, key, value):
"""更新依赖表"""
cls.variables[f"{{{{{key}}}}}"] = value
@classmethod
def get_variable(cls, key=None):
"""获取依赖表 或 依赖表中key对应的值"""
return cls.variables if not key else cls.variables.get(key)
@classmethod
def set_variable(cls, value):
"""设置依赖表"""
cls.variables = value
@classmethod
def reset(cls):
"""重置"""
cls.variables.clear()
cls.request = None
cls.response = None
if __name__ == '__main__':
from common.file_handling.get_excel_init import get_init
from common.config import Config
test_file = Config.test_api
excel_handle, init_data, test_case = get_init(test_file)
initialize_data = eval(init_data.get("initialize_data"))
print(initialize_data)
d = Variables
d.set_variable(initialize_data) # 初始化依赖表
print("--------------------->", d.get_variable())
from common.file_handling.get_excel_init import get_init
from common.config import Config
test_file = Config.test_case
excel_handle, init_data, test_case = get_init(test_file)
initialize_data = eval(init_data.get("initialize_data"))
print(initialize_data)
d = Variables
d.set_variable(initialize_data) # 初始化依赖表
print("--------------------->", d.get_variable())

8
config.yaml Normal file
View File

@ -0,0 +1,8 @@
base_path: .
current_path: .
templates: ./cases/templates/templates.xlsx # 测试用例模板文件
test_case: ./cases/cases/test_cases.xlsx # 测试用例
script: ./test_script # 动态脚本
test_report: ./output/reports # 测试报告
log_path: ./output/log # 日志
script_dir: ./scripts # 测试主代码脚本

View File

@ -1,18 +1,17 @@
# decorator_test.py
def my_decorator(func):
print("Decorator function called.")
def wrapper(*args, **kwargs):
print("Wrapper function called.")
return func(*args, **kwargs)
return wrapper
print("Decorator function called.")
def wrapper(*args, **kwargs):
print("Wrapper function called.")
return func(*args, **kwargs)
return wrapper
@my_decorator
def my_function():
print("Original function called.")
print("Original function called.")
# print("Module imported.")

View File

@ -10,25 +10,26 @@
import requests
from common.database.redis_client import RedisClient
redis_client = RedisClient()
# 第一个接口,设置依赖数据
def first_api():
response = requests.get('https://api.example.com/first')
data = response.json()
redis_client.set_data('key', data['value'])
response = requests.get('https://api.example.com/first')
data = response.json()
redis_client.set_data('key', data['value'])
def second_api():
# 获取依赖数据
dependency_data = redis_client.get_data('key')
response = requests.post('https://api.example.com/second', data={'data': dependency_data})
result = response.json()
# 处理接口响应结果
# 获取依赖数据
dependency_data = redis_client.get_data('key')
response = requests.post('https://api.example.com/second', data={'data': dependency_data})
result = response.json()
# 处理接口响应结果
if __name__ == '__main__':
first_api()
second_api()
first_api()
second_api()

View File

@ -12,13 +12,13 @@ import json
import json
data = {
"name": "kira",
"age": 18,
"hobby": ["唱歌", "吹牛"],
"friends": [
{"name": "刘德华"},
{"name": "梁朝伟"}
]
"name": "kira",
"age": 18,
"hobby": ["唱歌", "吹牛"],
"friends": [
{"name": "刘德华"},
{"name": "梁朝伟"}
]
}
json_str = json.dumps(data)
print(json_str)

View File

@ -10,5 +10,4 @@ print("Function called.")
"""
eval(ss)

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python
# !/usr/bin/env python
# encoding: utf-8
"""
@author: kira
@ -20,41 +19,41 @@ redis_client = RedisClient()
def get_user_info(user_id):
cache_key = f'user:{user_id}'
user_info = redis_client.get_data(cache_key)
if not user_info:
# 调用接口获取用户信息
response = requests.get(f'http://127.0.0.1:5000/?user_id={user_id}')
if response.status_code == 200:
user_info = response.text
print(user_info)
redis_client.set_data(cache_key, user_info, expire_time=3600)
else:
print(f"Failed to retrieve user info for user_id: {user_id}. Status code: {response.status_code}")
return user_info
cache_key = f'user:{user_id}'
user_info = redis_client.get_data(cache_key)
if not user_info:
# 调用接口获取用户信息
response = requests.get(f'http://127.0.0.1:5000/?user_id={user_id}')
if response.status_code == 200:
user_info = response.text
print(user_info)
redis_client.set_data(cache_key, user_info, expire_time=3600)
else:
print(f"Failed to retrieve user info for user_id: {user_id}. Status code: {response.status_code}")
return user_info
# 并发测试函数
def run_concurrent_test(user_ids):
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交任务到线程池
future_to_user_id = {executor.submit(get_user_info, user_id): user_id for user_id in user_ids}
# 处理返回结果
for future in concurrent.futures.as_completed(future_to_user_id):
user_id = future_to_user_id[future]
try:
user_info = future.result()
print(f"user_id: {user_id}; user_info: {user_info}")
except Exception as e:
print(f"Error occurred for user_id: {user_id}, Error: {str(e)}")
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交任务到线程池
future_to_user_id = {executor.submit(get_user_info, user_id): user_id for user_id in user_ids}
# 处理返回结果
for future in concurrent.futures.as_completed(future_to_user_id):
user_id = future_to_user_id[future]
try:
user_info = future.result()
print(f"user_id: {user_id}; user_info: {user_info}")
except Exception as e:
print(f"Error occurred for user_id: {user_id}, Error: {str(e)}")
if __name__ == '__main__':
u_ids = [i for i in range(10, 99)]
run_concurrent_test(u_ids)
# u_ids = [i for i in range(1000, 99999)]
# for i in u_ids:
# response = requests.get(f'http://127.0.0.1:5000/?user_id={i}')
# print(response.text)
u_ids = [i for i in range(10, 99)]
run_concurrent_test(u_ids)
# u_ids = [i for i in range(1000, 99999)]
# for i in u_ids:
# response = requests.get(f'http://127.0.0.1:5000/?user_id={i}')
# print(response.text)

View File

@ -11,29 +11,29 @@ from functools import wraps
def single(cls):
instance = {}
@wraps(cls)
def decortator(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return decortator
instance = {}
@wraps(cls)
def decortator(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return decortator
class A:
pass
pass
@single
class B(A):
pass
pass
class C(B):
pass
pass
if __name__ == '__main__':
C()
C()

View File

@ -1,164 +0,0 @@
.
├── OutPut
│ ├── Log
│ ├── Reports
│ │ ├── T 测试报告.html
│ │ ├── T.html
│ │ ├── history.json
│ │ ├── report.html
│ │ ├── test_api 测试报告.html
│ │ └── test_api.html
│ └── __init__.py
├── Pipfile
├── Pipfile.lock
├── README.md
├── cases
│ ├── cases
│ │ ├── test_api.xlsx
│ │ ├── test_openapi_cases.xlsx
│ │ └── test_postman_cases.xlsx
│ ├── templates
│ │ └── template.xlsx
│ └── temporary_file
│ ├── apifox.json
│ ├── openapi.json
│ └── postman.json
├── common
│ ├── __init__.py
│ ├── bif_functions
│ │ ├── __init__.py
│ │ ├── bif_datetime.py
│ │ ├── bif_hashlib.py
│ │ ├── bif_json.py
│ │ ├── bif_list.py
│ │ ├── bif_random.py
│ │ ├── bif_re.py
│ │ ├── bif_str.py
│ │ ├── bif_time.py
│ │ └── random_tools.py
│ ├── config.py
│ ├── crypto
│ │ ├── __init__.py
│ │ ├── encryption_aes.py
│ │ ├── encryption_base64_to_image.py
│ │ ├── encryption_main.py
│ │ ├── encryption_rsa.py
│ │ └── encryption_str.py
│ ├── data_extraction
│ │ ├── __init__.py
│ │ ├── analysis_json.py
│ │ ├── assert_dict.py
│ │ ├── data_extractor.py
│ │ ├── dependent_parameter.py
│ │ └── dict_get.py
│ ├── database
│ │ ├── __init__.py
│ │ ├── do_mongo.py
│ │ ├── execute_sql.py
│ │ ├── do_psycopg.py
│ │ └── do_redis.py
│ ├── variables.py
│ ├── file_handling
│ │ ├── __init__.py
│ │ ├── do_bat_sql.py
│ │ ├── do_excel.py
│ │ ├── excel.py
│ │ ├── get_all_path.py
│ │ ├── get_conf_data.py
│ │ ├── get_excel_init.py
│ │ ├── get_file.py
│ │ ├── get_folder.py
│ │ └── read_file.py
│ ├── random_tools
│ │ ├── __init__.py
│ │ ├── credit_cards
│ │ │ ├── __init__.py
│ │ │ ├── bankcard.py
│ │ │ └── cardbin.csv
│ │ ├── credit_identifiers
│ │ │ ├── __init__.py
│ │ │ ├── address.json
│ │ │ ├── credit_identifier.py
│ │ │ └── unified_social_credit_identifier.py
│ │ ├── emails
│ │ │ ├── __init__.py
│ │ │ ├── email.py
│ │ │ └── free_email.csv
│ │ ├── identification
│ │ │ ├── __init__.py
│ │ │ ├── area.csv
│ │ │ └── id_card.py
│ │ ├── names
│ │ │ ├── __init__.py
│ │ │ ├── first_name_boy.csv
│ │ │ ├── first_name_girl.csv
│ │ │ ├── last_name.csv
│ │ │ └── name.py
│ │ └── phone_numbers
│ │ ├── __init__.py
│ │ ├── phone.py
│ │ └── phone_area.csv
│ ├── utils
│ │ ├── WxworkSms.py
│ │ ├── __init__.py
│ │ ├── captcha.py
│ │ ├── function_run_time.py
│ │ ├── hooks.py
│ │ ├── http_client.py
│ │ ├── logger.py
│ │ ├── mylogger.py
│ │ ├── parsing_openapi.py
│ │ ├── parsing_postman.py
│ │ ├── request.py
│ │ ├── request_processor.py
│ │ ├── retry.py
│ │ └── singleton.py
│ └── validation
│ ├── __init__.py
│ ├── comparator_dict.py
│ ├── comparators.py
│ ├── extractor.py
│ ├── load_modules_from_folder.py
│ ├── loaders.py
│ └── validator.py
├── debug
│ ├── decorator_test.py
│ ├── identify_results.txt
│ └── myf.py
├── excel_converter.py
├── extensions
│ ├── __init__.py
│ ├── ext_method_online.py
│ └── sign.py
├── generate_tree.py
├── image
│ ├── wx.jpg
│ └── zfb.jpg
├── main.py
├── main_personal_information.py
├── pipenv_command.text
├── scripts
│ └── __init__.py
├── temp
│ ├── __init__.py
│ ├── excel_handler.py
│ ├── extent
│ │ ├── __init__.py
│ │ ├── api.py
│ │ ├── config.py
│ │ └── test_api_script.py
│ ├── fun.md
│ ├── get_zl.py
│ ├── mqtt_sender.py
│ ├── parsing_jmeter.py
│ ├── rabbit_mq_sender.py
│ └── test_log.py
└── test_script
├── __init__.py
├── automation
│ ├── __init__.py
│ └── test_api_script.py
└── script
├── __init__.py
├── baseclass.py
└── test_api.py

View File

@ -1 +0,0 @@
.

View File

@ -7,38 +7,40 @@ from common.utils.parsing_openapi import parsing_openapi
class ExcelConverter:
tool_mapping = {
'postman': 'convert_postman_to_excel',
'openapi': 'convert_openapi_to_excel'
}
def __init__(self, tool_type, input_file, output_file):
self.tool_type = tool_type
self.input_file = input_file
self.output_file = output_file
# 使用标准模板
self.excel = DoExcel(Config.templates)
def convert_openapi_to_excel(self):
"""将openapi导出的json文件转为excel测试用例"""
openapi_to_json = parsing_openapi(self.input_file) # 解析 openapi 文件
self.excel.do_main(self.output_file, *openapi_to_json) # 参照模板文件,写入数据
def convert_postman_to_excel(self):
"""将postman导出的json文件转为excel测试用例"""
postman_to_excel = parsing_postman(self.input_file)
self.excel.do_main(self.output_file, *postman_to_excel)
def main(self):
conversion_method = self.tool_mapping.get(self.tool_type)
if conversion_method:
getattr(self, conversion_method)()
tool_mapping = {
'postman': 'convert_postman_to_excel',
'openapi': 'convert_openapi_to_excel'
}
def __init__(self, tool_type, input_file, output_file):
self.tool_type = tool_type
self.input_file = input_file
self.output_file = output_file
# 使用标准模板
self.excel = DoExcel(Config.templates)
def convert_openapi_to_excel(self):
"""将openapi导出的json文件转为excel测试用例"""
openapi_to_json = parsing_openapi(self.input_file) # 解析 openapi 文件
self.excel.do_main(self.output_file, *openapi_to_json) # 参照模板文件,写入数据
def convert_postman_to_excel(self):
"""将postman导出的json文件转为excel测试用例"""
postman_to_excel = parsing_postman(self.input_file)
self.excel.do_main(self.output_file, *postman_to_excel)
def main(self):
conversion_method = self.tool_mapping.get(self.tool_type)
if conversion_method:
getattr(self, conversion_method)()
if __name__ == '__main__':
postman_to_json = r'.\data\temporary_file\postman.json' # postman导出的json文件
postman_out_file = os.path.join(Config.base_path, 'cases', 'test_cases', 'test_postman_cases.xlsx') # 转化后的文件保存的位置
openapi_to_json = r'.\data\temporary_file\openapi.json' # postman导出的json文件
openapi_out_file = os.path.join(Config.base_path, 'cases', 'test_cases', 'test_openapi_cases.xlsx') # 转化后的文件保存的位置
ExcelConverter('postman', postman_to_json, postman_out_file).main()
ExcelConverter('postman', openapi_to_json, openapi_out_file).main()
postman_to_json = r'.\data\temporary_file\postman.json' # postman导出的json文件
postman_out_file = os.path.join(Config.base_path, 'cases', 'test_cases',
'test_postman_cases.xlsx') # 转化后的文件保存的位置
openapi_to_json = r'.\data\temporary_file\openapi.json' # postman导出的json文件
openapi_out_file = os.path.join(Config.base_path, 'cases', 'test_cases',
'test_openapi_cases.xlsx') # 转化后的文件保存的位置
ExcelConverter('postman', postman_to_json, postman_out_file).main()
ExcelConverter('postman', openapi_to_json, openapi_out_file).main()

View File

@ -12,6 +12,4 @@ __all__ = ["online_function"]
def online_function():
pass
pass

View File

@ -20,44 +20,45 @@ from extensions import logger
@logger.log_decorator()
def md5_sign(data: dict):
"""
数据加签
Args:
**data:需要加钱的数据
Returns:
"""
sorted_list = []
for key, value in data.items():
try:
sorted_params = str(key) + str(value)
sorted_list.append(sorted_params)
except Exception:
raise
sort = natsorted(sorted_list) # 列表自然排序
argument = "加签所需要的密钥"
keystore = argument + ("".join(sort)) # 生成加带密钥的新字符串
sign_value = md5(keystore)
return {**data, **{"sign": sign_value}}
"""
数据加签
Args:
**data:需要加钱的数据
Returns:
"""
sorted_list = []
for key, value in data.items():
try:
sorted_params = str(key) + str(value)
sorted_list.append(sorted_params)
except Exception:
raise
sort = natsorted(sorted_list) # 列表自然排序
argument = "加签所需要的密钥"
keystore = argument + ("".join(sort)) # 生成加带密钥的新字符串
sign_value = md5(keystore)
return {**data, **{"sign": sign_value}}
@logger.log_decorator()
def sha1_sign(post_data: dict):
timestamp = int(round(time.time() * 1000)) # 毫秒级时间戳
argument = {"secretKey": "", "timestamp": timestamp} # 加密加盐参数
res = {**post_data, **argument}
sorted_list = []
for key, value in res.items():
try:
value = json.dumps(value, ensure_ascii=False) if isinstance(value, list) or isinstance(value,
dict) else str(value)
sorted_params = str(key) + "=" + value
sorted_list.append(sorted_params)
except Exception as e:
raise e
sort = natsorted(sorted_list) # 列表自然排序 返回[(key,value),(key,value)]
splicing_str = "&".join(sort) # 排序结果 key=value&key=value 拼接
encrypted_str = sha1_secret_str(splicing_str) # sha1加密
sign = {"signature": encrypted_str}
return {**res, **sign} # request 中使用json入参则传dict
timestamp = int(round(time.time() * 1000)) # 毫秒级时间戳
argument = {"secretKey": "", "timestamp": timestamp} # 加密加盐参数
res = {**post_data, **argument}
sorted_list = []
for key, value in res.items():
try:
value = json.dumps(value, ensure_ascii=False) if isinstance(value, list) or isinstance(value,
dict) else str(
value)
sorted_params = str(key) + "=" + value
sorted_list.append(sorted_params)
except Exception as e:
raise e
sort = natsorted(sorted_list) # 列表自然排序 返回[(key,value),(key,value)]
splicing_str = "&".join(sort) # 排序结果 key=value&key=value 拼接
encrypted_str = sha1_secret_str(splicing_str) # sha1加密
sign = {"signature": encrypted_str}
return {**res, **sign} # request 中使用json入参则传dict

View File

@ -4,40 +4,40 @@ from treelib import Tree
def generate_directory_tree(directory, tree, parent=None, indent=''):
items = os.listdir(directory)
items.sort() # 对目录列表按照字符排序
# 排除的文件后缀名、文件夹名称和隐藏文件
exclude_extensions = ('.png', '.gif', '.jmx', '.logger', 'pyc')
exclude_folders = ('__pycache__')
for i, item in enumerate(items):
item_path = os.path.join(directory, item)
if item in exclude_folders:
continue
if any(item.endswith(ext) for ext in exclude_extensions):
continue
if item.startswith('.'):
continue
if os.path.isdir(item_path):
node = tree.create_node(item, item_path, parent=parent)
generate_directory_tree(item_path, tree, parent=node.identifier, indent=indent + ' ')
else:
tree.create_node(item, item_path, parent=parent)
items = os.listdir(directory)
items.sort() # 对目录列表按照字符排序
# 排除的文件后缀名、文件夹名称和隐藏文件
exclude_extensions = ('.png', '.gif', '.jmx', '.logger', 'pyc')
exclude_folders = ('__pycache__')
for i, item in enumerate(items):
item_path = os.path.join(directory, item)
if item in exclude_folders:
continue
if any(item.endswith(ext) for ext in exclude_extensions):
continue
if item.startswith('.'):
continue
if os.path.isdir(item_path):
node = tree.create_node(item, item_path, parent=parent)
generate_directory_tree(item_path, tree, parent=node.identifier, indent=indent + ' ')
else:
tree.create_node(item, item_path, parent=parent)
def save_directory_tree(tree, node, file, indent=''):
if node is None:
return
file.write(f"{indent}{node}\n")
for child_id in tree.children(node):
child_node = tree.get_node(child_id)
save_directory_tree(tree, child_node.identifier, file, indent=indent + ' ')
if node is None:
return
file.write(f"{indent}{node}\n")
for child_id in tree.children(node):
child_node = tree.get_node(child_id)
save_directory_tree(tree, child_node.identifier, file, indent=indent + ' ')
root_directory = '.' # 当前目录
@ -49,6 +49,6 @@ generate_directory_tree(root_directory, directory_tree, parent=root_node.identif
# 保存目录树到文件
with open('directory_tree.txt', 'w') as file:
save_directory_tree(directory_tree, root_node.identifier, file)
save_directory_tree(directory_tree, root_node.identifier, file)
print("目录树已保存到文件directory_tree.txt")

View File

@ -15,28 +15,29 @@ from common.random_tools.credit_cards import bankcard
from common.random_tools.credit_identifiers import credit_identifier
if __name__ == "__main__":
f = Faker(locale="zh_CN")
number = int(input("请输入大于2的数字以便生成随机用户信息:"))
table = PrettyTable(
("序号", "用户名", "性别", "年龄", "生日", "身份证", "银行卡或信用卡", "座机", "手机号", "邮箱", "地址",
"统一社会信用代码"))
for i in range(number):
sex_id = random.randint(0, 1)
user_name = name.get_girl() if sex_id == 0 else name.get_boy()
user_sex = "" if sex_id == 0 else ""
user_id_card = idcard.get_generate_id(sex=sex_id)
user_age = str(idcard.get_age(user_id_card))
user_birthday = idcard.get_birthday(user_id_card)
user_tele = phone.get_tele_number()
user_mobile = phone.get_mobile_number()
user_email = email.get_email(user_name)
user_address = f.address()
user_bank_card = bankcard.get_bank_card()
try:
unified_social_credit_code = credit_identifier.unified_social_credit_code()
except:
unified_social_credit_code = None
else:
table.add_row([i, user_name, user_sex, user_age, user_birthday, user_id_card, user_bank_card, user_tele,
user_mobile, user_email, user_address, unified_social_credit_code])
print(table)
f = Faker(locale="zh_CN")
number = int(input("请输入大于2的数字以便生成随机用户信息:"))
table = PrettyTable(
("序号", "用户名", "性别", "年龄", "生日", "身份证", "银行卡或信用卡", "座机", "手机号", "邮箱", "地址",
"统一社会信用代码"))
for i in range(number):
sex_id = random.randint(0, 1)
user_name = name.get_girl() if sex_id == 0 else name.get_boy()
user_sex = "" if sex_id == 0 else ""
user_id_card = idcard.get_generate_id(sex=sex_id)
user_age = str(idcard.get_age(user_id_card))
user_birthday = idcard.get_birthday(user_id_card)
user_tele = phone.get_tele_number()
user_mobile = phone.get_mobile_number()
user_email = email.get_email(user_name)
user_address = f.address()
user_bank_card = bankcard.get_bank_card()
try:
unified_social_credit_code = credit_identifier.unified_social_credit_code()
except:
unified_social_credit_code = None
else:
table.add_row([i, user_name, user_sex, user_age, user_birthday, user_id_card, user_bank_card,
user_tele,
user_mobile, user_email, user_address, unified_social_credit_code])
print(table)

232
output/reports/history.json Normal file
View File

@ -0,0 +1,232 @@
[
{
"success": 4,
"all": 7,
"fail": 1,
"skip": 0,
"error": 2,
"runtime": "0.45 S",
"begin_time": "2023-04-21 12:10:31",
"pass_rate": "57.14"
},
{
"success": 0,
"all": 1,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "0.01 S",
"begin_time": "2023-04-21 12:11:52",
"pass_rate": "0.00"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.33 S",
"begin_time": "2023-04-21 12:12:54",
"pass_rate": "83.33"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.30 S",
"begin_time": "2023-04-21 12:13:32",
"pass_rate": "83.33"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.28 S",
"begin_time": "2023-04-21 14:47:43",
"pass_rate": "83.33"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.27 S",
"begin_time": "2023-04-21 15:01:06",
"pass_rate": "83.33"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.24 S",
"begin_time": "2023-04-21 15:03:53",
"pass_rate": "83.33"
},
{
"success": 5,
"all": 6,
"fail": 1,
"skip": 0,
"error": 0,
"runtime": "0.23 S",
"begin_time": "2023-04-21 15:06:10",
"pass_rate": "83.33"
},
{
"success": 6,
"all": 7,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "3.00 S",
"begin_time": "2023-05-14 23:58:13",
"pass_rate": "85.71"
},
{
"success": 0,
"all": 2,
"fail": 0,
"skip": 0,
"error": 2,
"runtime": "0.02 S",
"begin_time": "2023-05-15 11:52:27",
"pass_rate": "0.00"
},
{
"success": 0,
"all": 2,
"fail": 0,
"skip": 0,
"error": 2,
"runtime": "0.00 S",
"begin_time": "2023-05-15 11:57:23",
"pass_rate": "0.00"
},
{
"success": 6,
"all": 7,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "1.38 S",
"begin_time": "2023-05-15 11:59:30",
"pass_rate": "85.71"
},
{
"success": 6,
"all": 7,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "1.44 S",
"begin_time": "2023-05-16 15:11:50",
"pass_rate": "85.71"
},
{
"success": 6,
"all": 7,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "1.28 S",
"begin_time": "2023-05-17 17:12:52",
"pass_rate": "85.71"
},
{
"success": 0,
"all": 1,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "0.00 S",
"begin_time": "2023-05-17 17:17:15",
"pass_rate": "0.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "1.33 S",
"begin_time": "2023-05-17 17:21:07",
"pass_rate": "100.00"
},
{
"success": 0,
"all": 1,
"fail": 0,
"skip": 0,
"error": 1,
"runtime": "0.00 S",
"begin_time": "2023-06-14 15:16:14",
"pass_rate": "0.00"
},
{
"success": 82,
"all": 82,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.38 S",
"begin_time": "2023-06-16 16:22:27",
"pass_rate": "100.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.32 S",
"begin_time": "2023-06-16 16:26:52",
"pass_rate": "100.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.35 S",
"begin_time": "2023-06-16 16:30:50",
"pass_rate": "100.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.33 S",
"begin_time": "2023-06-16 16:32:32",
"pass_rate": "100.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.32 S",
"begin_time": "2023-06-16 16:36:00",
"pass_rate": "100.00"
},
{
"success": 6,
"all": 6,
"fail": 0,
"skip": 0,
"error": 0,
"runtime": "6.60 S",
"begin_time": "2023-06-25 22:13:53",
"pass_rate": "100.00"
}
]

View File

@ -223,7 +223,7 @@
<div class="info">
<div style="flex:5">
<button type="button" class="btn btn-primary btn-sm">开始时间</button>
<span>2023-06-16 16:36:00</span>
<span>2023-06-25 22:13:53</span>
</div>
<div style="flex:5">
<button type="button" class="btn btn-primary btn-sm">用例总数</button>
@ -233,7 +233,7 @@
<div class="info">
<div style="flex:5">
<button type="button" class="btn btn-primary btn-sm">运行时长</button>
<span>6.32 S</span>
<span>6.60 S</span>
</div>
<div style="flex:5">
<button type="button" class="btn btn-primary btn-sm ">测试人员</button>
@ -272,6 +272,13 @@
</thead>
<tbody>
<tr>
<th scope="row">2023-06-25 22:13:53</th>
<td>6</td>
<td>6</td>
<td>100.00%</td>
</tr>
<tr>
<th scope="row">2023-06-16 16:36:00</th>
<td>6</td>
@ -476,158 +483,7 @@
<tr class="case_">
<td>1</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_1_清表</td>
<td>初始化查询sql</td>
<td>0.000996s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>test_api_1_清表 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>2</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_2_登录</td>
<td>非BIP用户登录</td>
<td>1.14s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
接口状态--> 200
接口耗时--> 0:00:00.046464
接口响应--> {"code":"0","type":"success","data":{"id":"216869045616844116","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"74e56aa9c583d4690ea8b52eba4fcd37","type":"user","avatar":null,"ncAccount":null,"timestamp":1686904561,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
test_api_2_登录 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>3</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_3_安全大屏</td>
<td>大盘-隐患类型数据</td>
<td>0.0s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>test_api_3_安全大屏 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>4</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_4_劳务基础配置</td>
<td>绑定TV</td>
<td>2.11s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'json': '{"projectId":"104966","tvSequence":"SifRZqFWNQCnCtTPsUpq"}', 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1686904563667
请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '74e56aa9c583d4690ea8b52eba4fcd37', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
请求 body --> b'{"projectId": "104966", "tvSequence": "SifRZqFWNQCnCtTPsUpq"}'
接口状态--> 200
接口耗时--> 0:00:00.040989
接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
test_api_4_劳务基础配置 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>5</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_5_劳务基础配置</td>
<td>查询配置</td>
<td>3.07s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'params': None, 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"74e56aa9c583d4690ea8b52eba4fcd37","BSP_USER_TENANT":"216260762345772077"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1686904566770&projectId=104966
请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '74e56aa9c583d4690ea8b52eba4fcd37', 'BSP_USER_TENANT': '216260762345772077'}
请求 body --> None
接口状态--> 200
接口耗时--> 0:00:00.016178
接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
test_api_5_劳务基础配置 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>6</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_6_None</td>
<td>test_api_1</td>
<td>None</td>
<td>0.0s</td>
@ -643,7 +499,158 @@ test_api_5_劳务基础配置 (test_api.TestProjectApi)执行——>【通过】
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>test_api_6_None (test_api.TestProjectApi)执行——>【通过】
<pre>test_api_1 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>2</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_2</td>
<td>None</td>
<td>1.29s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}', 'headers': '{"Content-Type": "application/json"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
请求头 --> {'Content-Type': 'application/json', 'Content-Length': '214'}
请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
接口状态--> 200
接口耗时--> 0:00:00.101005
接口响应--> {"code":"0","type":"success","data":{"id":"216877024344524552","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"3989b7356e0b17173f793d252a89a8b2","type":"user","avatar":null,"ncAccount":null,"timestamp":1687702434,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216260762345772077","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"103654","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/materialsReturned","tenants":[{"id":"1623811301356297657","code":"1623811301356297657","fullName":"广东博嘉拓建筑测试租户","shortName":"广东博嘉拓建筑测试租户","envId":"6296f5e3960c4fdfb9c9357b581c853b","envName":"默认环境","tenantEnvs":null},{"id":"216572673247394736","code":"9C8D5715AAA44D4B8530AB2B7F627E1A","fullName":"安徽腾越建筑工程有限公司","shortName":"安徽腾越建筑工程有限公司","envId":"d1b4f959495f433fb1dd5400a78bce2c","envName":"默认环境","tenantEnvs":null},{"id":"216317749963825419","code":"C2C35D2543B34CA99366D9C76E45D01B","fullName":"沈阳腾越建筑测试租户","shortName":"沈阳腾越建筑测试租户","envId":"c4a70c0a1f5c4aaa83fcd390dcd898c6","envName":"默认环境","tenantEnvs":null},{"id":"216260762345772077","code":"216260762345772077","fullName":"广东腾越建筑工程有限公司","shortName":"广东腾越建筑工程有限公司","envId":"210712034943271000","envName":"默认环境","tenantEnvs":null},{"id":"216328986981406025","code":"TENANT_TEST","fullName":"智慧工地测试租户9","shortName":"智慧工地测试租户9","envId":"e7682a3876a343b483645b0c20da93a3","envName":"默认环境","tenantEnvs":null},{"id":"216365124588606373","code":"TENANT_TEST","fullName":"计划排程自动化测试","shortName":"计划排程自动化测试","envId":"80ce8eb5a7c941f8a6f57b8ecb61ec17","envName":"默认环境","tenantEnvs":null},{"id":"216674624791091228","code":"232E9186B1BE494E966F27BA7CF33AE2","fullName":"cyq测试","shortName":"cyq测试","envId":"ef3f8ed4792f4ef0a5e7d92af394d29c","envName":"默认环境","tenantEnvs":null},{"id":"216687529947792866","code":"9769454E01304245AEE83CE7E99537A8","fullName":"成本总控报表测试租户","shortName":"成本总控报表测试租户","envId":"5125917072884123bf9fe3966ffa4af2","envName":"默认环境","tenantEnvs":null},{"id":"216661417159402453","code":"216661417159402453","fullName":"科技建筑集团","shortName":"科技建筑集团","envId":"b23d88da977e467cb81dd7fb57de97d0","envName":"默认环境","tenantEnvs":null},{"id":"216281557054332425","code":"216281557054332425","fullName":"BIM材料用量计算","shortName":"BIM材料用量计算","envId":"7501c77b0ccd4b4d912451e5f74c1ba7","envName":"默认环境","tenantEnvs":null},{"id":"1320970534539886592","code":"1320970534539886592","fullName":"碧桂园集团","shortName":"碧桂园集团","envId":"1320970534539886592","envName":"默认环境","tenantEnvs":null}],"loginAppDto":null},"msg":null,"succeed":true}
test_api_2 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>3</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_3</td>
<td>None</td>
<td>0.0s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>test_api_3 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>4</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_4</td>
<td>None</td>
<td>2.18s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'json': '{"projectId":"104966","tvSequence":"rsYoCApagmymLNynqDZd"}', 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"3989b7356e0b17173f793d252a89a8b2","BSP_USER_TENANT":"216260762345772077"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1687702437038
请求头 --> {'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '3989b7356e0b17173f793d252a89a8b2', 'BSP_USER_TENANT': '216260762345772077', 'Content-Length': '61'}
请求 body --> b'{"projectId": "104966", "tvSequence": "rsYoCApagmymLNynqDZd"}'
接口状态--> 200
接口耗时--> 0:00:00.062146
接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
test_api_4 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>5</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_5</td>
<td>None</td>
<td>3.13s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>发送请求的参数: {'params': None, 'headers': '{"Content-Type":"application/json;charset=utf-8","BSP_TOKEN":"3989b7356e0b17173f793d252a89a8b2","BSP_USER_TENANT":"216260762345772077"}'}
请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1687702440219&projectId=104966
请求头 --> {'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '3989b7356e0b17173f793d252a89a8b2', 'BSP_USER_TENANT': '216260762345772077'}
请求 body --> None
接口状态--> 200
接口耗时--> 0:00:00.028691
接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
test_api_5 (test_api.TestProjectApi)执行——>【通过】
</pre>
</td>
</tr>
<tr class="case_">
<td>6</td>
<td class="TestProjectApi">TestProjectApi</td>
<td>test_api_6</td>
<td>None</td>
<td>0.0s</td>
<td class="text-success">成功</td>
<td>
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
</td>
</tr>
<tr class="test_log">
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
<pre>test_api_6 (test_api.TestProjectApi)执行——>【通过】
</pre>
@ -668,12 +675,12 @@ test_api_5_劳务基础配置 (test_api.TestProjectApi)执行——>【通过】
"fail": `0`,
"skip": '0',
"error": `0`,
"runtime": '6.32 S',
"begin_time": "6.32 S",
"runtime": '6.60 S',
"begin_time": "6.60 S",
"pass_rate": '100.00',
}
;
const history = [{'success': 4, 'all': 7, 'fail': 1, 'skip': 0, 'error': 2, 'runtime': '0.45 S', 'begin_time': '2023-04-21 12:10:31', 'pass_rate': '57.14'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.01 S', 'begin_time': '2023-04-21 12:11:52', 'pass_rate': '0.00'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.33 S', 'begin_time': '2023-04-21 12:12:54', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.30 S', 'begin_time': '2023-04-21 12:13:32', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.28 S', 'begin_time': '2023-04-21 14:47:43', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.27 S', 'begin_time': '2023-04-21 15:01:06', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.24 S', 'begin_time': '2023-04-21 15:03:53', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.23 S', 'begin_time': '2023-04-21 15:06:10', 'pass_rate': '83.33'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '3.00 S', 'begin_time': '2023-05-14 23:58:13', 'pass_rate': '85.71'}, {'success': 0, 'all': 2, 'fail': 0, 'skip': 0, 'error': 2, 'runtime': '0.02 S', 'begin_time': '2023-05-15 11:52:27', 'pass_rate': '0.00'}, {'success': 0, 'all': 2, 'fail': 0, 'skip': 0, 'error': 2, 'runtime': '0.00 S', 'begin_time': '2023-05-15 11:57:23', 'pass_rate': '0.00'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.38 S', 'begin_time': '2023-05-15 11:59:30', 'pass_rate': '85.71'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.44 S', 'begin_time': '2023-05-16 15:11:50', 'pass_rate': '85.71'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.28 S', 'begin_time': '2023-05-17 17:12:52', 'pass_rate': '85.71'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.00 S', 'begin_time': '2023-05-17 17:17:15', 'pass_rate': '0.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '1.33 S', 'begin_time': '2023-05-17 17:21:07', 'pass_rate': '100.00'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.00 S', 'begin_time': '2023-06-14 15:16:14', 'pass_rate': '0.00'}, {'success': 82, 'all': 82, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.38 S', 'begin_time': '2023-06-16 16:22:27', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.32 S', 'begin_time': '2023-06-16 16:26:52', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.35 S', 'begin_time': '2023-06-16 16:30:50', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.33 S', 'begin_time': '2023-06-16 16:32:32', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.32 S', 'begin_time': '2023-06-16 16:36:00', 'pass_rate': '100.00'}];
const history = [{'success': 4, 'all': 7, 'fail': 1, 'skip': 0, 'error': 2, 'runtime': '0.45 S', 'begin_time': '2023-04-21 12:10:31', 'pass_rate': '57.14'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.01 S', 'begin_time': '2023-04-21 12:11:52', 'pass_rate': '0.00'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.33 S', 'begin_time': '2023-04-21 12:12:54', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.30 S', 'begin_time': '2023-04-21 12:13:32', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.28 S', 'begin_time': '2023-04-21 14:47:43', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.27 S', 'begin_time': '2023-04-21 15:01:06', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.24 S', 'begin_time': '2023-04-21 15:03:53', 'pass_rate': '83.33'}, {'success': 5, 'all': 6, 'fail': 1, 'skip': 0, 'error': 0, 'runtime': '0.23 S', 'begin_time': '2023-04-21 15:06:10', 'pass_rate': '83.33'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '3.00 S', 'begin_time': '2023-05-14 23:58:13', 'pass_rate': '85.71'}, {'success': 0, 'all': 2, 'fail': 0, 'skip': 0, 'error': 2, 'runtime': '0.02 S', 'begin_time': '2023-05-15 11:52:27', 'pass_rate': '0.00'}, {'success': 0, 'all': 2, 'fail': 0, 'skip': 0, 'error': 2, 'runtime': '0.00 S', 'begin_time': '2023-05-15 11:57:23', 'pass_rate': '0.00'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.38 S', 'begin_time': '2023-05-15 11:59:30', 'pass_rate': '85.71'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.44 S', 'begin_time': '2023-05-16 15:11:50', 'pass_rate': '85.71'}, {'success': 6, 'all': 7, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '1.28 S', 'begin_time': '2023-05-17 17:12:52', 'pass_rate': '85.71'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.00 S', 'begin_time': '2023-05-17 17:17:15', 'pass_rate': '0.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '1.33 S', 'begin_time': '2023-05-17 17:21:07', 'pass_rate': '100.00'}, {'success': 0, 'all': 1, 'fail': 0, 'skip': 0, 'error': 1, 'runtime': '0.00 S', 'begin_time': '2023-06-14 15:16:14', 'pass_rate': '0.00'}, {'success': 82, 'all': 82, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.38 S', 'begin_time': '2023-06-16 16:22:27', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.32 S', 'begin_time': '2023-06-16 16:26:52', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.35 S', 'begin_time': '2023-06-16 16:30:50', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.33 S', 'begin_time': '2023-06-16 16:32:32', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.32 S', 'begin_time': '2023-06-16 16:36:00', 'pass_rate': '100.00'}, {'success': 6, 'all': 6, 'fail': 0, 'skip': 0, 'error': 0, 'runtime': '6.60 S', 'begin_time': '2023-06-25 22:13:53', 'pass_rate': '100.00'}];
var passRate = [];
var dTime = [];

Some files were not shown because too many files have changed in this diff Show More