钩子函数方式策略
This commit is contained in:
parent
f0e38e9c31
commit
59f636521f
|
@ -4,7 +4,7 @@
|
|||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Pipenv (apitest)" jdkType="Python SDK" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<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="ProjectRootManager" version="2" project-jdk-name="Pipenv (apitest)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (api-test-project)" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,3 @@
|
|||
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,2 +1,53 @@
|
|||
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,358 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>T 接口自动化测试报告</title>
|
||||
<meta name="generator" content="HTMLTestRunner 0.8.2.2"/>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
|
||||
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
|
||||
|
||||
<style type="text/css" media="screen">
|
||||
body { font-family: Microsoft YaHei,Tahoma,arial,helvetica,sans-serif;padding: 20px; font-size: 120%; }
|
||||
table { font-size: 100%; }
|
||||
/* -- heading ---------------------------------------------------------------------- */
|
||||
.heading {
|
||||
margin-top: 0ex;
|
||||
margin-bottom: 1ex;
|
||||
}
|
||||
.heading .description {
|
||||
margin-top: 4ex;
|
||||
margin-bottom: 6ex;
|
||||
}
|
||||
/* -- report ------------------------------------------------------------------------ */
|
||||
#total_row { font-weight: bold; }
|
||||
.passCase { color: #5cb85c; }
|
||||
.failCase { color: #d9534f; font-weight: bold; }
|
||||
.errorCase { color: #f0ad4e; font-weight: bold; }
|
||||
.hiddenRow { display: none; }
|
||||
.testcase { margin-left: 2em; }
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body >
|
||||
<script language="javascript" type="text/javascript">
|
||||
output_list = Array();
|
||||
/*level 调整增加只显示通过用例的分类 --Findyou
|
||||
0:Summary //all hiddenRow
|
||||
1:Failed //pt hiddenRow, ft none
|
||||
2:Pass //pt none, ft hiddenRow
|
||||
3:All //pt none, ft none
|
||||
*/
|
||||
function showCase(level) {
|
||||
trs = document.getElementsByTagName("tr");
|
||||
for (var i = 0; i < trs.length; i++) {
|
||||
tr = trs[i];
|
||||
id = tr.id;
|
||||
if (id.substr(0,2) == 'ft') {
|
||||
if (level == 2 || level == 0 ) {
|
||||
tr.className = 'hiddenRow';
|
||||
}
|
||||
else {
|
||||
tr.className = '';
|
||||
}
|
||||
}
|
||||
if (id.substr(0,2) == 'pt') {
|
||||
if (level < 2) {
|
||||
tr.className = 'hiddenRow';
|
||||
}
|
||||
else {
|
||||
tr.className = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
//加入【详细】切换文字变化 --Findyou
|
||||
detail_class=document.getElementsByClassName('detail');
|
||||
//console.logger(detail_class.length)
|
||||
if (level == 3) {
|
||||
for (var i = 0; i < detail_class.length; i++){
|
||||
detail_class[i].innerHTML="收起"
|
||||
}
|
||||
}
|
||||
else{
|
||||
for (var i = 0; i < detail_class.length; i++){
|
||||
detail_class[i].innerHTML="详细"
|
||||
}
|
||||
}
|
||||
}
|
||||
function showClassDetail(cid, count) {
|
||||
var id_list = Array(count);
|
||||
var toHide = 1;
|
||||
for (var i = 0; i < count; i++) {
|
||||
//ID修改 点 为 下划线 -Findyou
|
||||
tid0 = 't' + cid.substr(1) + '_' + (i+1);
|
||||
tid = 'f' + tid0;
|
||||
tr = document.getElementById(tid);
|
||||
if (!tr) {
|
||||
tid = 'p' + tid0;
|
||||
tr = document.getElementById(tid);
|
||||
}
|
||||
id_list[i] = tid;
|
||||
if (tr.className) {
|
||||
toHide = 0;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < count; i++) {
|
||||
tid = id_list[i];
|
||||
//修改点击无法收起的BUG,加入【详细】切换文字变化 --Findyou
|
||||
if (toHide) {
|
||||
document.getElementById(tid).className = 'hiddenRow';
|
||||
document.getElementById(cid).innerText = "详细"
|
||||
}
|
||||
else {
|
||||
document.getElementById(tid).className = '';
|
||||
document.getElementById(cid).innerText = "收起"
|
||||
}
|
||||
}
|
||||
}
|
||||
function html_escape(s) {
|
||||
s = s.replace(/&/g,'&');
|
||||
s = s.replace(/</g,'<');
|
||||
s = s.replace(/>/g,'>');
|
||||
return s;
|
||||
}
|
||||
</script>
|
||||
<div class='heading'>
|
||||
<h1 style="font-family: Microsoft YaHei">T 接口自动化测试报告</h1>
|
||||
<p class='attribute'><strong>测试人员 : </strong> 陈勇志</p>
|
||||
<p class='attribute'><strong>开始时间 : </strong> 2023-05-14 23:55:35</p>
|
||||
<p class='attribute'><strong>结束时间 : </strong> 2023-05-14 23:55:38.648995</p>
|
||||
<p class='attribute'><strong>合计耗时 : </strong> 0:00:03.095035</p>
|
||||
<p class='attribute'><strong>测试结果 : </strong> 共 7,通过 6,错误 1,通过率= 85.71%</p>
|
||||
|
||||
<p class='description'>接口自动化测试</p>
|
||||
</div>
|
||||
|
||||
|
||||
<p id='show_detail_line'>
|
||||
<a class="btn btn-primary" href='javascript:showCase(0)'>概要{ 85.71% }</a>
|
||||
<a class="btn btn-danger" href='javascript:showCase(1)'>失败{ 0 }</a>
|
||||
<a class="btn btn-success" href='javascript:showCase(2)'>通过{ 6 }</a>
|
||||
<a class="btn btn-info" href='javascript:showCase(3)'>所有{ 7 }</a>
|
||||
</p>
|
||||
<table id='result_table' class="table table-condensed table-bordered table-hover">
|
||||
<colgroup>
|
||||
<col align='left' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
</colgroup>
|
||||
<tr id='header_row' class="text-center success" style="font-weight: bold;font-size: 16px;">
|
||||
<td>用例集/测试用例</td>
|
||||
<td>总计</td>
|
||||
<td>通过</td>
|
||||
<td>失败</td>
|
||||
<td>错误</td>
|
||||
<td>详细</td>
|
||||
</tr>
|
||||
|
||||
<tr class='errorClass warning'>
|
||||
<td>unittest.loader._FailedTest</td>
|
||||
<td class="text-center">1</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center">1</td>
|
||||
<td class="text-center"><a href="javascript:showClassDetail('c1',1)" class="detail" id='c1'>详细</a></td>
|
||||
</tr>
|
||||
|
||||
<tr id='ft1_1' class='none'>
|
||||
<td class='errorCase'><div class='testcase'>test_api</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_ft1_1' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_ft1_1'>错误</button>
|
||||
<div id='div_ft1_1' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_ft1_1' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_ft1_1'>错误</button>
|
||||
<div id='div_ft1_1' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
ft1_1: ImportError: Failed to import test module: script.test_api
|
||||
Traceback (most recent call last):
|
||||
File "D:\python\lib\unittest\loader.py", line 436, in _find_test_path
|
||||
module = self._get_module_from_name(name)
|
||||
File "D:\python\lib\unittest\loader.py", line 377, in _get_module_from_name
|
||||
__import__(name)
|
||||
File "E:\apitest\test_script\script\test_api.py", line 12, in <module>
|
||||
from test_script.script.baseclass import BaseClass
|
||||
ModuleNotFoundError: No module named 'test_script.script'
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr class='passClass warning'>
|
||||
<td>test_script.test_standard.TestProjectApi</td>
|
||||
<td class="text-center">6</td>
|
||||
<td class="text-center">6</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center"><a href="javascript:showClassDetail('c2',6)" class="detail" id='c2'>详细</a></td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_1' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_1</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_1' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_1'>通过</button>
|
||||
<div id='div_pt2_1' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_1' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_1'>通过</button>
|
||||
<div id='div_pt2_1' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_1: 2023-05-14 23:55:35,556-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:1 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_2' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_2</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_2' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_2'>通过</button>
|
||||
<div id='div_pt2_2' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_2' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_2'>通过</button>
|
||||
<div id='div_pt2_2' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_2: 2023-05-14 23:55:35,557-INFO-logger.py-[ line:64 ] - 日志信息:sql 执行成功:None
|
||||
2023-05-14 23:55:35,558-INFO-logger.py-[ line:64 ] - 日志信息:当前用例所在的 sheet --> 安全纯净大屏
|
||||
2023-05-14 23:55:35,559-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --> None
|
||||
2023-05-14 23:55:35,559-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 -->
|
||||
2023-05-14 23:55:35,646-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
|
||||
2023-05-14 23:55:35,648-INFO-logger.py-[ line:64 ] - 日志信息:请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '214'}
|
||||
2023-05-14 23:55:35,649-INFO-logger.py-[ line:64 ] - 日志信息:请求 body --> b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
|
||||
2023-05-14 23:55:35,651-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 200
|
||||
2023-05-14 23:55:35,653-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 0:00:00.077493
|
||||
2023-05-14 23:55:35,684-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":"0","type":"success","data":{"id":"216840797353495059","userId":"216483504447804297","ibsUserId":7884,"mobile":"18127813600","bspToken":"3e879e608a47fe7252a34f08e60f27f1","type":"user","avatar":null,"ncAccount":null,"timestamp":1684079735,"idpTokenId":null,"loginChannel":null,"clientType":null,"name":"陈勇志","btpToken":null,"account":"18127813600","accountType":"C","currentEnvId":null,"currentTenantId":"216317749963825419","currentAppId":"8d1f5bdc9c6648af84a98e2c017846c5","currentProjectId":"104966","currentOrgId":null,"currentMenuId":null,"currentOrgMenuId":null,"currentSelectedTab":"org","currentUrl":"/ibs/material/order","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}
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_3' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_3</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_3' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_3'>通过</button>
|
||||
<div id='div_pt2_3' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_3' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_3'>通过</button>
|
||||
<div id='div_pt2_3' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_3: 2023-05-14 23:55:36,661-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:3 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_4' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_4</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_4' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_4'>通过</button>
|
||||
<div id='div_pt2_4' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_4' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_4'>通过</button>
|
||||
<div id='div_pt2_4' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_4: 2023-05-14 23:55:36,662-INFO-logger.py-[ line:64 ] - 日志信息:sql 执行成功:None
|
||||
2023-05-14 23:55:36,663-INFO-logger.py-[ line:64 ] - 日志信息:执行方法:get_timestamp(13)
|
||||
2023-05-14 23:55:36,705-INFO-logger.py-[ line:64 ] - 日志信息:当前用例所在的 sheet --> 安全纯净大屏
|
||||
2023-05-14 23:55:36,706-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --> None
|
||||
2023-05-14 23:55:36,707-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 -->
|
||||
2023-05-14 23:55:36,779-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1684079736663
|
||||
2023-05-14 23:55:36,781-INFO-logger.py-[ line:64 ] - 日志信息:请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '3e879e608a47fe7252a34f08e60f27f1', 'BSP_USER_TENANT': '216317749963825419', 'Content-Length': '61'}
|
||||
2023-05-14 23:55:36,782-INFO-logger.py-[ line:64 ] - 日志信息:请求 body --> b'{"projectId": "104966", "tvSequence": "nNNGLktZIGgeRgwzkjAX"}'
|
||||
2023-05-14 23:55:36,784-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 200
|
||||
2023-05-14 23:55:36,786-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 0:00:00.069166
|
||||
2023-05-14 23:55:36,788-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":200,"success":true,"data":null,"msg":"添加成功"}
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_5' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_5</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_5' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_5'>通过</button>
|
||||
<div id='div_pt2_5' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_5' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_5'>通过</button>
|
||||
<div id='div_pt2_5' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_5: 2023-05-14 23:55:37,710-INFO-logger.py-[ line:64 ] - 日志信息:sql 执行成功:None
|
||||
2023-05-14 23:55:37,711-INFO-logger.py-[ line:64 ] - 日志信息:执行方法:get_timestamp(13)
|
||||
2023-05-14 23:55:37,711-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
||||
2023-05-14 23:55:37,713-INFO-logger.py-[ line:64 ] - 日志信息:当前用例所在的 sheet --> 安全纯净大屏
|
||||
2023-05-14 23:55:37,715-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --> None
|
||||
2023-05-14 23:55:37,716-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 -->
|
||||
2023-05-14 23:55:37,749-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1684079737711&projectId=104966
|
||||
2023-05-14 23:55:37,750-INFO-logger.py-[ line:64 ] - 日志信息:请求头 --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '3e879e608a47fe7252a34f08e60f27f1', 'BSP_USER_TENANT': '216317749963825419'}
|
||||
2023-05-14 23:55:37,751-INFO-logger.py-[ line:64 ] - 日志信息:请求 body --> None
|
||||
2023-05-14 23:55:37,751-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 200
|
||||
2023-05-14 23:55:37,752-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 0:00:00.028120
|
||||
2023-05-14 23:55:37,753-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":200,"success":true,"data":{"id":"1637650408413749249","projectId":"104966","shortInfo":"博智林提醒您:一切不能保证安全、质量的施工都要停工!进入工地,请佩戴安全帽,穿着反光衣,文明作业!","qrCode":"https://ibs-test.bzlrobot.com/api/ibs-file/document/get/MjAyMS0xMC0xOCxQSE9UT18yMDIxMTAxOF8wOTMxMDExMDIuanBnLDA0ZGQxOWU5YzA3MjQ0YjE5OTIwNzZjOTUxNzY4YzQ1","manageDeparts":[]},"msg":"操作成功"}
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt2_6' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_6</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt2_6' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt2_6'>通过</button>
|
||||
<div id='div_pt2_6' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt2_6' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt2_6'>通过</button>
|
||||
<div id='div_pt2_6' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt2_6: 2023-05-14 23:55:38,647-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:None 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='total_row' class="text-center active">
|
||||
<td>总计</td>
|
||||
<td>7</td>
|
||||
<td>6</td>
|
||||
<td>0</td>
|
||||
<td>1</td>
|
||||
<td>通过率:85.71%</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id='ending'> </div>
|
||||
<div style=" position:fixed;right:50px; bottom:30px; width:20px; height:20px;cursor:pointer">
|
||||
<a href="#"><span class="glyphicon glyphicon-eject" style = "font-size:30px;" aria-hidden="true">
|
||||
</span></a></div>
|
||||
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
|
@ -1 +1 @@
|
|||
[{"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": 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"}]
|
|
@ -223,17 +223,17 @@
|
|||
<div class="info">
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm">开始时间</button>
|
||||
<span>2023-06-14 15:16:14</span>
|
||||
<span>2023-06-16 16:36:00</span>
|
||||
</div>
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm">用例总数</button>
|
||||
<span>1</span>
|
||||
<span>6</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm">运行时长</button>
|
||||
<span>0.00 S</span>
|
||||
<span>6.32 S</span>
|
||||
</div>
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm ">测试人员</button>
|
||||
|
@ -243,11 +243,11 @@
|
|||
<div class="info">
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm">成功用例</button>
|
||||
<span>0</span>
|
||||
<span>6</span>
|
||||
</div>
|
||||
<div style="flex:5">
|
||||
<button type="button" class="btn btn-primary btn-sm ">通过率</button>
|
||||
<span>0.00%</span>
|
||||
<span>100.00%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -272,6 +272,41 @@
|
|||
</thead>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-16 16:36:00</th>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>100.00%</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-16 16:32:32</th>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>100.00%</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-16 16:30:50</th>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>100.00%</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-16 16:26:52</th>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>100.00%</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-16 16:22:27</th>
|
||||
<td>82</td>
|
||||
<td>82</td>
|
||||
<td>100.00%</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th scope="row">2023-06-14 15:16:14</th>
|
||||
<td>1</td>
|
||||
|
@ -413,7 +448,7 @@
|
|||
<select id="testClass">
|
||||
<option>所有</option>
|
||||
|
||||
<option>_FailedTest</option>
|
||||
<option>TestProjectApi</option>
|
||||
|
||||
</select>
|
||||
|
||||
|
@ -440,12 +475,12 @@
|
|||
|
||||
<tr class="case_">
|
||||
<td>1</td>
|
||||
<td class="_FailedTest">_FailedTest</td>
|
||||
<td>test_api</td>
|
||||
<td>None</td>
|
||||
<td>0.000998s</td>
|
||||
<td class="TestProjectApi">TestProjectApi</td>
|
||||
<td>test_api_1_清表</td>
|
||||
<td>初始化查询sql</td>
|
||||
<td>0.000996s</td>
|
||||
|
||||
<td class="text-danger">错误</td>
|
||||
<td class="text-success">成功</td>
|
||||
|
||||
<td>
|
||||
<button type="button" class="btn btn_info btn-primary btn-sm">查看详情</button>
|
||||
|
@ -457,44 +492,158 @@
|
|||
<td colspan="7" class="small text-muted" style=" word-wrap:break-word; word-break:break-all">
|
||||
|
||||
|
||||
<pre>Traceback (most recent call last):
|
||||
<pre>test_api_1_清表 (test_api.TestProjectApi)执行——>【通过】
|
||||
</pre>
|
||||
|
||||
|
||||
<pre> File "D:\Program Files\python39\lib\unittest\case.py", line 59, in testPartExecutor
|
||||
yield
|
||||
</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>
|
||||
|
||||
|
||||
<pre> File "D:\Program Files\python39\lib\unittest\case.py", line 593, in run
|
||||
self._callTestMethod(testMethod)
|
||||
</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>
|
||||
|
||||
|
||||
<pre> File "D:\Program Files\python39\lib\unittest\case.py", line 550, in _callTestMethod
|
||||
method()
|
||||
</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>
|
||||
|
||||
|
||||
<pre> File "D:\Program Files\python39\lib\unittest\loader.py", line 34, in testFailure
|
||||
raise self._exception
|
||||
</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>
|
||||
|
||||
|
||||
<pre>ImportError: Failed to import test module: test_api
|
||||
Traceback (most recent call last):
|
||||
File "D:\Program Files\python39\lib\unittest\loader.py", line 436, in _find_test_path
|
||||
module = self._get_module_from_name(name)
|
||||
File "D:\Program Files\python39\lib\unittest\loader.py", line 377, in _get_module_from_name
|
||||
__import__(name)
|
||||
File "D:\apk_api\api-test-project\test_script\automation\test_api.py", line 26, in <module>
|
||||
excel_handle, init_data, test_case = get_init(test_file)
|
||||
TypeError: cannot unpack non-iterable NoneType object
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</pre>
|
||||
<tr class="case_">
|
||||
<td>6</td>
|
||||
<td class="TestProjectApi">TestProjectApi</td>
|
||||
<td>test_api_6_None</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 (unittest.loader._FailedTest)执行——>【错误Error】
|
||||
<pre>test_api_6_None (test_api.TestProjectApi)执行——>【通过】
|
||||
</pre>
|
||||
|
||||
|
||||
|
@ -514,17 +663,17 @@ TypeError: cannot unpack non-iterable NoneType object
|
|||
<script type="text/javascript">
|
||||
|
||||
const resulte = {
|
||||
"success": `0`,
|
||||
"all": `1`,
|
||||
"success": `6`,
|
||||
"all": `6`,
|
||||
"fail": `0`,
|
||||
"skip": '0',
|
||||
"error": `1`,
|
||||
"runtime": '0.00 S',
|
||||
"begin_time": "0.00 S",
|
||||
"pass_rate": '0.00',
|
||||
"error": `0`,
|
||||
"runtime": '6.32 S',
|
||||
"begin_time": "6.32 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'}];
|
||||
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'}];
|
||||
|
||||
var passRate = [];
|
||||
var dTime = [];
|
||||
|
|
|
@ -1,314 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>test_api 接口自动化测试报告</title>
|
||||
<meta name="generator" content="HTMLTestRunner 0.8.2.2"/>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
|
||||
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
|
||||
|
||||
<style type="text/css" media="screen">
|
||||
body { font-family: Microsoft YaHei,Tahoma,arial,helvetica,sans-serif;padding: 20px; font-size: 120%; }
|
||||
table { font-size: 100%; }
|
||||
/* -- heading ---------------------------------------------------------------------- */
|
||||
.heading {
|
||||
margin-top: 0ex;
|
||||
margin-bottom: 1ex;
|
||||
}
|
||||
.heading .description {
|
||||
margin-top: 4ex;
|
||||
margin-bottom: 6ex;
|
||||
}
|
||||
/* -- report ------------------------------------------------------------------------ */
|
||||
#total_row { font-weight: bold; }
|
||||
.passCase { color: #5cb85c; }
|
||||
.failCase { color: #d9534f; font-weight: bold; }
|
||||
.errorCase { color: #f0ad4e; font-weight: bold; }
|
||||
.hiddenRow { display: none; }
|
||||
.testcase { margin-left: 2em; }
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body >
|
||||
<script language="javascript" type="text/javascript">
|
||||
output_list = Array();
|
||||
/*level 调整增加只显示通过用例的分类 --Findyou
|
||||
0:Summary //all hiddenRow
|
||||
1:Failed //pt hiddenRow, ft none
|
||||
2:Pass //pt none, ft hiddenRow
|
||||
3:All //pt none, ft none
|
||||
*/
|
||||
function showCase(level) {
|
||||
trs = document.getElementsByTagName("tr");
|
||||
for (var i = 0; i < trs.length; i++) {
|
||||
tr = trs[i];
|
||||
id = tr.id;
|
||||
if (id.substr(0,2) == 'ft') {
|
||||
if (level == 2 || level == 0 ) {
|
||||
tr.className = 'hiddenRow';
|
||||
}
|
||||
else {
|
||||
tr.className = '';
|
||||
}
|
||||
}
|
||||
if (id.substr(0,2) == 'pt') {
|
||||
if (level < 2) {
|
||||
tr.className = 'hiddenRow';
|
||||
}
|
||||
else {
|
||||
tr.className = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
//加入【详细】切换文字变化 --Findyou
|
||||
detail_class=document.getElementsByClassName('detail');
|
||||
//console.logger(detail_class.length)
|
||||
if (level == 3) {
|
||||
for (var i = 0; i < detail_class.length; i++){
|
||||
detail_class[i].innerHTML="收起"
|
||||
}
|
||||
}
|
||||
else{
|
||||
for (var i = 0; i < detail_class.length; i++){
|
||||
detail_class[i].innerHTML="详细"
|
||||
}
|
||||
}
|
||||
}
|
||||
function showClassDetail(cid, count) {
|
||||
var id_list = Array(count);
|
||||
var toHide = 1;
|
||||
for (var i = 0; i < count; i++) {
|
||||
//ID修改 点 为 下划线 -Findyou
|
||||
tid0 = 't' + cid.substr(1) + '_' + (i+1);
|
||||
tid = 'f' + tid0;
|
||||
tr = document.getElementById(tid);
|
||||
if (!tr) {
|
||||
tid = 'p' + tid0;
|
||||
tr = document.getElementById(tid);
|
||||
}
|
||||
id_list[i] = tid;
|
||||
if (tr.className) {
|
||||
toHide = 0;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < count; i++) {
|
||||
tid = id_list[i];
|
||||
//修改点击无法收起的BUG,加入【详细】切换文字变化 --Findyou
|
||||
if (toHide) {
|
||||
document.getElementById(tid).className = 'hiddenRow';
|
||||
document.getElementById(cid).innerText = "详细"
|
||||
}
|
||||
else {
|
||||
document.getElementById(tid).className = '';
|
||||
document.getElementById(cid).innerText = "收起"
|
||||
}
|
||||
}
|
||||
}
|
||||
function html_escape(s) {
|
||||
s = s.replace(/&/g,'&');
|
||||
s = s.replace(/</g,'<');
|
||||
s = s.replace(/>/g,'>');
|
||||
return s;
|
||||
}
|
||||
</script>
|
||||
<div class='heading'>
|
||||
<h1 style="font-family: Microsoft YaHei">test_api 接口自动化测试报告</h1>
|
||||
<p class='attribute'><strong>测试人员 : </strong> 陈勇志</p>
|
||||
<p class='attribute'><strong>开始时间 : </strong> 2023-05-14 23:30:25</p>
|
||||
<p class='attribute'><strong>结束时间 : </strong> 2023-05-14 23:30:25.356895</p>
|
||||
<p class='attribute'><strong>合计耗时 : </strong> 0:00:00.205350</p>
|
||||
<p class='attribute'><strong>测试结果 : </strong> 共 6,通过 6,通过率= 100.00%</p>
|
||||
|
||||
<p class='description'>接口自动化测试</p>
|
||||
</div>
|
||||
|
||||
|
||||
<p id='show_detail_line'>
|
||||
<a class="btn btn-primary" href='javascript:showCase(0)'>概要{ 100.00% }</a>
|
||||
<a class="btn btn-danger" href='javascript:showCase(1)'>失败{ 0 }</a>
|
||||
<a class="btn btn-success" href='javascript:showCase(2)'>通过{ 6 }</a>
|
||||
<a class="btn btn-info" href='javascript:showCase(3)'>所有{ 6 }</a>
|
||||
</p>
|
||||
<table id='result_table' class="table table-condensed table-bordered table-hover">
|
||||
<colgroup>
|
||||
<col align='left' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
<col align='right' />
|
||||
</colgroup>
|
||||
<tr id='header_row' class="text-center success" style="font-weight: bold;font-size: 16px;">
|
||||
<td>用例集/测试用例</td>
|
||||
<td>总计</td>
|
||||
<td>通过</td>
|
||||
<td>失败</td>
|
||||
<td>错误</td>
|
||||
<td>详细</td>
|
||||
</tr>
|
||||
|
||||
<tr class='passClass warning'>
|
||||
<td>test_api.TestProjectApi</td>
|
||||
<td class="text-center">6</td>
|
||||
<td class="text-center">6</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center">0</td>
|
||||
<td class="text-center"><a href="javascript:showClassDetail('c1',6)" class="detail" id='c1'>详细</a></td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_1' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_1</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_1' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_1'>通过</button>
|
||||
<div id='div_pt1_1' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_1' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_1'>通过</button>
|
||||
<div id='div_pt1_1' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_1: 2023-05-14 23:30:25,155-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:1 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_2' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_2</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_2' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_2'>通过</button>
|
||||
<div id='div_pt1_2' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_2' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_2'>通过</button>
|
||||
<div id='div_pt1_2' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_2: 2023-05-14 23:30:25,156-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
||||
2023-05-14 23:30:25,217-INFO-logger.py-[ line:64 ] - 日志信息:请求 URL --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
|
||||
2023-05-14 23:30:25,218-INFO-logger.py-[ line:64 ] - 日志信息:请求 HEADERS --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Content-Length': '0'}
|
||||
2023-05-14 23:30:25,219-INFO-logger.py-[ line:64 ] - 日志信息:请求 BODY --> None
|
||||
2023-05-14 23:30:25,220-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 【0:00:00.054099】
|
||||
2023-05-14 23:30:25,221-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 【200】
|
||||
2023-05-14 23:30:25,223-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":"AG_500","type":null,"data":null,"msg":"服务器内部错误.","showType":2,"formMsg":null,"succeed":false}
|
||||
2023-05-14 23:30:25,224-INFO-logger.py-[ line:64 ] - 日志信息:断言结果组:
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_3' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_3</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_3' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_3'>通过</button>
|
||||
<div id='div_pt1_3' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_3' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_3'>通过</button>
|
||||
<div id='div_pt1_3' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_3: 2023-05-14 23:30:25,255-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:3 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_4' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_4</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_4' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_4'>通过</button>
|
||||
<div id='div_pt1_4' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_4' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_4'>通过</button>
|
||||
<div id='div_pt1_4' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_4: 2023-05-14 23:30:25,256-INFO-logger.py-[ line:64 ] - 日志信息:执行方法:get_timestamp(13)
|
||||
2023-05-14 23:30:25,257-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
||||
2023-05-14 23:30:25,310-INFO-logger.py-[ line:64 ] - 日志信息:请求 URL --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/addTvSequence?t=1684078225257
|
||||
2023-05-14 23:30:25,310-INFO-logger.py-[ line:64 ] - 日志信息:请求 HEADERS --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '[]', 'BSP_USER_TENANT': '[]', 'Content-Length': '0'}
|
||||
2023-05-14 23:30:25,311-INFO-logger.py-[ line:64 ] - 日志信息:请求 BODY --> None
|
||||
2023-05-14 23:30:25,312-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 【0:00:00.049025】
|
||||
2023-05-14 23:30:25,313-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 【200】
|
||||
2023-05-14 23:30:25,314-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":"AG_100003","msg":"您的登陆状态已过期,请重新登陆。","showType":2,"succeed":false}
|
||||
2023-05-14 23:30:25,314-INFO-logger.py-[ line:64 ] - 日志信息:断言结果组:
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_5' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_5</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_5' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_5'>通过</button>
|
||||
<div id='div_pt1_5' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_5' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_5'>通过</button>
|
||||
<div id='div_pt1_5' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_5: 2023-05-14 23:30:25,315-INFO-logger.py-[ line:64 ] - 日志信息:执行方法:get_timestamp(13)
|
||||
2023-05-14 23:30:25,316-INFO-logger.py-[ line:64 ] - 日志信息:被提取对象非字典、非字符串、非列表,不执行jsonpath提取,被提取对象: None
|
||||
2023-05-14 23:30:25,349-INFO-logger.py-[ line:64 ] - 日志信息:请求 URL --> https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1684078225316&projectId=104966
|
||||
2023-05-14 23:30:25,350-INFO-logger.py-[ line:64 ] - 日志信息:请求 HEADERS --> {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json;charset=utf-8', 'BSP_TOKEN': '[]', 'BSP_USER_TENANT': '[]'}
|
||||
2023-05-14 23:30:25,351-INFO-logger.py-[ line:64 ] - 日志信息:请求 BODY --> None
|
||||
2023-05-14 23:30:25,351-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--> 【0:00:00.030915】
|
||||
2023-05-14 23:30:25,352-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--> 【200】
|
||||
2023-05-14 23:30:25,353-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--> {"code":"AG_100003","msg":"您的登陆状态已过期,请重新登陆。","showType":2,"succeed":false}
|
||||
2023-05-14 23:30:25,354-INFO-logger.py-[ line:64 ] - 日志信息:断言结果组:
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='pt1_6' class='hiddenRow'>
|
||||
<td class='passCase'><div class='testcase'>test_api_6</div></td>
|
||||
<td colspan='5' align='center'>
|
||||
<!--默认收起错误信息 -Findyou
|
||||
<button id='btn_pt1_6' type="button" class="btn btn-danger btn-xs collapsed" data-toggle="collapse" data-target='#div_pt1_6'>通过</button>
|
||||
<div id='div_pt1_6' class="collapse"> -->
|
||||
<!-- 默认展开错误信息 -Findyou -->
|
||||
<button id='btn_pt1_6' type="button" class="btn btn btn-info btn-xs" data-toggle="collapse" data-target='#div_pt1_6'>通过</button>
|
||||
<div id='div_pt1_6' class="collapse" align="left">
|
||||
<pre>
|
||||
|
||||
pt1_6: 2023-05-14 23:30:25,355-ERROR-logger.py-[ line:62 ] - 日志信息:测试用例:None 不执行,跳过!!!
|
||||
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id='total_row' class="text-center active">
|
||||
<td>总计</td>
|
||||
<td>6</td>
|
||||
<td>6</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>通过率:100.00%</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id='ending'> </div>
|
||||
<div style=" position:fixed;right:50px; bottom:30px; width:20px; height:20px;cursor:pointer">
|
||||
<a href="#"><span class="glyphicon glyphicon-eject" style = "font-size:30px;" aria-hidden="true">
|
||||
</span></a></div>
|
||||
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -10,12 +10,12 @@ class Config:
|
|||
# 测试数据所在路径
|
||||
# *****************************************************************
|
||||
templates = os.path.join(base_path, "cases", "templates", "template.xlsx") # 模板文件
|
||||
test_api = os.path.join(base_path, "cases", "cases", "test_api.xlsx")
|
||||
test_api = os.path.join(base_path, "cases", "cases", "test_cases.xlsx")
|
||||
# *****************************************************************
|
||||
|
||||
# 测试用例脚本目录
|
||||
# *****************************************************************
|
||||
script = os.path.join(base_path, "test_script", 'automation')
|
||||
script = os.path.join(base_path, "test_script")
|
||||
# *****************************************************************
|
||||
|
||||
# 测试报告及 logger 所在路径
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: encrypt_data.py
|
||||
@time: 2023/6/16 15:43
|
||||
@desc:
|
||||
"""
|
||||
from common.crypto import logger
|
||||
from common.crypto.encryption_rsa import Rsa
|
||||
from extensions import sign
|
||||
|
||||
|
||||
@logger.log_decorator()
|
||||
def encrypt_data(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
|
|
@ -6,8 +6,8 @@
|
|||
# @Project : risk_project
|
||||
import sys
|
||||
|
||||
sys.path.append("../")
|
||||
sys.path.append("./common")
|
||||
sys.path.append("../../")
|
||||
sys.path.append("../../common")
|
||||
from openpyxl import load_workbook
|
||||
from common.utils.singleton import singleton
|
||||
from common.file_handling import logger
|
||||
|
@ -46,7 +46,7 @@ class DoExcel:
|
|||
test_data.append(sub_data) # 将所有单元格 title 对应的值组成字典添加到列表中。
|
||||
return test_data
|
||||
|
||||
@logger.log_decorator()
|
||||
# @logger.log_decorator()
|
||||
def do_excel_yield(self):
|
||||
"""
|
||||
读取excel数据的生成器
|
||||
|
@ -84,9 +84,9 @@ class DoExcel:
|
|||
test_result = kwargs.get("test_result")
|
||||
assert_log = kwargs.get("assert_log")
|
||||
sheet = self.wb[sheet_name]
|
||||
sheet.cell(i + 1, 19).value = response_value
|
||||
sheet.cell(i + 1, 20).value = test_result
|
||||
sheet.cell(i + 1, 21).value = assert_log
|
||||
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()
|
||||
|
@ -102,9 +102,9 @@ class DoExcel:
|
|||
sheet = self.wb[sheet_name]
|
||||
max_row = sheet.max_row # 获取最大行
|
||||
for i in range(2, max_row + 1):
|
||||
sheet.cell(i, 19).value = ""
|
||||
sheet.cell(i, 20).value = ""
|
||||
sheet.cell(i, 21).value = ""
|
||||
sheet.cell(i, 22).value = ""
|
||||
sheet.cell(i, 23).value = ""
|
||||
sheet.cell(i, 24).value = ""
|
||||
self.wb.save(self.file_name)
|
||||
return "清空指定 sheet 中的单元格成功"
|
||||
|
||||
|
@ -127,8 +127,8 @@ class DoExcel:
|
|||
break
|
||||
return init
|
||||
|
||||
def __del__(self):
|
||||
self.wb.close()
|
||||
# def __del__(self):
|
||||
# self.wb.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -19,14 +19,14 @@ def log_decorator(msg="请求异常"):
|
|||
def decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
try:
|
||||
logger.info(f"发送请求的参数: {kwargs}")
|
||||
print(f"发送请求的参数: {kwargs}")
|
||||
response = func(*args, **kwargs)
|
||||
logger.info(f"请求地址 --> {response.request.url}")
|
||||
logger.info(f"请求头 --> {response.request.headers}")
|
||||
logger.info(f"请求 body --> {response.request.body}")
|
||||
logger.info(f"接口状态--> {response.status_code}")
|
||||
logger.info(f"接口耗时--> {response.elapsed}")
|
||||
logger.info(f"接口响应--> {response.text}")
|
||||
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}")
|
||||
|
@ -77,5 +77,5 @@ if __name__ == '__main__':
|
|||
method = 'post'
|
||||
kwargs = {
|
||||
'json': '{"account": "luoshunwen005", "grantType": "password", "isBip": "false","password": "o+t2SnEEylblxlfIspJUvGFa0gCDNrU2dC34LjVFqIiTmxa855YDBE/6J7eRVBGaQwR7mozSKComk9n6kjSNRjSX1m574dRZdESIeYsmM/xk2Nt5n5dqB268qCMivJMXpHQMygpT4RpDiYoOiEqlOi9eG5G7v/5rixHiZ9xv98m34xVD1VdlaCbphoB9JI7T9HmVFJniSWt01ruC5t+aFUvfxLjOpRmYmfz8GwtSd5XXKaKr29ce1C39Fg+PtqOkQ3cOLVS9hXgzz6s2zud0++T4vwgVtrHx86aMrrozhCdKzrQuWPEO1cSsaEaNVdSUsT54je+4O+xKzxkJhoGMnQ=="}',
|
||||
'headers': '{"Content-Type": "application/json"}'}
|
||||
'headers': None}
|
||||
http_client(hst, url, method, **kwargs)
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
@time: 2023/3/15 11:14
|
||||
@desc:
|
||||
"""
|
||||
import sys
|
||||
|
||||
sys.path.append('../../common')
|
||||
|
||||
from common.utils.mylogger import MyLogger
|
||||
|
||||
|
||||
logger = MyLogger()
|
||||
|
|
|
@ -3,14 +3,18 @@ import os
|
|||
import sys
|
||||
|
||||
sys.path.append('../../common')
|
||||
from common.utils import logger
|
||||
sys.path.append('../../common/utils')
|
||||
|
||||
from common.utils.mylogger import MyLogger
|
||||
|
||||
logger = MyLogger()
|
||||
|
||||
|
||||
class ScriptNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
@logger.log_decorator()
|
||||
# @logger.log_decorator()
|
||||
def load_script(script_path):
|
||||
"""
|
||||
加载脚本文件并返回模块对象
|
||||
|
|
6
run.py
6
run.py
|
@ -17,15 +17,15 @@ from unittestreport import TestRunner
|
|||
from common.utils.WxworkSms import WxWorkSms
|
||||
|
||||
|
||||
def main():
|
||||
def run():
|
||||
test_report = Config.test_report
|
||||
print(f"当前测试报告路劲: {test_report},测试脚本路劲: {Config.script}")
|
||||
test_case = unittest.defaultTestLoader.discover(Config.script, pattern="test_*.py")
|
||||
runner = TestRunner(test_case, report_dir=test_report, title="接口自动化测试报告", templates=2,
|
||||
tester="kira", desc="自动化测试")
|
||||
runner.main()
|
||||
runner.run()
|
||||
WxWorkSms('8b1647d4-dc32-447c-b524-548acf18a938').send_main(test_report, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
run()
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
def setup(request):
|
||||
print(f"执行前置代码片段处理:{request}")
|
||||
# print(f"执行前置代码片段处理:{request}")
|
||||
"""处理请求对象的逻辑代码"""
|
||||
return request
|
||||
|
||||
|
||||
def teardown(response):
|
||||
print(f"执行后置代码片段处理:{response}")
|
||||
# print(f"执行后置代码片段处理:{response.text}")
|
||||
"""处理响应对象的逻辑代码"""
|
||||
return response
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: __init__.py.py
|
||||
@time: 2023/6/13 16:09
|
||||
@desc:
|
||||
"""
|
|
@ -1,52 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: api.py
|
||||
@time: 2023/6/13 16:09
|
||||
@desc:
|
||||
"""
|
||||
import os
|
||||
|
||||
# api.py
|
||||
# 这是一个api模块的示例
|
||||
# 可以定义一些api相关的类或方法
|
||||
|
||||
import config
|
||||
import requests
|
||||
|
||||
|
||||
class Api:
|
||||
|
||||
def __init__(self):
|
||||
# 初始化一些属性或参数
|
||||
self.session = requests.Session()
|
||||
|
||||
def run_script(self, script_name, pm):
|
||||
# 定义一个方法,用来执行指定的脚本代码
|
||||
|
||||
# 拼接脚本文件的完整路径
|
||||
script_path = os.path.join(config.SCRIPTS_DIR, script_name)
|
||||
|
||||
# 打开脚本文件,并读取内容
|
||||
with open(script_path, "r", encoding="utf-8") as f:
|
||||
script_content = f.read()
|
||||
|
||||
# 使用exec函数来执行脚本代码,并传递pm对象作为局部变量
|
||||
exec(script_content, {}, {"pm": pm})
|
||||
|
||||
|
||||
class PM:
|
||||
|
||||
def __init__(self):
|
||||
# 初始化一些属性或参数
|
||||
self.url = None
|
||||
self.params = None
|
||||
self.status_code = None
|
||||
self.content = None
|
||||
self.data = None
|
||||
|
||||
def print(self, message):
|
||||
# 定义一个方法,用来打印一些信息
|
||||
print(message)
|
|
@ -1,20 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: config.py
|
||||
@time: 2023/6/13 16:15
|
||||
@desc:
|
||||
"""
|
||||
# config.py
|
||||
# 这是一个配置文件的示例
|
||||
# 可以定义一些常量或变量
|
||||
|
||||
import os
|
||||
|
||||
# 定义项目根目录的路径
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# 定义scripts文件夹的路径
|
||||
SCRIPTS_DIR = os.path.join(BASE_DIR, "scripts")
|
|
@ -0,0 +1,126 @@
|
|||
import json
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
class Hooks:
|
||||
def __init__(self):
|
||||
self.before_request_funcs = {}
|
||||
self.after_request_funcs = {}
|
||||
|
||||
def before_request(self, func):
|
||||
"""
|
||||
注册 before_request 钩子函数
|
||||
"""
|
||||
self.before_request_funcs[func.__name__] = func
|
||||
return func
|
||||
|
||||
def after_request(self, func):
|
||||
"""
|
||||
注册 after_request 钩子函数
|
||||
"""
|
||||
self.after_request_funcs[func.__name__] = func
|
||||
return func
|
||||
|
||||
def run_before_request_hooks(self, func_names, request, json_data):
|
||||
"""
|
||||
执行 before_request 钩子函数
|
||||
"""
|
||||
for func_name in func_names:
|
||||
if func_name in self.before_request_funcs:
|
||||
func = self.before_request_funcs[func_name]
|
||||
json_data = func(request, json_data)
|
||||
return json_data
|
||||
|
||||
def run_after_request_hooks(self, func_names, response):
|
||||
"""
|
||||
执行 after_request 钩子函数
|
||||
"""
|
||||
for func_name in func_names:
|
||||
if func_name in self.after_request_funcs:
|
||||
func = self.after_request_funcs[func_name]
|
||||
response = func(response)
|
||||
return response
|
||||
|
||||
|
||||
hooks = Hooks()
|
||||
session = requests.Session()
|
||||
|
||||
|
||||
def req(url, method, **kwargs):
|
||||
"""
|
||||
发送请求并返回响应对象
|
||||
"""
|
||||
before_hooks = kwargs.pop('before_hooks', [])
|
||||
after_hooks = kwargs.pop('after_hooks', [])
|
||||
json_data = kwargs.pop('json', {})
|
||||
|
||||
request = requests.Request(method=method, url=url, **kwargs)
|
||||
prepared_request = session.prepare_request(request)
|
||||
|
||||
json_data = hooks.run_before_request_hooks(before_hooks, prepared_request, json_data)
|
||||
prepared_request.body = json.dumps(json_data)
|
||||
response = session.send(prepared_request)
|
||||
response = hooks.run_after_request_hooks(after_hooks, response)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def add_authentication_headers(request, json_data):
|
||||
"""
|
||||
添加认证头信息
|
||||
"""
|
||||
print("前置钩子函数,添加认证头信息", request)
|
||||
request.headers["Authorization"] = "Bearer YOUR_AUTH_TOKEN"
|
||||
return json_data
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def handle_dependent_parameters(request, json_data):
|
||||
"""
|
||||
处理依赖参数
|
||||
"""
|
||||
print("前置钩子函数,处理依赖参数", request)
|
||||
|
||||
json_data["verification_code"] = get_verification_code()
|
||||
return json_data
|
||||
|
||||
|
||||
def get_verification_code():
|
||||
# 实现获取验证码的逻辑
|
||||
return "YOUR_VERIFICATION_CODE"
|
||||
|
||||
|
||||
@hooks.after_request
|
||||
def after_dependent_parameters(request, json_data):
|
||||
"""
|
||||
处理后置
|
||||
"""
|
||||
print("后置钩子函数,处理依赖参数", request)
|
||||
|
||||
return json_data
|
||||
|
||||
|
||||
def test_user_registration():
|
||||
url = "http://jsonplaceholder.typicode.com/posts"
|
||||
data = {
|
||||
"userId": "testuser",
|
||||
"title": "password123",
|
||||
"body": "测试玩家勇哥"
|
||||
}
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
before_hooks = [add_authentication_headers.__name__, handle_dependent_parameters.__name__]
|
||||
after_hooks = [after_dependent_parameters.__name__]
|
||||
kwargs = {"json": data, "headers": headers}
|
||||
|
||||
return req(url, "post", before_hooks=before_hooks, after_hooks=after_hooks, **kwargs)
|
||||
# assert response.status_code == 200
|
||||
# assert response.json()["success"] is True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
res = test_user_registration()
|
||||
print(res, res.text)
|
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: hooks.py
|
||||
@time: 2023/6/16 16:52
|
||||
@desc:
|
||||
"""
|
||||
import requests
|
||||
|
||||
|
||||
class Hooks:
|
||||
def __init__(self):
|
||||
self.before_request_funcs = []
|
||||
self.after_request_funcs = []
|
||||
|
||||
def before_request(self, func):
|
||||
"""
|
||||
注册 before_request 钩子函数
|
||||
"""
|
||||
self.before_request_funcs.append(func)
|
||||
return func
|
||||
|
||||
def after_request(self, func):
|
||||
"""
|
||||
注册 after_request 钩子函数
|
||||
"""
|
||||
self.after_request_funcs.append(func)
|
||||
return func
|
||||
|
||||
def execute_hooks(self, url, method, **kwargs):
|
||||
"""
|
||||
执行所有的钩子函数
|
||||
"""
|
||||
for func in self.before_request_funcs:
|
||||
kwargs = func(url, method, **kwargs)
|
||||
|
||||
response = requests.request(method, url, **kwargs)
|
||||
|
||||
for func in self.after_request_funcs:
|
||||
response = func(response)
|
||||
|
||||
return response
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: hooks_decorator.py
|
||||
@time: 2023/6/16 17:03
|
||||
@desc:
|
||||
"""
|
||||
from temp.extent.hooks import Hooks
|
||||
|
||||
hooks = Hooks()
|
||||
|
||||
|
||||
def before_decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
# hooks.execute_hooks(*args, **kwargs)
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def after_decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
result = func(*args, **kwargs)
|
||||
# hooks.execute_hooks(*args, **kwargs)
|
||||
return result
|
||||
|
||||
return wrapper
|
|
@ -1,251 +0,0 @@
|
|||
2023-06-14 08:45:56 | INFO | 开始加载内置方法...
|
||||
2023-06-14 08:45:56 | INFO | 内置方法加载完成
|
||||
2023-06-14 08:45:56 | INFO | 所有用例执行开始...
|
||||
2023-06-14 08:45:56 | INFO | 测试用例:1 不执行,跳过!!!
|
||||
2023-06-14 08:45:57 | INFO | 暂停:1
|
||||
2023-06-14 08:45:57 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:45:57 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
|
||||
2023-06-14 08:45:57 | INFO | -----------分割线-----------
|
||||
2023-06-14 08:45:57 | 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 08:45:57 | ERROR | wrapper: 请求异常
|
||||
Traceback (most recent call last):
|
||||
|
||||
File "D:\application\PyCharm 2023.1.1\plugins\python\helpers\pycharm\_jb_unittest_runner.py", line 38, in <module>
|
||||
sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner,
|
||||
│ │ │ │ │ └ <class 'teamcity.unittestpy.TeamcityTestRunner'>
|
||||
│ │ │ │ └ <module 'teamcity.unittestpy' from 'D:\\application\\PyCharm 2023.1.1\\plugins\\python\\helpers\\pycharm\\teamcity\\unittestp...
|
||||
│ │ │ └ ['python -m unittest', 'D:\\apk_api\\api-test-project\\temp\\extent\\test_api_script.py']
|
||||
│ │ └ <class 'unittest.main.TestProgram'>
|
||||
│ └ <built-in function exit>
|
||||
└ <module 'sys' (built-in)>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\main.py", line 101, in __init__
|
||||
self.runTests()
|
||||
│ └ <function TestProgram.runTests at 0x000001AB9CB13A60>
|
||||
└ <unittest.main.TestProgram object at 0x000001AB9CA3DFA0>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\main.py", line 271, in runTests
|
||||
self.result = testRunner.run(self.test)
|
||||
│ │ │ │ └ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.Tes...
|
||||
│ │ │ └ <unittest.main.TestProgram object at 0x000001AB9CA3DFA0>
|
||||
│ │ └ <function TeamcityTestRunner.run at 0x000001AB9CDD4940>
|
||||
│ └ <teamcity.unittestpy.TeamcityTestRunner object at 0x000001AB9CA3D580>
|
||||
└ <unittest.main.TestProgram object at 0x000001AB9CA3DFA0>
|
||||
|
||||
File "D:\application\PyCharm 2023.1.1\plugins\python\helpers\pycharm\teamcity\unittestpy.py", line 310, in run
|
||||
return super(TeamcityTestRunner, self).run(test)
|
||||
│ │ └ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.Tes...
|
||||
│ └ <teamcity.unittestpy.TeamcityTestRunner object at 0x000001AB9CA3D580>
|
||||
└ <class 'teamcity.unittestpy.TeamcityTestRunner'>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\runner.py", line 176, in run
|
||||
test(result)
|
||||
│ └ <teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>
|
||||
└ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.Tes...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 84, in __call__
|
||||
return self.run(*args, **kwds)
|
||||
│ │ │ └ {}
|
||||
│ │ └ (<teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>,)
|
||||
│ └ <function TestSuite.run at 0x000001AB9CA9EAF0>
|
||||
└ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.Tes...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 122, in run
|
||||
test(result)
|
||||
│ └ <teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>
|
||||
└ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.TestProjectApi testMethod=test_api_2...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 84, in __call__
|
||||
return self.run(*args, **kwds)
|
||||
│ │ │ └ {}
|
||||
│ │ └ (<teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>,)
|
||||
│ └ <function TestSuite.run at 0x000001AB9CA9EAF0>
|
||||
└ <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[None, <test_api_script.TestProjectApi testMethod=test_api_2...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 122, in run
|
||||
test(result)
|
||||
│ └ <teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>
|
||||
└ <unittest.suite.TestSuite tests=[None, <test_api_script.TestProjectApi testMethod=test_api_2_登录>, <test_api_script.TestProjec...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 84, in __call__
|
||||
return self.run(*args, **kwds)
|
||||
│ │ │ └ {}
|
||||
│ │ └ (<teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>,)
|
||||
│ └ <function TestSuite.run at 0x000001AB9CA9EAF0>
|
||||
└ <unittest.suite.TestSuite tests=[None, <test_api_script.TestProjectApi testMethod=test_api_2_登录>, <test_api_script.TestProjec...
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\suite.py", line 122, in run
|
||||
test(result)
|
||||
│ └ <teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>
|
||||
└ <test_api_script.TestProjectApi testMethod=test_api_2_登录>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\case.py", line 653, in __call__
|
||||
return self.run(*args, **kwds)
|
||||
│ │ │ └ {}
|
||||
│ │ └ (<teamcity.unittestpy.TeamcityTestResult run=2 errors=0 failures=0>,)
|
||||
│ └ <function TestCase.run at 0x000001AB9CA98AF0>
|
||||
└ <test_api_script.TestProjectApi testMethod=test_api_2_登录>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\case.py", line 593, in run
|
||||
self._callTestMethod(testMethod)
|
||||
│ │ └ <bound method TestProjectApi.test_api of <test_api_script.TestProjectApi testMethod=test_api_2_登录>>
|
||||
│ └ <function TestCase._callTestMethod at 0x000001AB9CA98940>
|
||||
└ <test_api_script.TestProjectApi testMethod=test_api_2_登录>
|
||||
|
||||
File "D:\Program Files\python39\lib\unittest\case.py", line 550, in _callTestMethod
|
||||
method()
|
||||
└ <bound method TestProjectApi.test_api of <test_api_script.TestProjectApi testMethod=test_api_2_登录>>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\ddt.py", line 235, in wrapper
|
||||
return func(self, *args, **kwargs)
|
||||
│ │ │ └ {}
|
||||
│ │ └ ({'Run': 'YES', 'Time': 1, 'Url': '/auth/loginByNotBip', 'Headers': '{"Content-Type": "application/json"}', 'Request Data': '...
|
||||
│ └ <test_api_script.TestProjectApi testMethod=test_api_2_登录>
|
||||
└ <function TestProjectApi.test_api at 0x000001ABB69FEB80>
|
||||
|
||||
File "D:\apk_api\api-test-project\temp\extent\test_api_script.py", line 125, in test_api
|
||||
response = http_client(host, url, method, **kwargs)
|
||||
│ │ │ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ │ │ └ 'post'
|
||||
│ │ └ '/auth/loginByNotBip'
|
||||
│ └ 'https://bimdc.bzlrobot.com/bsp/test/user/ugs'
|
||||
└ <function log_decorator.<locals>.wrapper at 0x000001ABB52C3D30>
|
||||
|
||||
> File "D:\apk_api\api-test-project\common\utils\mylogger.py", line 94, in wrapper
|
||||
result = func(*args, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ ('https://bimdc.bzlrobot.com/bsp/test/user/ugs', '/auth/loginByNotBip', 'post')
|
||||
└ <function log_decorator.<locals>.wrapper at 0x000001ABB52C3DC0>
|
||||
|
||||
File "D:\apk_api\api-test-project\common\utils\http_client.py", line 22, in wrapper
|
||||
response = func(*args, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ ('https://bimdc.bzlrobot.com/bsp/test/user/ugs', '/auth/loginByNotBip', 'post')
|
||||
└ <function http_client at 0x000001ABB52C3B80>
|
||||
|
||||
File "D:\apk_api\api-test-project\common\utils\http_client.py", line 56, in http_client
|
||||
return func(url, verify=True, timeout=30, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip'
|
||||
└ <bound method Session.post of <requests.sessions.Session object at 0x000001ABB6A01BE0>>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 578, in post
|
||||
return self.request('POST', url, data=data, json=json, **kwargs)
|
||||
│ │ │ │ │ └ {'verify': True, 'timeout': 30, 'headers': '{"Content-Type": "application/json"}'}
|
||||
│ │ │ │ └ '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1...
|
||||
│ │ │ └ None
|
||||
│ │ └ 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip'
|
||||
│ └ <function Session.request at 0x000001ABB50E69D0>
|
||||
└ <requests.sessions.Session object at 0x000001ABB6A01BE0>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 516, in request
|
||||
prep = self.prepare_request(req)
|
||||
│ │ └ <Request [POST]>
|
||||
│ └ <function Session.prepare_request at 0x000001ABB50E6940>
|
||||
└ <requests.sessions.Session object at 0x000001ABB6A01BE0>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 449, in prepare_request
|
||||
p.prepare(
|
||||
│ └ <function PreparedRequest.prepare at 0x000001ABB50C8DC0>
|
||||
└ <PreparedRequest [POST]>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\models.py", line 315, in prepare
|
||||
self.prepare_headers(headers)
|
||||
│ │ └ '{"Content-Type": "application/json"}'
|
||||
│ └ <function PreparedRequest.prepare_headers at 0x000001ABB50CA160>
|
||||
└ <PreparedRequest [POST]>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\models.py", line 447, in prepare_headers
|
||||
for header in headers.items():
|
||||
└ '{"Content-Type": "application/json"}'
|
||||
|
||||
AttributeError: 'str' object has no attribute 'items'
|
||||
2023-06-14 08:45:57 | INFO | -----------分割线-----------
|
||||
2023-06-14 08:45:57 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
|
||||
'NoneType' object has no attribute 'json'
|
||||
2023-06-14 08:45:57 | INFO | 测试用例:3 不执行,跳过!!!
|
||||
2023-06-14 08:45:59 | INFO | 暂停:2
|
||||
2023-06-14 08:45:59 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:45:59 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
|
||||
2023-06-14 08:45:59 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
|
||||
2023-06-14 08:46:02 | INFO | 暂停:3
|
||||
2023-06-14 08:46:02 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:46:02 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
|
||||
2023-06-14 08:46:02 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
|
||||
2023-06-14 08:46:02 | INFO | 测试用例:None 不执行,跳过!!!
|
||||
2023-06-14 08:46:02 | INFO | 所有用例执行完毕
|
||||
2023-06-14 08:49:55 | INFO | 开始加载内置方法...
|
||||
2023-06-14 08:49:55 | INFO | 内置方法加载完成
|
||||
2023-06-14 08:49:55 | INFO | 所有用例执行开始...
|
||||
2023-06-14 08:49:55 | INFO | 测试用例:1 不执行,跳过!!!
|
||||
2023-06-14 08:49:57 | INFO | 暂停:1
|
||||
2023-06-14 08:49:57 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:49:57 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_2.py
|
||||
2023-06-14 08:49:57 | INFO | -----------分割线-----------
|
||||
2023-06-14 08:49:57 | 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 08:49:57 | ERROR | wrapper: 请求异常
|
||||
Traceback (most recent call last):
|
||||
|
||||
File "D:\apk_api\api-test-project\common\utils\mylogger.py", line 94, in wrapper
|
||||
result = func(*args, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ ('https://bimdc.bzlrobot.com/bsp/test/user/ugs', '/auth/loginByNotBip', 'post')
|
||||
└ <function log_decorator.<locals>.wrapper at 0x000001EE14EE4DC0>
|
||||
|
||||
File "D:\apk_api\api-test-project\common\utils\http_client.py", line 22, in wrapper
|
||||
response = func(*args, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ ('https://bimdc.bzlrobot.com/bsp/test/user/ugs', '/auth/loginByNotBip', 'post')
|
||||
└ <function http_client at 0x000001EE14EE4B80>
|
||||
|
||||
File "D:\apk_api\api-test-project\common\utils\http_client.py", line 56, in http_client
|
||||
return func(url, verify=True, timeout=30, **kwargs)
|
||||
│ │ └ {'json': '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQT...
|
||||
│ └ 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip'
|
||||
└ <bound method Session.post of <requests.sessions.Session object at 0x000001EE15653D30>>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 578, in post
|
||||
return self.request('POST', url, data=data, json=json, **kwargs)
|
||||
│ │ │ │ │ └ {'verify': True, 'timeout': 30, 'headers': '{"Content-Type": "application/json"}'}
|
||||
│ │ │ │ └ '{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1...
|
||||
│ │ │ └ None
|
||||
│ │ └ 'https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip'
|
||||
│ └ <function Session.request at 0x000001EE14D05A60>
|
||||
└ <requests.sessions.Session object at 0x000001EE15653D30>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 516, in request
|
||||
prep = self.prepare_request(req)
|
||||
│ │ └ <Request [POST]>
|
||||
│ └ <function Session.prepare_request at 0x000001EE14D059D0>
|
||||
└ <requests.sessions.Session object at 0x000001EE15653D30>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\sessions.py", line 449, in prepare_request
|
||||
p.prepare(
|
||||
│ └ <function PreparedRequest.prepare at 0x000001EE14CE7E50>
|
||||
└ <PreparedRequest [POST]>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\models.py", line 315, in prepare
|
||||
self.prepare_headers(headers)
|
||||
│ │ └ '{"Content-Type": "application/json"}'
|
||||
│ └ <function PreparedRequest.prepare_headers at 0x000001EE14CEF1F0>
|
||||
└ <PreparedRequest [POST]>
|
||||
|
||||
File "C:\Users\chenyongzhi11\.virtualenvs\api-test-project-FfYYNBU1\lib\site-packages\requests\models.py", line 447, in prepare_headers
|
||||
for header in headers.items():
|
||||
└ '{"Content-Type": "application/json"}'
|
||||
|
||||
AttributeError: 'str' object has no attribute 'items'
|
||||
2023-06-14 08:49:57 | INFO | -----------分割线-----------
|
||||
2023-06-14 08:49:57 | ERROR | 异常用例: 安全纯净大屏_2_登录_非BIP用户登录
|
||||
'NoneType' object has no attribute 'json'
|
||||
2023-06-14 08:49:57 | INFO | 测试用例:3 不执行,跳过!!!
|
||||
2023-06-14 08:49:59 | INFO | 暂停:2
|
||||
2023-06-14 08:49:59 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:49:59 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_4.py: 脚本文件不存在
|
||||
2023-06-14 08:49:59 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_4.py
|
||||
2023-06-14 08:50:02 | INFO | 暂停:3
|
||||
2023-06-14 08:50:02 | INFO | sql 执行成功:None
|
||||
2023-06-14 08:50:02 | INFO | D:\apk_api\api-test-project\scripts\prepost_script_安全纯净大屏_5.py: 脚本文件不存在
|
||||
2023-06-14 08:50:02 | INFO | ------开始加载脚本------prepost_script_安全纯净大屏_5.py
|
||||
2023-06-14 08:50:02 | INFO | 测试用例:None 不执行,跳过!!!
|
||||
2023-06-14 08:50:02 | INFO | 所有用例执行完毕
|
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: prepost_script.py
|
||||
@time: 2023/6/16 16:58
|
||||
@desc:
|
||||
""" # !/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: prepost_script.py
|
||||
@time: 2023/6/16 16:58
|
||||
@desc:
|
||||
"""
|
||||
from temp.extent.hooks_decorator import hooks # 导入hooks对象
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def add_authentication_headers(url, method, **kwargs):
|
||||
"""
|
||||
添加认证头信息
|
||||
"""
|
||||
print("------开始执行前置操作-----")
|
||||
headers = kwargs.get('headers', {})
|
||||
headers["Authorization"] = "Bearer " + "这是token"
|
||||
kwargs['headers'] = headers
|
||||
return kwargs
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def handle_dependent_parameters(url, method, **kwargs):
|
||||
"""
|
||||
处理依赖参数
|
||||
"""
|
||||
print("------开始执行后置操作-----")
|
||||
payload = kwargs.get('json', {})
|
||||
payload["title"] = payload.get("title")
|
||||
kwargs['json'] = payload
|
||||
return kwargs
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: run.py
|
||||
@time: 2023/6/16 16:52
|
||||
@desc:
|
||||
"""
|
||||
import requests
|
||||
|
||||
from temp.extent.hooks_decorator import before_decorator, after_decorator
|
||||
|
||||
|
||||
@after_decorator
|
||||
@before_decorator
|
||||
def test_user_registration(url, method, **kwargs):
|
||||
requests.request(method, url, **kwargs)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
kwg = {}
|
||||
test_user_registration("http://jsonplaceholder.typicode.com/posts/2", "get", **kwg)
|
|
@ -0,0 +1,125 @@
|
|||
import json
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
class Hooks:
|
||||
def __init__(self):
|
||||
self.before_request_funcs = {}
|
||||
self.after_request_funcs = {}
|
||||
|
||||
def before_request(self, func):
|
||||
"""
|
||||
注册 before_request 钩子函数
|
||||
"""
|
||||
self.before_request_funcs[func.__name__] = func
|
||||
return func
|
||||
|
||||
def after_request(self, func):
|
||||
"""
|
||||
注册 after_request 钩子函数
|
||||
"""
|
||||
self.after_request_funcs[func.__name__] = func
|
||||
return func
|
||||
|
||||
def run_before_request_hooks(self, func_names, request, json_data):
|
||||
"""
|
||||
执行 before_request 钩子函数
|
||||
"""
|
||||
for func_name in func_names:
|
||||
if func_name in self.before_request_funcs:
|
||||
func = self.before_request_funcs[func_name]
|
||||
json_data = func(request, json_data)
|
||||
return json_data
|
||||
|
||||
def run_after_request_hooks(self, func_names, request, response):
|
||||
"""
|
||||
执行 after_request 钩子函数
|
||||
"""
|
||||
for func_name in func_names:
|
||||
if func_name in self.after_request_funcs:
|
||||
func = self.after_request_funcs[func_name]
|
||||
response = func(request, response)
|
||||
return response
|
||||
|
||||
|
||||
hooks = Hooks()
|
||||
session = requests.Session()
|
||||
|
||||
|
||||
def req(url, method, **kwargs):
|
||||
"""
|
||||
发送请求并返回响应对象
|
||||
"""
|
||||
before_hooks = kwargs.pop('before_hooks', [])
|
||||
after_hooks = kwargs.pop('after_hooks', [])
|
||||
json_data = kwargs.pop('json', {})
|
||||
|
||||
request = requests.Request(method=method, url=url, **kwargs)
|
||||
prepared_request = session.prepare_request(request)
|
||||
|
||||
json_data = hooks.run_before_request_hooks(before_hooks, prepared_request, json_data)
|
||||
prepared_request.body = json.dumps(json_data)
|
||||
response = session.send(prepared_request)
|
||||
response = hooks.run_after_request_hooks(after_hooks, prepared_request, response)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def add_authentication_headers(request, json_data):
|
||||
"""
|
||||
添加认证头信息
|
||||
"""
|
||||
print("前置钩子函数,添加认证头信息", request)
|
||||
request.headers["Authorization"] = "Bearer YOUR_AUTH_TOKEN"
|
||||
return json_data
|
||||
|
||||
|
||||
@hooks.before_request
|
||||
def handle_dependent_parameters(request, json_data):
|
||||
"""
|
||||
处理依赖参数
|
||||
"""
|
||||
print("前置钩子函数,处理依赖参数", request)
|
||||
|
||||
json_data["verification_code"] = get_verification_code()
|
||||
return json_data
|
||||
|
||||
|
||||
def get_verification_code():
|
||||
# 实现获取验证码的逻辑
|
||||
return "YOUR_VERIFICATION_CODE"
|
||||
|
||||
|
||||
@hooks.after_request
|
||||
def after_dependent_parameters(request, response):
|
||||
"""
|
||||
处理后置
|
||||
"""
|
||||
print("发送请求后执行", request, "后置钩子函数,处理依赖参数", response)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
def test_user_registration():
|
||||
url = "http://www.baidu.com"
|
||||
# url = "http://jsonplaceholder.typicode.com/posts"
|
||||
data = {
|
||||
"userId": "testuser",
|
||||
"title": "password123",
|
||||
"body": "测试玩家勇哥"
|
||||
}
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
before_hooks = [add_authentication_headers.__name__, handle_dependent_parameters.__name__]
|
||||
after_hooks = [after_dependent_parameters.__name__]
|
||||
kwargs = {"json": data, "headers": headers}
|
||||
|
||||
return req(url, "post", before_hooks=before_hooks, after_hooks=after_hooks, **kwargs)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
res = test_user_registration()
|
||||
print("最终打印:----->", res)
|
|
@ -1,10 +1,22 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# @Time : 2019/11/14 14:47
|
||||
# @Author : kira
|
||||
# @Email : 262667641@qq.com
|
||||
# @File : __init__.py.py
|
||||
# @Project : risk_api_project
|
||||
import sys
|
||||
|
||||
sys.path.append("../../")
|
||||
sys.path.append("../common")
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
from common.config import Config
|
||||
from common.validation.validator import Validator
|
||||
from common.file_handling.get_excel_init import get_init
|
||||
from common.data_extraction.dependent_parameter import DependentParameter
|
||||
from common.database.mysql_client import MysqlClient
|
||||
from common.utils.mylogger import MyLogger
|
||||
from common.dependence import Dependence
|
||||
|
||||
test_file = Config.test_api # 获取 excel 文件路径
|
||||
excel_handle, init_data, test_case = get_init(test_file)
|
||||
databases = init_data.get('databases') # 获取数据库配置信息
|
||||
mysql = MysqlClient(databases) # 初始化 mysql 链接
|
||||
Dependence.set_dep(eval(init_data.get("initialize_data"))) # 初始化依赖表
|
||||
host = init_data.get('host', "") + init_data.get("path", "")
|
||||
validator = Validator()
|
||||
dep_par = DependentParameter() # 参数提取类实例化
|
||||
logger = MyLogger()
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
import sys
|
||||
|
||||
sys.path.append("../../../")
|
||||
sys.path.append("../../common")
|
||||
|
||||
from common.config import Config
|
||||
from common.validation.validator import Validator
|
||||
from common.file_handling.get_excel_init import get_init
|
||||
from common.data_extraction.dependent_parameter import DependentParameter
|
||||
from common.database.mysql_client import MysqlClient
|
||||
from common.utils.mylogger import MyLogger
|
||||
from common.dependence import Dependence
|
||||
|
||||
|
||||
test_file = Config.test_api # 获取 excel 文件路径
|
||||
excel_handle, init_data, test_case = get_init(test_file)
|
||||
databases = init_data.get('databases') # 获取数据库配置信息
|
||||
mysql = MysqlClient(databases) # 初始化 mysql 链接
|
||||
Dependence.set_dep(eval(init_data.get("initialize_data"))) # 初始化依赖表
|
||||
host = init_data.get('host', "") + init_data.get("path", "")
|
||||
validator = Validator()
|
||||
dep_par = DependentParameter() # 参数提取类实例化
|
||||
logger = MyLogger()
|
|
@ -1,169 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
"""
|
||||
@author: kira
|
||||
@contact: 262667641@qq.com
|
||||
@file: base_class.py
|
||||
@time: 2023/4/14 16:30
|
||||
@desc:
|
||||
"""
|
||||
import unittest
|
||||
|
||||
from common import bif_functions
|
||||
from common.data_extraction.dependent_parameter import DependentParameter as DP
|
||||
from common.data_extraction.data_extractor import DataExtractor
|
||||
from common.crypto.encryption_main import do_encrypt
|
||||
from common.database.mysql_client import MysqlClient
|
||||
from common.http_client.http_client import http_client
|
||||
from common.utils.logger import MyLog
|
||||
from common.validation import loaders
|
||||
from common.validation.validator import Validator
|
||||
|
||||
dep_par = DP() # 参数提取类实例化
|
||||
logger = MyLog() # 日志
|
||||
|
||||
|
||||
class BaseClass(unittest.TestCase):
|
||||
maxDiff = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.host = kwargs.pop("host", "") + kwargs.pop("path", "")
|
||||
self.databases = kwargs.pop("databases")
|
||||
self.mysql = MysqlClient(self.databases)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
logger.my_log("开始加载内置方法...", "info")
|
||||
loaders.set_bif_fun(bif_functions) # 加载内置方法
|
||||
logger.my_log("内置方法加载完成", "info")
|
||||
logger.my_log(f"所有用例执行开始...", "info")
|
||||
super().setUpClass()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls) -> None:
|
||||
super().tearDownClass()
|
||||
logger.my_log(f"所有用例执行完毕")
|
||||
|
||||
def do_process(self, item):
|
||||
"""执行流程"""
|
||||
self._case = item # 绑定测试数据
|
||||
self.init_data() # 初始化数据
|
||||
self.do_data_processing() # 替换参数
|
||||
self.do_request() # 发送请求
|
||||
self.check() # 断言数据
|
||||
self.do_response() # 提取响应
|
||||
|
||||
def do_data_processing(self):
|
||||
"""参数替换"""
|
||||
if self.mysql:
|
||||
self.do_sql() # 处理 sql
|
||||
self.do_url() # 处理 url
|
||||
self.do_headers() # 处理 请求头
|
||||
self.do_args() # 处理 请求参数
|
||||
self.get_args() # 提取请求参数
|
||||
self.do_encryption() # 处理 加密
|
||||
self.do_expected() # 处理 预期结果
|
||||
|
||||
def init_data(self):
|
||||
self.sheet = self._case.get("sheet")
|
||||
self.item_id = self._case.get("Id")
|
||||
self.name = self._case.get("name")
|
||||
self.description = self._case.get("description")
|
||||
self.url = self._case.get("Url")
|
||||
self.method = self._case.get("Method")
|
||||
self.request_data_type = self._case.get("request_data_type", "json")
|
||||
self.sql_variable = self._case.get("sql变量")
|
||||
self.sqlps = self._case.get("SQL")
|
||||
self.headers = self._case.get("Headers", {})
|
||||
self.parameters = self._case.get("Request Data")
|
||||
self.parameters_key = self._case.get("提取请求参数")
|
||||
self.encryption = self._case.get("请求参数是否加密")
|
||||
self.regex = self._case.get("正则表达式")
|
||||
self.keys = self._case.get("正则变量")
|
||||
self.deps = self._case.get("绝对路径表达式")
|
||||
self.jp_dict = self._case.get("Jsonpath")
|
||||
self.expect = self._case.get("预期结果")
|
||||
|
||||
def do_url(self):
|
||||
"""处理url"""
|
||||
self.url = dep_par.replace_dependent_parameter(self.url)
|
||||
|
||||
def do_args(self):
|
||||
"""处理请求参数"""
|
||||
self.parameters = dep_par.replace_dependent_parameter(self.parameters)
|
||||
|
||||
def get_args(self):
|
||||
"""提取请求参数"""
|
||||
DataExtractor(self.parameters).substitute_data(jp_dict=self.parameters_key)
|
||||
|
||||
def do_encryption(self):
|
||||
self.parameters = do_encrypt(self.encryption, self.parameters) # 数据加密:MD5 or sha1
|
||||
|
||||
def do_headers(self):
|
||||
"""处理请求头,默认请求头与填写的请求头合并"""
|
||||
self.headers = dep_par.replace_dependent_parameter(self.headers)
|
||||
|
||||
def do_expected(self):
|
||||
"""替换期望结果"""
|
||||
self.expect = dep_par.replace_dependent_parameter(self.expect)
|
||||
|
||||
def do_request(self):
|
||||
"""发送http请求"""
|
||||
try:
|
||||
kwargs = {
|
||||
"headers": self.headers,
|
||||
self.request_data_type: self.parameters
|
||||
}
|
||||
self._response = http_client(self.host, self.url, self.method, **kwargs)
|
||||
logger.my_log(f"请求 URL --> {self._response.request.url}", "info")
|
||||
logger.my_log(f"请求 HEADERS --> {self._response.request.headers}", "info")
|
||||
logger.my_log(f"请求 BODY --> {self._response.request.body}", "info")
|
||||
logger.my_log(f"接口耗时--> 【{self._response.elapsed}】", "info")
|
||||
logger.my_log(f"接口状态--> 【{self._response.status_code}】", "info")
|
||||
logger.my_log(f"接口响应--> {self._response.text}", "info")
|
||||
except Exception as e:
|
||||
result = "失败"
|
||||
logger.my_log(f'用例id:{self.item_id}-->{self.name}_{self.description},{self._response},异常:{e}')
|
||||
raise e
|
||||
|
||||
def do_response(self):
|
||||
"""提取响应"""
|
||||
try:
|
||||
# 提取响应
|
||||
DataExtractor(self._response.json()).substitute_data(regex=self.regex, keys=self.keys, deps=self.deps,
|
||||
jp_dict=self.jp_dict)
|
||||
except Exception as e:
|
||||
logger.my_log(
|
||||
f"提取响应失败:{self.name}_{self.description}:提取数据表达式:"
|
||||
f"\n-->regex={self.regex},"
|
||||
f"\n-->keys={self.keys},"
|
||||
f"\n-->deps={self.deps},"
|
||||
f"\n-->jp_dict={self.jp_dict}"
|
||||
f"\n-->Exception={e}")
|
||||
|
||||
def check(self):
|
||||
"""断言"""
|
||||
self.result_tuples = Validator().run_validate(self.expect, self._response.json()) # 执行断言 返回结果元组
|
||||
logger.my_log(f"断言结果组:{self.result_tuples}", "info")
|
||||
|
||||
def do_sql(self):
|
||||
# 首先执行sql替换,将sql替换为正确的sql语句
|
||||
self.sql = dep_par.replace_dependent_parameter(self.sqlps)
|
||||
|
||||
def get_sql_res(self):
|
||||
"""执行sql"""
|
||||
try:
|
||||
execute_sql_results = self.mysql.execute_sql(self.sql)
|
||||
if execute_sql_results and self.sql_variable:
|
||||
# 执行sql数据提取
|
||||
DataExtractor(execute_sql_results).substitute_data(jp_dict=self.sql_variable)
|
||||
if self.method == "SQL" and self.mysql:
|
||||
return
|
||||
except Exception as e:
|
||||
logger.my_log(f'执行 sql 失败:{self.sql},异常:{e}')
|
||||
raise e
|
||||
|
||||
def do_mongoDB(self):
|
||||
""""""
|
||||
pass
|
|
@ -1,70 +0,0 @@
|
|||
import sys
|
||||
import unittest
|
||||
|
||||
from ddt import ddt, data
|
||||
|
||||
sys.path.append("../")
|
||||
sys.path.append("../../common")
|
||||
from common.file_handling.get_excel_init import get_init
|
||||
from common.utils.logger import MyLog
|
||||
from common.dependence import Dependence
|
||||
from common.config import Config
|
||||
from test_script.script.baseclass import BaseClass
|
||||
|
||||
test_file = Config.test_api # 获取 excel 文件路径
|
||||
excel_handle, init_data, test_case = get_init(test_file)
|
||||
logger = MyLog()
|
||||
host = init_data.pop("host")
|
||||
path = init_data.pop("path")
|
||||
databases = init_data.pop('databases') # 获取数据库配置信息
|
||||
Dependence.set_dep(eval(init_data.pop("initialize_data"))) # 初始化依赖表
|
||||
|
||||
|
||||
@ddt
|
||||
class TestProjectApi(BaseClass):
|
||||
|
||||
def __init__(self, *args):
|
||||
kwargs = {
|
||||
"host": host,
|
||||
"path": path,
|
||||
"databases": databases
|
||||
}
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None:
|
||||
super().setUpClass()
|
||||
|
||||
@data(*test_case) # {"":""}
|
||||
def test_api(self, item): # item = {測試用例}
|
||||
is_run = item.get("Run")
|
||||
if not is_run or is_run.upper() != "YES":
|
||||
logger.my_log(f"测试用例:{item.pop('Id')} 不执行,跳过!!!")
|
||||
return
|
||||
# 开始执行
|
||||
self.do_process(item)
|
||||
# 断言
|
||||
try:
|
||||
self.assertNotIn("FAIL", self.result_tuples, "FAIL 存在结果元组中")
|
||||
result = "PASS"
|
||||
except Exception as e:
|
||||
result = "FAIL"
|
||||
raise e
|
||||
finally:
|
||||
# 响应结果及测试结果回写 excel
|
||||
# excel_handle.write_back(
|
||||
# sheet_name=sheet,
|
||||
# i=item_id,
|
||||
# response_value=response.text,
|
||||
# test_result=result,
|
||||
# assert_log=str(result_tuple)
|
||||
# )
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls) -> None:
|
||||
super().tearDownClass()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -1,163 +0,0 @@
|
|||
import sys
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from ddt import ddt, data
|
||||
|
||||
from common.config import Config
|
||||
|
||||
sys.path.append("../../")
|
||||
sys.path.append("../../common")
|
||||
from common.file_handling.get_excel_init import get_init
|
||||
from common.data_extraction.dependent_parameter import DependentParameter
|
||||
from common.data_extraction.data_extractor import DataExtractor
|
||||
from common.crypto.encryption_main import do_encrypt
|
||||
from common.database.mysql_client import MysqlClient
|
||||
from common.http_client.http_client import http_client
|
||||
from common.utils.logger import MyLog
|
||||
from common.validation import loaders
|
||||
from common.dependence import Dependence as dep
|
||||
from common.validation.validator import Validator
|
||||
from common import bif_functions
|
||||
|
||||
test_file = Config.test_api # 获取 excel 文件路径
|
||||
excel_handle, init_data, test_case = get_init(test_file)
|
||||
databases = init_data.get('databases') # 获取数据库配置信息
|
||||
mysql = MysqlClient(databases) # 初始化 mysql 链接
|
||||
dep.set_dep(eval(init_data.get("initialize_data"))) # 初始化依赖表
|
||||
dep_par = DependentParameter() # 参数提取类实例化
|
||||
logger = MyLog()
|
||||
host = init_data.get('host', "") + init_data.get("path", "")
|
||||
|
||||
|
||||
@ddt
|
||||
class TestProjectApi(unittest.TestCase):
|
||||
maxDiff = None
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None:
|
||||
logger.my_log("开始加载内置方法...", "info")
|
||||
loaders.set_bif_fun(bif_functions) # 加载内置方法
|
||||
logger.my_log("内置方法加载完成", "info")
|
||||
logger.my_log(f"所有用例执行开始...", "info")
|
||||
|
||||
@data(*test_case) # {"":""}
|
||||
def test_api(self, item): # item = {測試用例}
|
||||
# f"""用例描述:{item.get("name")}_{item.get("desc")}"""
|
||||
sheet = item.get("sheet")
|
||||
item_id = item.get("Id")
|
||||
name = item.get("name")
|
||||
description = item.get("description")
|
||||
url = item.get("Url")
|
||||
request_data_type = item.get("request_data_type", "params") # excel 不填写,默认为get请求的传参
|
||||
method = item.get("Method")
|
||||
sql_variable = item.get("sql变量")
|
||||
sqlps = item.get("SQL")
|
||||
item_headers = item.get("Headers", {})
|
||||
request_data = item.get("Request Data", {})
|
||||
parameters_key = item.get("提取请求参数")
|
||||
is_request_data_encryption = item.get("请求参数是否加密")
|
||||
is_headers_encryption = item.get("Headers是否加密")
|
||||
regex = item.get("正则表达式")
|
||||
keys = item.get("正则变量")
|
||||
deps = item.get("绝对路径表达式")
|
||||
jp_dict = item.get("Jsonpath")
|
||||
expect = item.get("预期结果")
|
||||
if not item.get("Run") or item.get("Run").upper() != "YES":
|
||||
logger.my_log(f"测试用例:{item.pop('Id')} 不执行,跳过!!!")
|
||||
return
|
||||
if method == "TIME":
|
||||
try:
|
||||
time.sleep(int(url))
|
||||
logger.my_log(f"暂存成功:{url}", "info")
|
||||
return
|
||||
except Exception as e:
|
||||
MyLog().my_log(f'暂停时间必须是数字')
|
||||
raise e
|
||||
|
||||
# 首先执行sql替换,将sql替换为正确的sql语句
|
||||
sql = dep_par.replace_dependent_parameter(sqlps)
|
||||
try:
|
||||
execute_sql_results = mysql.execute_sql(sql)
|
||||
logger.my_log(f'sql 执行成功:{execute_sql_results}', "info")
|
||||
if execute_sql_results and sql_variable:
|
||||
# 执行sql数据提取
|
||||
DataExtractor(execute_sql_results).substitute_data(jp_dict=sql_variable)
|
||||
logger.my_log(f'sql 提取成功', "info")
|
||||
if method == "SQL" and mysql:
|
||||
return
|
||||
except Exception as e:
|
||||
logger.my_log(f'执行 sql 失败:{sql},异常信息:{e}')
|
||||
raise e
|
||||
|
||||
# 替换 URL, PARAMETERS, HEADER,期望值
|
||||
url = dep_par.replace_dependent_parameter(url)
|
||||
request_data = dep_par.replace_dependent_parameter(request_data)
|
||||
headers = dep_par.replace_dependent_parameter(item_headers)
|
||||
expected = dep_par.replace_dependent_parameter(expect)
|
||||
|
||||
# 提取请求参数信息
|
||||
DataExtractor(request_data).substitute_data(jp_dict=parameters_key)
|
||||
# 判断是否执行加密
|
||||
if is_headers_encryption:
|
||||
headers = do_encrypt(is_headers_encryption, headers) # 请求头参数加密:md5,sha1,sha256...
|
||||
|
||||
if is_request_data_encryption:
|
||||
request_data = do_encrypt(is_request_data_encryption, request_data) # 请求参数加密:md5,sha1,sha256...
|
||||
logger.my_log(f"当前用例所在的 sheet --> {sheet}", "info")
|
||||
logger.my_log(f"执行 SQL 语句 --> {sql}", "info")
|
||||
logger.my_log(f"预期结果 --> {expected}", "info")
|
||||
try:
|
||||
# 执行请求操作
|
||||
kwargs = {
|
||||
request_data_type: request_data,
|
||||
'headers': headers
|
||||
}
|
||||
response = http_client(host, url, method, **kwargs)
|
||||
logger.my_log(f"请求地址 --> {response.request.url}", "info")
|
||||
logger.my_log(f"请求头 --> {response.request.headers}", "info")
|
||||
logger.my_log(f"请求 body --> {response.request.body}", "info")
|
||||
logger.my_log(f"接口状态--> {response.status_code}", "info")
|
||||
logger.my_log(f"接口耗时--> {response.elapsed}", "info")
|
||||
logger.my_log(f"接口响应--> {response.text}", "info")
|
||||
except Exception as e:
|
||||
result = "失败"
|
||||
logger.my_log(f'用例id:{item_id}-->{name}_{description},异常:{e}')
|
||||
raise e
|
||||
|
||||
result_tuple = Validator().run_validate(expected, response.json()) # 执行断言 返回结果元组
|
||||
result = "PASS"
|
||||
try:
|
||||
|
||||
self.assertNotIn("FAIL", result_tuple, "FAIL 存在结果元组中")
|
||||
except Exception as e:
|
||||
result = "FAIL"
|
||||
raise e
|
||||
finally:
|
||||
# pass
|
||||
# 响应结果及测试结果回写 excel
|
||||
excel_handle.write_back(
|
||||
sheet_name=sheet,
|
||||
i=item_id,
|
||||
response_value=response.text,
|
||||
test_result=result,
|
||||
assert_log=str(result_tuple)
|
||||
)
|
||||
try:
|
||||
# 提取响应
|
||||
DataExtractor(response.json()).substitute_data(regex=regex, keys=keys, deps=deps, jp_dict=jp_dict)
|
||||
except:
|
||||
logger.my_log(
|
||||
f"提取响应失败:{name}_{description}:"
|
||||
f"\nregex={regex},"
|
||||
f" \nkeys={keys}, "
|
||||
f"\ndeps={deps}, "
|
||||
f"\njp_dict={jp_dict}")
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls) -> None:
|
||||
logger.my_log(f"所有用例执行完毕")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -1,19 +1,15 @@
|
|||
import sys
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from ddt import ddt, data
|
||||
|
||||
sys.path.append("../../../")
|
||||
sys.path.append("../../common")
|
||||
|
||||
from test_script.automation import *
|
||||
from common.validation import loaders
|
||||
from common import bif_functions
|
||||
from common.crypto.encryption_main import do_encrypt
|
||||
from common.crypto.encrypt_data import encrypt_data
|
||||
from common.data_extraction.data_extractor import DataExtractor
|
||||
from common.http_client.http_client import http_client
|
||||
from common.utils.load_and_execute_script import load_and_execute_script
|
||||
from common.validation import loaders
|
||||
from test_script import *
|
||||
|
||||
|
||||
@ddt
|
||||
|
@ -22,80 +18,72 @@ class TestProjectApi(unittest.TestCase):
|
|||
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None:
|
||||
logger.info("开始加载内置方法...")
|
||||
loaders.set_bif_fun(bif_functions) # 加载内置方法
|
||||
logger.info("内置方法加载完成")
|
||||
logger.info(f"所有用例执行开始...")
|
||||
|
||||
@data(*test_case) # {"":""}
|
||||
def test_api(self, item): # item = {測試用例}
|
||||
# f"""用例描述:{item.get("name")}_{item.get("desc")}"""
|
||||
sheet = item.pop("sheet")
|
||||
item_id = item.pop("Id")
|
||||
name = item.pop("name")
|
||||
description = item.pop("description")
|
||||
name = item.pop("Name")
|
||||
description = item.pop("Description")
|
||||
sleep_time = item.get("Time")
|
||||
request_data_type = item.pop("request_data_type", "params") # excel 不填写,默认为get请求的传参
|
||||
# 不填写,默认为get请求的传参
|
||||
request_data_type = item.pop("Request Data Type") if item.get("Request Data Type") else 'params'
|
||||
method = item.pop("Method")
|
||||
sql_variable = item.pop("sql变量")
|
||||
sql_params_dict = item.pop("Sql Params Dict")
|
||||
sqlps = item.pop("SQL")
|
||||
parameters_key = item.pop("提取请求参数")
|
||||
is_request_data_encryption = item.pop("请求参数是否加密")
|
||||
is_headers_encryption = item.pop("Headers是否加密")
|
||||
regex = item.pop("正则表达式")
|
||||
keys = item.pop("正则变量")
|
||||
deps = item.pop("绝对路径表达式")
|
||||
jp_dict = item.pop("Jsonpath")
|
||||
print(f"当前的:{item}")
|
||||
parameters_key = item.pop("Extract Request Data")
|
||||
request_data_crypto = item.pop("Request Data Crypto")
|
||||
headers_crypto = item.pop("Headers Crypto")
|
||||
regex = item.pop("Regex")
|
||||
regex_params_list = item.pop("Regex Params List")
|
||||
retrieve_value = item.pop("Retrieve Value")
|
||||
json_path = item.pop("Jsonpath")
|
||||
logger.debug(f"当前的:{item}")
|
||||
|
||||
if not item.get("Run") or item.get("Run").upper() != "YES":
|
||||
logger.info(f"测试用例:{item_id} 不执行,跳过!!!")
|
||||
# logger.info(f"测试用例:{item_id} 不执行,跳过!!!")
|
||||
return
|
||||
|
||||
if sleep_time:
|
||||
try:
|
||||
time.sleep(int(sleep_time))
|
||||
logger.info(f"暂停:{sleep_time}")
|
||||
# logger.info(f"暂停:{sleep_time}")
|
||||
except Exception as e:
|
||||
logger.info(f'暂停时间必须是数字')
|
||||
logger.error(f'暂停时间必须是数字')
|
||||
raise e
|
||||
|
||||
# 首先执行sql替换,将sql替换为正确的sql语句
|
||||
sql = dep_par.replace_dependent_parameter(sqlps)
|
||||
if sql:
|
||||
try:
|
||||
execute_sql_results = mysql.do_mysql(sql)
|
||||
if execute_sql_results and sql_params_dict:
|
||||
# 执行sql数据提取
|
||||
DataExtractor(execute_sql_results).substitute_data(jp_dict=sql_params_dict)
|
||||
if method == "SQL" and mysql:
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(f'执行 sql 失败:{sql},异常信息:{e}')
|
||||
raise e
|
||||
|
||||
try:
|
||||
execute_sql_results = mysql.do_mysql(sql)
|
||||
logger.info(f'sql 执行成功:{execute_sql_results}')
|
||||
if execute_sql_results and sql_variable:
|
||||
# 执行sql数据提取
|
||||
DataExtractor(execute_sql_results).substitute_data(jp_dict=sql_variable)
|
||||
logger.info('sql 提取成功')
|
||||
if method == "SQL" and mysql:
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(f'执行 sql 失败:{sql},异常信息:{e}')
|
||||
raise e
|
||||
# 拼接动态代码段文件
|
||||
prepost_script = f"prepost_script_{sheet}_{item_id}.py"
|
||||
item = load_and_execute_script(Config.SCRIPTS_DIR, prepost_script, "setup", item)
|
||||
print(f"前置脚本后的:{item}")
|
||||
|
||||
# 替换 URL, PARAMETERS, HEADER,期望值
|
||||
item = dep_par.replace_dependent_parameter(item)
|
||||
print(f"参数替换后:{item}")
|
||||
|
||||
url = item.pop("Url")
|
||||
request_data = item.pop("Request Data", {})
|
||||
headers = item.pop("Headers", {})
|
||||
expected = item.pop("预期结果")
|
||||
request_data = item.pop("Request Data")
|
||||
headers = item.pop("Headers")
|
||||
expected = item.pop("Expected")
|
||||
|
||||
# 提取请求参数信息
|
||||
DataExtractor(request_data).substitute_data(jp_dict=parameters_key)
|
||||
|
||||
# 判断是否执行加密
|
||||
if is_headers_encryption:
|
||||
headers = do_encrypt(is_headers_encryption, headers) # 请求头参数加密:md5,sha1,sha256...
|
||||
|
||||
if is_request_data_encryption:
|
||||
request_data = do_encrypt(is_request_data_encryption, request_data) # 请求参数加密:md5,sha1,sha256...
|
||||
headers, request_data = encrypt_data(headers_crypto, headers, request_data_crypto, request_data)
|
||||
|
||||
result_tuple = None
|
||||
result = "PASS"
|
||||
|
@ -108,19 +96,22 @@ class TestProjectApi(unittest.TestCase):
|
|||
'headers': headers
|
||||
}
|
||||
response = http_client(host, url, method, **kwargs)
|
||||
# 执行后置代码片段
|
||||
load_and_execute_script(Config.SCRIPTS_DIR, prepost_script, "teardown", response)
|
||||
|
||||
result_tuple = validator.run_validate(expected, response.json()) # 执行断言 返回结果元组
|
||||
self.assertNotIn("FAIL", result_tuple, "FAIL 存在结果元组中")
|
||||
try:
|
||||
# 提取响应
|
||||
DataExtractor(response.json()).substitute_data(regex=regex, keys=keys, deps=deps, jp_dict=jp_dict)
|
||||
# 执行后置代码片段
|
||||
load_and_execute_script(Config.SCRIPTS_DIR, prepost_script, "teardown", response)
|
||||
DataExtractor(response.json()).substitute_data(regex=regex, keys=regex_params_list, deps=retrieve_value,
|
||||
jp_dict=json_path)
|
||||
|
||||
except Exception as err:
|
||||
logger.error(f"提取响应失败:{sheet}_{item_id}_{name}_{description}"
|
||||
f"\nregex={regex};"
|
||||
f" \nkeys={keys};"
|
||||
f"\ndeps={deps};"
|
||||
f"\njp_dict={jp_dict}"
|
||||
f" \nkeys={regex_params_list};"
|
||||
f"\ndeps={retrieve_value};"
|
||||
f"\njp_dict={json_path}"
|
||||
f"\n{err}")
|
||||
except Exception as e:
|
||||
result = "FAIL"
|
Loading…
Reference in New Issue