更友好的异常信息输出

This commit is contained in:
chenyongzhiaaron 2023-08-10 17:40:42 +08:00
parent c07c97c980
commit b81a7e2dc8
4 changed files with 103 additions and 66 deletions

View File

@ -4,10 +4,11 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="eded71e8-6551-463d-9bd4-cdbb3ffc536c" name="更改" comment="美化测试报告样式,优化代码">
<change afterPath="$PROJECT_DIR$/image/img_32.png" afterDir="false" />
<list default="true" id="eded71e8-6551-463d-9bd4-cdbb3ffc536c" name="更改" comment="更新说明文档">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/validation/comparators.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/validation/comparators.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/dingtalk.md" beforeDir="false" afterPath="$PROJECT_DIR$/templates/dingtalk.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/weChat.md" beforeDir="false" afterPath="$PROJECT_DIR$/templates/weChat.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -81,7 +82,29 @@
<recent name="D:\app\apitest\common\log_utils" />
</key>
</component>
<component name="RunManager" selected="Python.run">
<component name="RunManager" selected="Python.comparators">
<configuration name="comparators" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/common/validation" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/common/validation/comparators.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="dingding" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
@ -126,28 +149,6 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="email_client" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/common/notiction" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="D:\app\apitest\common\notiction\email_client.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="run" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
@ -187,11 +188,11 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.comparators" />
<item itemvalue="Python.run" />
<item itemvalue="Python 测试.Python 测试 (test_executor.py 内)" />
<item itemvalue="Python.dingding" />
<item itemvalue="Python.email_client (1)" />
<item itemvalue="Python.email_client" />
</list>
</recent_temporary>
</component>
@ -226,7 +227,8 @@
<workItem from="1690937027137" duration="37912000" />
<workItem from="1691034024300" duration="10612000" />
<workItem from="1691370512935" duration="75686000" />
<workItem from="1691638175448" duration="3561000" />
<workItem from="1691638175448" duration="3625000" />
<workItem from="1691657355432" duration="2811000" />
</task>
<task id="LOCAL-00001" summary="优化代码">
<option name="closed" value="true" />
@ -340,7 +342,15 @@
<option name="project" value="LOCAL" />
<updated>1691642894708</updated>
</task>
<option name="localTasksCounter" value="15" />
<task id="LOCAL-00015" summary="更新说明文档">
<option name="closed" value="true" />
<created>1691643261338</created>
<option name="number" value="00015" />
<option name="presentableId" value="LOCAL-00015" />
<option name="project" value="LOCAL" />
<updated>1691643261338</updated>
</task>
<option name="localTasksCounter" value="16" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -357,7 +367,8 @@
<MESSAGE value="修复动态加载函数的bug" />
<MESSAGE value="增加处理函数调用链变量以及修复动态函数中传参失效的问题" />
<MESSAGE value="美化测试报告样式,优化代码" />
<option name="LAST_COMMIT_MESSAGE" value="美化测试报告样式,优化代码" />
<MESSAGE value="更新说明文档" />
<option name="LAST_COMMIT_MESSAGE" value="更新说明文档" />
</component>
<component name="com.github.evgenys91.machinet.common.dslhistory.DslHistoryState">
<option name="historyDtoById">
@ -399,6 +410,7 @@
<SUITE FILE_PATH="coverage/apitest$resultPush.coverage" NAME="resultPush 覆盖结果" MODIFIED="1691465454364" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/unittestreportnew/core" />
<SUITE FILE_PATH="coverage/apitest$.coverage" NAME=" 覆盖结果" MODIFIED="1691568903890" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/test_script" />
<SUITE FILE_PATH="coverage/apitest$method_chain.coverage" NAME="method_chain 覆盖结果" MODIFIED="1690967090148" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/debug" />
<SUITE FILE_PATH="coverage/apitest$comparators.coverage" NAME="comparators 覆盖结果" MODIFIED="1691660379642" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/common/validation" />
<SUITE FILE_PATH="coverage/apitest$encryption_str.coverage" NAME="encryption_str 覆盖结果" MODIFIED="1690796164466" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/common/crypto" />
<SUITE FILE_PATH="coverage/apitest$data_extractor.coverage" NAME="data_extractor 覆盖结果" MODIFIED="1691398486016" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/common/data_extraction" />
<SUITE FILE_PATH="coverage/apitest$get_set.coverage" NAME="get_set 覆盖结果" MODIFIED="1689930576115" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/debug" />

View File

@ -11,6 +11,10 @@ import json
import re
def p_string(a, e):
return f"预期:{a} -> {type(a)}, 实际:{e} -> {type(e)}"
def eq(actual_value, expect_value):
"""
实际值与期望值相等
@ -21,7 +25,7 @@ def eq(actual_value, expect_value):
Returns:
"""
assert actual_value == expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value == expect_value, p_string(actual_value, expect_value)
def lt(actual_value, expect_value):
@ -34,7 +38,7 @@ def lt(actual_value, expect_value):
Returns:
"""
assert actual_value < expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value < expect_value, p_string(actual_value, expect_value)
def lte(actual_value, expect_value):
@ -47,7 +51,7 @@ def lte(actual_value, expect_value):
Returns:
"""
assert actual_value <= expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value <= expect_value, p_string(actual_value, expect_value)
def gt(actual_value, expect_value):
@ -60,7 +64,7 @@ def gt(actual_value, expect_value):
Returns:
"""
assert actual_value > expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value > expect_value, p_string(actual_value, expect_value)
def gte(actual_value, expect_value):
@ -73,7 +77,7 @@ def gte(actual_value, expect_value):
Returns:
"""
assert actual_value >= expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value >= expect_value, p_string(actual_value, expect_value)
def neq(actual_value, expect_value):
@ -86,7 +90,7 @@ def neq(actual_value, expect_value):
Returns:
"""
assert actual_value != expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value != expect_value, p_string(actual_value, expect_value)
def str_eq(actual_value, expect_value):
@ -99,7 +103,8 @@ def str_eq(actual_value, expect_value):
Returns:
"""
assert str(actual_value) == str(expect_value), f"预期结果:{actual_value},实际结果:{expect_value}"
assert str(actual_value) == str(
expect_value), p_string(actual_value, expect_value)
def length_eq(actual_value, expect_value):
@ -112,8 +117,8 @@ def length_eq(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (int,)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert len(actual_value) == expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (int,)), p_string(actual_value, expect_value)
assert len(actual_value) == expect_value, p_string(actual_value, expect_value)
def length_gt(actual_value, expect_value):
@ -126,8 +131,8 @@ def length_gt(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (int,)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert len(actual_value) > expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (int,)), p_string(actual_value, expect_value)
assert len(actual_value) > expect_value, p_string(actual_value, expect_value)
def length_gte(actual_value, expect_value):
@ -140,8 +145,8 @@ def length_gte(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (int,)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert len(actual_value) >= expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (int,)), p_string(actual_value, expect_value)
assert len(actual_value) >= expect_value, p_string(actual_value, expect_value)
def length_lt(actual_value, expect_value):
@ -154,8 +159,8 @@ def length_lt(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (int,)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert len(actual_value) < expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (int,)), p_string(actual_value, expect_value)
assert len(actual_value) < expect_value, p_string(actual_value, expect_value)
def length_lte(actual_value, expect_value):
@ -168,8 +173,10 @@ def length_lte(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (int,)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert len(actual_value) <= expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (
int,)), p_string(actual_value, expect_value)
assert len(
actual_value) <= expect_value, p_string(actual_value, expect_value)
def contains(actual_value, expect_value):
@ -182,8 +189,8 @@ def contains(actual_value, expect_value):
Returns:
"""
assert isinstance(actual_value, (list, tuple, dict, str, bytes)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert expect_value in actual_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(actual_value, (list, tuple, dict, str, bytes)), p_string(actual_value, expect_value)
assert expect_value in actual_value, p_string(actual_value, expect_value)
def contained_by(actual_value, expect_value):
@ -196,8 +203,8 @@ def contained_by(actual_value, expect_value):
Returns:
"""
assert isinstance(expect_value, (list, tuple, dict, str, bytes)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert actual_value in expect_value, f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(expect_value, (list, tuple, dict, str, bytes)), p_string(actual_value, expect_value)
assert actual_value in expect_value, p_string(actual_value, expect_value)
def type_match(actual_value, expect_value):
@ -222,7 +229,7 @@ def type_match(actual_value, expect_value):
else:
raise ValueError(name)
assert isinstance(actual_value, get_type(expect_value)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert isinstance(actual_value, get_type(expect_value)), p_string(actual_value, expect_value)
def regex_match(actual_value, expect_value):
@ -239,7 +246,7 @@ def regex_match(actual_value, expect_value):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.match(expect_value, actual_value), f"预期结果:{actual_value},实际结果:{expect_value}"
assert re.match(expect_value, actual_value), p_string(actual_value, expect_value)
def regex_search(actual_value, expect_value):
@ -256,7 +263,7 @@ def regex_search(actual_value, expect_value):
actual_value = json.dumps(actual_value, ensure_ascii=False)
if not isinstance(expect_value, str):
expect_value = json.dumps(expect_value, ensure_ascii=False)
assert re.search(expect_value, actual_value), f"预期结果:{actual_value},实际结果:{expect_value}"
assert re.search(expect_value, actual_value), p_string(actual_value, expect_value)
def startswith(actual_value, expect_value):
@ -269,7 +276,7 @@ def startswith(actual_value, expect_value):
Returns:
"""
assert str(actual_value).startswith(str(expect_value)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert str(actual_value).startswith(str(expect_value)), p_string(actual_value, expect_value)
def endswith(actual_value, expect_value):
@ -282,4 +289,8 @@ def endswith(actual_value, expect_value):
Returns:
"""
assert str(actual_value).endswith(str(expect_value)), f"预期结果:{actual_value},实际结果:{expect_value}"
assert str(actual_value).endswith(str(expect_value)), p_string(actual_value, expect_value)
if __name__ == '__main__':
eq(1, "1")

View File

@ -1,9 +1,22 @@
### 【{{title}}】测试结果
##### 测试人员: {{tester}}
##### 开始时间: {{begin_time}}
##### 执行时间: {{runtime}}
##### 用例总数: {{all}}
##### 成功用例: {{success}}
##### 失败用例: {{fail}}
##### 错误用例: {{error}}
##### 跳过用例: {{skip}}
# **提醒!自动化测试反馈**
## **请相关同事注意,及时跟进!**
> 项目名称:<font color='info'>{{title}}</font>
> 测试人员:<font color='info'>{{tester}}</font>
> 开始时间:<font color='info'>{{begin_time}}</font>
> 运行时间:<font color='info'>{{runtime}}</font>
> 测试用例总数:<font color='info'>{{all}}</font>
> 测试用例通过率:<font color='info'>{pass_rate}%</font>
> 成功数: <font color='info'>{{success}}</font>
> 失败数:<font color='warning'>{{fail}}</font>
> 跳过数:<font color='info'>{{skip}}, </font>
> 错误数:<font color='comment'>{{error}}</font>
> **--------------------上一次运行结果--------------------**
> 测试用例总数: <font color='info'>{{ history[-1]['all'] }}</font>
> 测试用例通过率:<font color='info'>{{history[-1]['pass_rate']}}%</font>
> 成功数:<font color='info'>{{history[-1]['success']}}</font>
> 失败数:<font color='warning'>{{history[-1]['fail']}}</font>
> 跳过数:<font color='info'>{{history[-1]['skip']}}</font>
> 错误数:<font color='comment'>{{history[-1]['error']}}</font>
> ##### **报告链接:** [jenkins报告,请点击后进入查看](report_url)

View File

@ -1,4 +1,5 @@
# **提醒!自动化测试反馈**\n#### **请相关同事注意,及时跟进!**
# **提醒!自动化测试反馈**
## **请相关同事注意,及时跟进!**
> 项目名称:<font color='info'>{{title}}</font>
> 测试人员:<font color='info'>{{tester}}</font>