增加依赖装饰器,增加自动安装依赖文件,修改报告日志输出边距及颜色

This commit is contained in:
chenyongzhiaaron 2023-08-11 10:59:16 +08:00
parent b81a7e2dc8
commit ae7cd13513
12 changed files with 411 additions and 203 deletions

View File

@ -4,11 +4,19 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="eded71e8-6551-463d-9bd4-cdbb3ffc536c" name="更改" comment="更新说明文档">
<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$/OutPut/reports/report.html" beforeDir="false" afterPath="$PROJECT_DIR$/OutPut/reports/report.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cases/cases/test_cases.xlsx" beforeDir="false" afterPath="$PROJECT_DIR$/cases/cases/test_cases.xlsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/database/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/database/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/database/mysql_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/database/mysql_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/utils/action.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/utils/action.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/utils/decorators.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/utils/decorators.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/common/utils/install_dependencies.py" beforeDir="false" afterPath="$PROJECT_DIR$/common/utils/install_dependencies.py" 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" />
<change beforePath="$PROJECT_DIR$/output/reports/history.json" beforeDir="false" afterPath="$PROJECT_DIR$/output/reports/history.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/run.py" beforeDir="false" afterPath="$PROJECT_DIR$/run.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/templates2.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/templates2.html" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -47,32 +55,32 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/app/apitest/templates&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"git-widget-placeholder": "master",
"last_opened_file_path": "D:/app/apitest",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
"vue.rearranger.settings.migration": "true"
},
&quot;keyToStringList&quot;: {
&quot;DatabaseDriversLRU&quot;: [
&quot;mysql&quot;
"keyToStringList": {
"DatabaseDriversLRU": [
"mysql"
]
}
}</component>
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\app\apitest" />
<recent name="D:\app\apitest\templates" />
<recent name="D:\app\apitest\image" />
<recent name="D:\app\apitest" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\app\apitest\common" />
@ -82,7 +90,7 @@
<recent name="D:\app\apitest\common\log_utils" />
</key>
</component>
<component name="RunManager" selected="Python.comparators">
<component name="RunManager" selected="Python.run">
<configuration name="comparators" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
@ -127,28 +135,6 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="email_client (1)" 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="$PROJECT_DIR$/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="" />
@ -171,6 +157,28 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="run_script_main" 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$" />
<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$/run_script_main.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="Python 测试 (test_executor.py 内)" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
<module name="api_project" />
<option name="INTERPRETER_OPTIONS" value="" />
@ -188,11 +196,11 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.comparators" />
<item itemvalue="Python.run" />
<item itemvalue="Python.run_script_main" />
<item itemvalue="Python.comparators" />
<item itemvalue="Python 测试.Python 测试 (test_executor.py 内)" />
<item itemvalue="Python.dingding" />
<item itemvalue="Python.email_client (1)" />
</list>
</recent_temporary>
</component>
@ -228,7 +236,8 @@
<workItem from="1691034024300" duration="10612000" />
<workItem from="1691370512935" duration="75686000" />
<workItem from="1691638175448" duration="3625000" />
<workItem from="1691657355432" duration="2811000" />
<workItem from="1691657355432" duration="5387000" />
<workItem from="1691667714661" duration="8406000" />
</task>
<task id="LOCAL-00001" summary="优化代码">
<option name="closed" value="true" />
@ -350,7 +359,15 @@
<option name="project" value="LOCAL" />
<updated>1691643261338</updated>
</task>
<option name="localTasksCounter" value="16" />
<task id="LOCAL-00016" summary="更友好的异常信息输出">
<option name="closed" value="true" />
<created>1691660444913</created>
<option name="number" value="00016" />
<option name="presentableId" value="LOCAL-00016" />
<option name="project" value="LOCAL" />
<updated>1691660444913</updated>
</task>
<option name="localTasksCounter" value="17" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -368,7 +385,8 @@
<MESSAGE value="增加处理函数调用链变量以及修复动态函数中传参失效的问题" />
<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">
@ -389,13 +407,14 @@
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/apitest$load_modules_from_folder.coverage" NAME="load_modules_from_folder 覆盖结果" MODIFIED="1691398471049" 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$run.coverage" NAME="run 覆盖结果" MODIFIED="1691642368284" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/apitest$run.coverage" NAME="run 覆盖结果" MODIFIED="1691722116466" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/apitest$Unittest__test_api_py__.coverage" NAME="Unittest (test_api.py 内) 覆盖结果" MODIFIED="1689907531802" 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$dingding.coverage" NAME="dingding 覆盖结果" MODIFIED="1691483158998" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/common/notiction" />
<SUITE FILE_PATH="coverage/apitest$assert_dict.coverage" NAME="assert_dict 覆盖结果" MODIFIED="1691034548959" 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$dependent_parameter.coverage" NAME="dependent_parameter 覆盖结果" MODIFIED="1691398478714" 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$re_chain.coverage" NAME="re_chain 覆盖结果" MODIFIED="1690962595251" 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$validator.coverage" NAME="validator 覆盖结果" MODIFIED="1691395818973" 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$run_script_main.coverage" NAME="run_script_main 覆盖结果" MODIFIED="1691722112563" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/apitest$exceptions.coverage" NAME="exceptions 覆盖结果" MODIFIED="1691395709236" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/common/utils" />
<SUITE FILE_PATH="coverage/apitest$requestRecord__1_.coverage" NAME="requestRecord (1) 覆盖结果" MODIFIED="1690531988570" 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$__init__.coverage" NAME="__init__ 覆盖结果" MODIFIED="1691028135541" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/debug" />
@ -410,7 +429,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$comparators.coverage" NAME="comparators 覆盖结果" MODIFIED="1691666161767" 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" />

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -7,3 +7,7 @@
@time: 2023/3/13 14:48
@desc:
"""
import sys
sys.path.append("../../../")
sys.path.append("../../common")

View File

@ -7,9 +7,13 @@
@time: 2023/6/14 17:58
@desc: mysql数据库操作封装
"""
import json
import pymysql
# from DBUtils.PooledDB import PooledDB
from dbutils.pooled_db import PooledDB
from pymysql.cursors import DictCursor

View File

@ -88,7 +88,8 @@ class Action(Extractor, LoadScript, Validator):
AssertionFailedError(error_info, e)
raise e
finally:
print(f'| 断言结果-->{self.assertions}\n')
print(f'| <span style="color:yellow">断言结果-->{self.assertions}</span>\n')
print("-" * 50)
response = self.response.text if self.response is not None else str(self.response)
excel.write_back(sheet_name=sheet, i=iid, response=response, result=result, assertions=str(self.assertions))

View File

@ -8,6 +8,8 @@
@desc:
"""
import json
import subprocess
import sys
from functools import wraps
import yaml
@ -43,7 +45,7 @@ def request_retry_on_exception(retries=2, delay=1.5):
nonlocal e
for i in range(retries):
try:
print(f"| 第{i + 1}次发送请求的参数: {kwargs}")
response = func(*args, **kwargs)
print(f"| 请求地址 --> {response.request.url}")
print(f"| 请求头 --> {response.request.headers}")
@ -53,6 +55,7 @@ def request_retry_on_exception(retries=2, delay=1.5):
print(f"| 接口响应--> {response.text}")
except Exception as error:
print(f"| 第{i + 1}次发送请求的参数:{args} -- {kwargs}")
e = error
time.sleep(delay)
else:
@ -151,3 +154,21 @@ def rerun(count, interval=2):
return decorator
return wrapper
def install_dependencies(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
print("---------------- 檢測并且安装依赖文件 ----------------")
subprocess.check_call(["pipenv", "install"])
print("---------------- 成功安装所有依赖文件 ----------------")
except Exception as e:
print(f"Failed to install dependencies: {str(e)}")
sys.exit(1)
else:
return func(*args, **kwargs)
return wrapper

View File

@ -11,12 +11,3 @@ import subprocess
import sys
def install_dependencies():
try:
print("---------------- 檢測并且安装依赖文件 ----------------")
subprocess.check_call(["pipenv", "install"])
print("---------------- 成功安装所有依赖文件 ----------------")
except Exception as e:
print(f"Failed to install dependencies: {str(e)}")
sys.exit(1)

View File

@ -12,7 +12,9 @@ import re
def p_string(a, e):
return f"预期:{a} -> {type(a)}, 实际:{e} -> {type(e)}"
ta = str(type(a)).replace("<", "(").replace(">", ")")
te = str(type(e)).replace("<", "(").replace(">", ")")
return f"<span style='color:red' >预期:{a} -> {ta}, 实际:{e} -> {te}</span>"
def eq(actual_value, expect_value):

File diff suppressed because one or more lines are too long

6
run.py
View File

@ -13,11 +13,11 @@ sys.path.append('cases')
from config import Config
from common.core.testRunner import TestRunner
from common.utils.install_dependencies import install_dependencies
from common.utils.decorators import install_dependencies
@install_dependencies
def run():
install_dependencies()
test_report = Config.TEST_REPORT
test_case = unittest.defaultTestLoader.discover(Config.SCRIPT, pattern="test_*.py")
runner = TestRunner(test_case, report_dir=test_report, title="接口自动化测试报告", templates=2, tester="kira",
@ -25,7 +25,7 @@ def run():
runner.run()
# get_failed_test_cases = runner.get_failed_test_cases()
# runner.email_notice()
# runner.DINGTALK_NOTICE()
runner.dingtalk_notice()
runner.weixin_notice()

View File

@ -130,8 +130,8 @@
border-bottom: none;
display: none;
text-align: left;
margin: 10px 10px;
padding: 10px 10px;
margin: 10px 15px;
padding: 10px 15px;
}
.test_log td {
@ -144,14 +144,14 @@
}
pre {
margin: 0;
margin: 0 25px;
white-space: pre-wrap;
white-space: -moz-pre-wrap;
white-space: -o-pre-wrap;
word-wrap: break-word;
color: #D4D4D4; /* 浅灰色文字颜色 */
line-height: 35px;
font-size: 13px;
color: #0989cb; /* 绿色文字颜色 */
line-height: 18px;
font-size: 12px;
}
.chart4 {