钩子函数方式策略

This commit is contained in:
chenyongzhiaaron 2023-06-19 14:23:41 +08:00
parent f0e38e9c31
commit 59f636521f
41 changed files with 1243 additions and 4472 deletions

View File

@ -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">

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (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

View File

@ -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"

View File

@ -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'}

View File

@ -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,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
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 &lt;module&gt;
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 --&gt; 安全纯净大屏
2023-05-14 23:55:35,559-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --&gt; None
2023-05-14 23:55:35,559-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 --&gt;
2023-05-14 23:55:35,646-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --&gt; https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-05-14 23:55:35,648-INFO-logger.py-[ line:64 ] - 日志信息:请求头 --&gt; {'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 --&gt; b'{"account": "18127813600", "password": "WD6Y0+LJLHXuFaplzUtSCnwktA7KgXCpjCS+OVvIFGTEoz2gbqK2oOOuJUf7ao0m2YYGiGi1pQTMBnkrxIY1cztGYbVp97kvIQwZLN4UhrOAe3h1asY/NLnDwB/byl7agcGv9WI4oy6B1Z93HVHmQiAKn7QqnDgPVITu4jthNc8="}'
2023-05-14 23:55:35,651-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 200
2023-05-14 23:55:35,653-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 0:00:00.077493
2023-05-14 23:55:35,684-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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 --&gt; 安全纯净大屏
2023-05-14 23:55:36,706-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --&gt; None
2023-05-14 23:55:36,707-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 --&gt;
2023-05-14 23:55:36,779-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --&gt; 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 ] - 日志信息:请求头 --&gt; {'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 --&gt; b'{"projectId": "104966", "tvSequence": "nNNGLktZIGgeRgwzkjAX"}'
2023-05-14 23:55:36,784-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 200
2023-05-14 23:55:36,786-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 0:00:00.069166
2023-05-14 23:55:36,788-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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 --&gt; 安全纯净大屏
2023-05-14 23:55:37,715-INFO-logger.py-[ line:64 ] - 日志信息:执行 SQL 语句 --&gt; None
2023-05-14 23:55:37,716-INFO-logger.py-[ line:64 ] - 日志信息:预期结果 --&gt;
2023-05-14 23:55:37,749-INFO-logger.py-[ line:64 ] - 日志信息:请求地址 --&gt; https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1684079737711&amp;projectId=104966
2023-05-14 23:55:37,750-INFO-logger.py-[ line:64 ] - 日志信息:请求头 --&gt; {'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 --&gt; None
2023-05-14 23:55:37,751-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 200
2023-05-14 23:55:37,752-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 0:00:00.028120
2023-05-14 23:55:37,753-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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'>&nbsp;</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

View File

@ -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"}]

View File

@ -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 = [];

View File

@ -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,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
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 --&gt; https://bimdc.bzlrobot.com/bsp/test/user/ugs/auth/loginByNotBip
2023-05-14 23:30:25,218-INFO-logger.py-[ line:64 ] - 日志信息:请求 HEADERS --&gt; {'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 --&gt; None
2023-05-14 23:30:25,220-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 【0:00:00.054099】
2023-05-14 23:30:25,221-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 【200】
2023-05-14 23:30:25,223-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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 --&gt; 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 --&gt; {'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 --&gt; None
2023-05-14 23:30:25,312-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 【0:00:00.049025】
2023-05-14 23:30:25,313-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 【200】
2023-05-14 23:30:25,314-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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 --&gt; https://bimdc.bzlrobot.com/bsp/test/user/ugs/ibs/api/ibs-lms-base/tvConfig/getTvInfo?t=1684078225316&amp;projectId=104966
2023-05-14 23:30:25,350-INFO-logger.py-[ line:64 ] - 日志信息:请求 HEADERS --&gt; {'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 --&gt; None
2023-05-14 23:30:25,351-INFO-logger.py-[ line:64 ] - 日志信息:接口耗时--&gt; 【0:00:00.030915】
2023-05-14 23:30:25,352-INFO-logger.py-[ line:64 ] - 日志信息:接口状态--&gt; 【200】
2023-05-14 23:30:25,353-INFO-logger.py-[ line:64 ] - 日志信息:接口响应--&gt; {"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'>&nbsp;</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.

BIN
cases/cases/test_cases.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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 所在路径

View File

@ -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

View File

@ -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__':

View File

@ -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)

View File

@ -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()

View File

@ -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
View File

@ -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()

View File

@ -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

View File

@ -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:
"""

View File

@ -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)

View File

@ -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")

126
temp/extent/fally.py Normal file
View File

@ -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)

44
temp/extent/hooks.py Normal file
View File

@ -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

View File

@ -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

View File

@ -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 | 所有用例执行完毕

View File

@ -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

23
temp/extent/run.py Normal file
View File

@ -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)

125
temp/extent/test.py Normal file
View File

@ -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)

View File

@ -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()

View File

@ -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()

View File

@ -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  
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

View File

@ -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()

View File

@ -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()

View File

@ -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)
logger.info(f'sql 执行成功:{execute_sql_results}')
if execute_sql_results and sql_variable:
if execute_sql_results and sql_params_dict:
# 执行sql数据提取
DataExtractor(execute_sql_results).substitute_data(jp_dict=sql_variable)
logger.info('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
# 拼接动态代码段文件
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"