优化测试脚本。
This commit is contained in:
parent
7e8bdaf3ef
commit
5de7e8b3cd
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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
|
|
@ -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)")
|
|
@ -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
|
@ -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'}, duration:0.000028s
|
||||
2023-06-16 16:26:50 | INFO | | end called clear_date | return:清空指定 sheet 中的单元格成功, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000012s
|
||||
2023-06-16 16:26:52 | INFO | | end called set_bif_fun | return:None, duration:0.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:, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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 | return:None, duration:0.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]>, duration:0.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 | return:None, duration:0.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:, duration:0.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}, duration:0.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 | return:1686904016036, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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 | return:None, duration:0.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]>, duration:0.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 | return:None, duration:0.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:, duration:0.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}, duration:0.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 | return:1686904019139, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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 | return:None, duration:0.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]>, duration:0.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 | return:None, duration:0.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'}, duration:0.000031s
|
||||
2023-06-16 16:30:50 | INFO | | end called clear_date | return:清空指定 sheet 中的单元格成功, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000012s
|
||||
2023-06-16 16:30:50 | INFO | | end called set_bif_fun | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904254030, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904257136, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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'}, duration:0.000022s
|
||||
2023-06-16 16:32:32 | INFO | | end called clear_date | return:清空指定 sheet 中的单元格成功, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000013s
|
||||
2023-06-16 16:32:32 | INFO | | end called set_bif_fun | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904355697, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904358799, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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'}, duration:0.000031s
|
||||
2023-06-16 16:36:00 | INFO | | end called clear_date | return:清空指定 sheet 中的单元格成功, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000012s
|
||||
2023-06-16 16:36:00 | INFO | | end called set_bif_fun | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904563667, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1686904566770, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.032615s
|
||||
2023-06-16 16:36:06 | INFO | 所有用例执行完毕
|
|
@ -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"
|
|
@ -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'}
|
|
@ -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'}, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000011s
|
||||
2023-06-19 15:17:11 | INFO | | end called set_bif_fun | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1687159035059, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1687159038152, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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]>, duration:0.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 | return:None, duration:0.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'}, duration:0.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'}, duration:0.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>}, duration:0.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'}, duration:0.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>}, duration:0.000010s
|
||||
2023-06-19 15:17:57 | INFO | | end called set_bif_fun | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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}, duration:0.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 | return:None, duration:0.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="}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1687159080446, duration:0.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}, duration:0.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 | return:None, duration:0.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"}'), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | return:None, duration:0.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}, duration:0.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 | return:1687159083535, duration:0.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}, duration:0.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:{}, duration:0.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), duration:0.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]>, duration:0.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 | return:None, duration:0.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 | 所有用例执行完毕
|
|
@ -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'}
|
|
@ -1,2 +0,0 @@
|
|||
2023-06-20 16:31:02 | ERROR | 被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
||||
2023-06-20 16:50:27 | ERROR | 被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
|
@ -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()}},在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
|
||||
|
|
@ -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'}
|
|
@ -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
|
|
@ -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"}]
|
|
@ -0,0 +1 @@
|
|||
2023-06-25 22:14:00 | ERROR | 被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
Binary file not shown.
34
Pipfile
34
Pipfile
|
@ -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"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -9,4 +9,4 @@
|
|||
# logger = MyLogger()
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
pass
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)) # []
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: 被连接对象,类型:list、tuple
|
||||
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: 被连接对象,类型:list、tuple
|
||||
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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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", {})
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 or sha1
|
||||
else:
|
||||
request.data = dep_par.replace_dependent_parameter(request.data)
|
||||
if request.encryption:
|
||||
request.data = do_encrypt(request.encryption, request.data) # 数据加密:MD5 or sha1
|
||||
|
||||
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 or sha1
|
||||
else:
|
||||
request.data = dep_par.replace_dependent_parameter(request.data)
|
||||
if request.encryption:
|
||||
request.data = do_encrypt(request.encryption, request.data) # 数据加密:MD5 or sha1
|
||||
|
||||
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
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
'''
|
||||
统一社会信用代码校验
|
||||
国家标准GB32100—2015:18位统一社会信用代码从2015年10月1日正式实行,
|
||||
标准规定统一社会信用代码用18位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)表示,
|
||||
分别是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=其他
|
||||
# 机构类别代码:
|
||||
'''
|
||||
机构编制=1:1=机关 | 2=事业单位 | 3=中央编办直接管理机构编制的群众团体 | 9=其他
|
||||
民政=5:1=社会团体 | 2=民办非企业单位 | 3=基金会 | 9=其他
|
||||
工商=9:1=企业 | 2=个体工商户 | 3=农民专业合作社
|
||||
其他=Y:1=其他
|
||||
'''
|
||||
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):
|
||||
'''
|
||||
统一社会信用代码校验
|
||||
国家标准GB32100—2015:18位统一社会信用代码从2015年10月1日正式实行,
|
||||
标准规定统一社会信用代码用18位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)表示,
|
||||
分别是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=其他
|
||||
# 机构类别代码:
|
||||
'''
|
||||
机构编制=1:1=机关 | 2=事业单位 | 3=中央编办直接管理机构编制的群众团体 | 9=其他
|
||||
民政=5:1=社会团体 | 2=民办非企业单位 | 3=基金会 | 9=其他
|
||||
工商=9:1=企业 | 2=个体工商户 | 3=农民专业合作社
|
||||
其他=Y:1=其他
|
||||
'''
|
||||
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'))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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表示男.
|
||||
|
|
|
@ -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(), "男"))
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"})
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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('警告信息')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:实际值是以期望值结束',
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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: list、dict、str 示例:["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: list、dict、str 示例:["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]")
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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 # 测试主代码脚本
|
|
@ -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.")
|
||||
|
|
|
@ -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()
|
||||
|
|
14
debug/fs.py
14
debug/fs.py
|
@ -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)
|
||||
|
|
|
@ -10,5 +10,4 @@ print("Function called.")
|
|||
|
||||
"""
|
||||
|
||||
|
||||
eval(ss)
|
||||
|
|
65
debug/rt.py
65
debug/rt.py
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
.
|
|
@ -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()
|
||||
|
|
|
@ -12,6 +12,4 @@ __all__ = ["online_function"]
|
|||
|
||||
|
||||
def online_function():
|
||||
pass
|
||||
|
||||
|
||||
pass
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
]
|
|
@ -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
Loading…
Reference in New Issue