|
@@ -0,0 +1,485 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html>
|
|
|
+ <head>
|
|
|
+ <title>测试报告</title>
|
|
|
+ <meta charset="UTF-8">
|
|
|
+ <style>body {
|
|
|
+ font-family: consolas, Verdana, sans-serif;
|
|
|
+ font-size: .95em;
|
|
|
+ color: #696e71;
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 5rem;
|
|
|
+}
|
|
|
+
|
|
|
+.main_section {
|
|
|
+ width: 90%;
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
+
|
|
|
+#float_menu{
|
|
|
+ position:fixed;
|
|
|
+ top:0;
|
|
|
+ right:0;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+#float_menu .menu-item {
|
|
|
+ cursor: pointer;
|
|
|
+ padding: .5em;
|
|
|
+ margin: .5em 0;
|
|
|
+ color: #c08580;
|
|
|
+ background-color: #f8f0ef;
|
|
|
+ font-size: 1.2em;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+.result{
|
|
|
+ display: flex;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.result_table{
|
|
|
+ border-collapse: collapse;
|
|
|
+ border: 1px solid #f0e0e5;
|
|
|
+ width: 30em;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 1.0em;
|
|
|
+}
|
|
|
+
|
|
|
+.result_table td{
|
|
|
+ border: 1px solid #f0e0e5;
|
|
|
+ padding: .3em;
|
|
|
+}
|
|
|
+
|
|
|
+.result_barchart{
|
|
|
+ width: 30em;
|
|
|
+ margin: 0 5em 0 5em;
|
|
|
+}
|
|
|
+
|
|
|
+.barchar_item{
|
|
|
+ margin: 2.5rem 0;
|
|
|
+}
|
|
|
+
|
|
|
+.barchart_barbox {
|
|
|
+ margin: 0.5em 0;
|
|
|
+ width: 100%;
|
|
|
+ background-color: #fff;
|
|
|
+ border: 1px solid #86c2dd;
|
|
|
+ border-radius: .2em;
|
|
|
+}
|
|
|
+
|
|
|
+.barchart_bar {
|
|
|
+ text-align: right;
|
|
|
+ height: 1.2rem;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+.h3_button {
|
|
|
+ margin: 1.5em;
|
|
|
+ cursor: pointer;
|
|
|
+ color: #03a9f4;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.info
|
|
|
+{
|
|
|
+ white-space:pre-wrap;
|
|
|
+ margin: .8em 1.5em;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.error-info
|
|
|
+{
|
|
|
+ color: #a64747
|
|
|
+}
|
|
|
+
|
|
|
+.suite_dir {
|
|
|
+ margin: 1em .2em;
|
|
|
+ padding: .3em;
|
|
|
+ /* background-color: #dfeff6; */
|
|
|
+ border: 1px solid #bcd8e4;
|
|
|
+}
|
|
|
+.suite_file {
|
|
|
+ margin: 1em .2em;
|
|
|
+ padding: .3em;
|
|
|
+ border: 1px solid #bcd8e4;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.case {
|
|
|
+ margin: 1em .2em;
|
|
|
+ /* padding: .3em; */
|
|
|
+ border: 1px solid #e7d4d4;
|
|
|
+}
|
|
|
+
|
|
|
+.case_class_path{
|
|
|
+ margin: 0em 1em;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.folder_header {
|
|
|
+ padding: .2em .7em;
|
|
|
+ background-color: #fffaf9;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.setup{
|
|
|
+ margin: .2em;
|
|
|
+ /* padding: .3em; */
|
|
|
+ /* border: 1px solid #e7d4d4; */
|
|
|
+}
|
|
|
+.teardown{
|
|
|
+ margin: .2em;
|
|
|
+ /* padding: .3em;*/
|
|
|
+ /* border: 1px solid #e7d4d4; */
|
|
|
+}
|
|
|
+.test_steps{
|
|
|
+ margin: .2em;
|
|
|
+ padding: .3em;
|
|
|
+ /* border: 1px solid #e7d4d4; */
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+.label {
|
|
|
+ display: inline-block;
|
|
|
+ padding: .1em .5em;
|
|
|
+ font-size: .88em;
|
|
|
+ letter-spacing: 1px;
|
|
|
+ white-space: nowrap;
|
|
|
+ color: #0d6ebc;
|
|
|
+ border-radius: .2em;
|
|
|
+ min-width: 5em;
|
|
|
+ margin-right: 2em;
|
|
|
+ font-family: consolas;
|
|
|
+}
|
|
|
+
|
|
|
+/* .suite_setup .label{
|
|
|
+ color: #219e26 ;
|
|
|
+}
|
|
|
+.suite_teardown .label{
|
|
|
+ color: #219e26;
|
|
|
+} */
|
|
|
+
|
|
|
+
|
|
|
+/* .case.pass .casename{
|
|
|
+ color: #329132 ;
|
|
|
+} */
|
|
|
+.case.pass .caselabel{
|
|
|
+ color: white;
|
|
|
+ background-color: #3b9e3f;
|
|
|
+}
|
|
|
+/* .case.fail .casename{
|
|
|
+ color: #a64747;
|
|
|
+} */
|
|
|
+.case.fail .caselabel{
|
|
|
+ color: white;
|
|
|
+ background-color: #a64747;
|
|
|
+}
|
|
|
+/* .case.abort .casename{
|
|
|
+ color: #953ab7;
|
|
|
+} */
|
|
|
+.case.abort .caselabel{
|
|
|
+ color: white;
|
|
|
+ background-color: #9c27b0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+.case_step {
|
|
|
+ margin: .8em;
|
|
|
+}
|
|
|
+.checkpoint_pass {
|
|
|
+ margin: .8em;
|
|
|
+}
|
|
|
+.checkpoint_fail {
|
|
|
+ margin: .8em;
|
|
|
+}
|
|
|
+
|
|
|
+.case_step .tag{
|
|
|
+ color: #2196f3;;
|
|
|
+ margin: .3em 1em .3em 0;
|
|
|
+ padding: .1em .3em;
|
|
|
+ font-size: .92em;
|
|
|
+}
|
|
|
+
|
|
|
+.checkpoint_pass .tag{
|
|
|
+ color: #009806;
|
|
|
+ margin:.3em 1em .3em .5em;
|
|
|
+ padding: .1em .3em;
|
|
|
+ font-size: .92em;
|
|
|
+}
|
|
|
+.checkpoint_fail .tag{
|
|
|
+ color: #9c2020;
|
|
|
+ margin:.3em 1em .3em .5em;
|
|
|
+ padding: .1em .3em;
|
|
|
+ font-size: .92em;
|
|
|
+}
|
|
|
+
|
|
|
+.screenshot {
|
|
|
+ border: 1px solid #86c2dd;
|
|
|
+}
|
|
|
+
|
|
|
+.executetime {
|
|
|
+ float: right;
|
|
|
+}</style>
|
|
|
+ <script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
|
|
|
+var ERROR_INFOS = []; // 错误信息列表
|
|
|
+var current_error_idx = -1;
|
|
|
+
|
|
|
+// 页面加载后执行的函数
|
|
|
+window.addEventListener("load", function(){
|
|
|
+ // 所有 .folder_header 添加点击事件处理
|
|
|
+ let folderHeaderEles = document.querySelectorAll(".folder_header");
|
|
|
+ folderHeaderEles.forEach(function(ele) {
|
|
|
+ ele.addEventListener("click", function(event) {
|
|
|
+ let fb = event.target.closest('.folder_header').nextElementSibling;
|
|
|
+ fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ // 找到所有的错误信息对象
|
|
|
+ ERROR_INFOS = document.querySelectorAll(".error-info");
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function toggle_folder_all_cases(){
|
|
|
+ let eles = document.querySelectorAll(".folder_body");
|
|
|
+
|
|
|
+ FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
|
|
|
+ document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
|
|
|
+
|
|
|
+ for (const ele of eles){
|
|
|
+ ele.style.display = FOLDER_ALL_CASES? "none": "block"
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function previous_error(){
|
|
|
+ // 查找错误必须是详细模式
|
|
|
+ if (FOLDER_ALL_CASES)
|
|
|
+ toggle_folder_all_cases()
|
|
|
+
|
|
|
+ current_error_idx -= 1;
|
|
|
+ if (current_error_idx<0)
|
|
|
+ current_error_idx = 0
|
|
|
+
|
|
|
+
|
|
|
+ let error = ERROR_INFOS[current_error_idx];
|
|
|
+
|
|
|
+ error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function next_error(){
|
|
|
+
|
|
|
+ // 查找错误必须是详细模式
|
|
|
+ if (FOLDER_ALL_CASES)
|
|
|
+ toggle_folder_all_cases()
|
|
|
+
|
|
|
+ current_error_idx += 1;
|
|
|
+ if (current_error_idx > ERROR_INFOS.length-1)
|
|
|
+ current_error_idx = ERROR_INFOS.length-1
|
|
|
+
|
|
|
+ let error = ERROR_INFOS[current_error_idx];
|
|
|
+
|
|
|
+ error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
|
|
|
+
|
|
|
+}</script>
|
|
|
+ </head>
|
|
|
+ <body>
|
|
|
+ <div class="main_section">
|
|
|
+ <h1 style="font-family: auto">测试报告</h1>
|
|
|
+ <h3>统计结果</h3>
|
|
|
+ <div class="result">
|
|
|
+ <table class="result_table">
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <td>hytest 版本</td>
|
|
|
+ <td>0.8.11</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>开始时间</td>
|
|
|
+ <td>2023/07/06 16:05:43</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>结束时间</td>
|
|
|
+ <td>2023/07/06 16:05:44</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>耗时</td>
|
|
|
+ <td>0.307 秒</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>预备执行用例数量</td>
|
|
|
+ <td>1</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>实际执用例行数量</td>
|
|
|
+ <td>1</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>通过</td>
|
|
|
+ <td>1</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>失败</td>
|
|
|
+ <td style="">0</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>异常</td>
|
|
|
+ <td style="">0</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>阻塞</td>
|
|
|
+ <td style="">0</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>套件初始化失败</td>
|
|
|
+ <td style="">0</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>套件清除 失败</td>
|
|
|
+ <td style="color:red">1</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>用例初始化失败</td>
|
|
|
+ <td style="">0</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>用例清除 失败</td>
|
|
|
+ <td style="color:red">1</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ <div class="result_barchart">
|
|
|
+ <div class="barchar_item">
|
|
|
+ <span>用例通过 100% : 1 个</span>
|
|
|
+ <div class="barchart_barbox">
|
|
|
+ <div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="barchar_item">
|
|
|
+ <span>用例失败 0% : 0 个</span>
|
|
|
+ <div class="barchart_barbox">
|
|
|
+ <div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="barchar_item">
|
|
|
+ <span>用例异常 0% : 0 个</span>
|
|
|
+ <div class="barchart_barbox">
|
|
|
+ <div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="barchar_item">
|
|
|
+ <span>用例阻塞 0% : 0 个</span>
|
|
|
+ <div class="barchart_barbox">
|
|
|
+ <div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="margin-top:2em">
|
|
|
+ <h3 style="display:inline">执行日志</h3>
|
|
|
+ </div>
|
|
|
+ <div class="exec_log">
|
|
|
+ <div class="suite_dir" id="suite_dir cases/登录功能/">
|
|
|
+ <div>
|
|
|
+ <span class="label">进入目录</span>
|
|
|
+ <span>cases/登录功能/</span>
|
|
|
+ </div>
|
|
|
+ <div class="suite_setup setup" id="suite_setup setup cases/登录功能/">
|
|
|
+ <div class="folder_header">
|
|
|
+ <span class="label">套件初始化</span>
|
|
|
+ <span>cases/登录功能/</span>
|
|
|
+ <span class="executetime">2023-07-06 16:05:43</span>
|
|
|
+ </div>
|
|
|
+ <div class="folder_body">
|
|
|
+ <div class="info">用户登录</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="suite_file" id="suite_file cases/登录功能/login.py">
|
|
|
+ <div>
|
|
|
+ <span class="label">进入文件</span>
|
|
|
+ <span>cases/登录功能/login.py</span>
|
|
|
+ </div>
|
|
|
+ <div class="case pass" id="case_00000001">
|
|
|
+ <div class="folder_header">
|
|
|
+ <span class="label caselabel">用例 PASS</span>
|
|
|
+ <span class="casename">登录接口验证</span>
|
|
|
+ <span class="executetime">2023-07-06 16:05:44</span>
|
|
|
+ </div>
|
|
|
+ <div class="folder_body">
|
|
|
+ <span class="case_class_path">cases/登录功能/login.py::c1</span>
|
|
|
+ <div class="test_steps" id="test_steps 登录接口验证">
|
|
|
+ <span class="label">测试步骤</span>
|
|
|
+ <div class="info">测试步骤</div>
|
|
|
+ <div class="case_step">
|
|
|
+ <span class="tag">步骤 #1</span>
|
|
|
+ <span>第一步调用函数</span>
|
|
|
+ </div>
|
|
|
+ <div class="case_step">
|
|
|
+ <span class="tag">步骤 #2</span>
|
|
|
+ <span>第二步设置检查点</span>
|
|
|
+ </div>
|
|
|
+ <div class="checkpoint_pass">
|
|
|
+ <span class="tag">检查点 PASS</span>
|
|
|
+ <span>检查登录接口是否正常</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="case_teardown teardown case_st_lable fail" id="case_teardown teardown 登录接口验证">
|
|
|
+ <span class="label">用例清除</span>
|
|
|
+ <div class="info">用户退出</div>
|
|
|
+ <div class="info error-info">case teardown fail | name 'session' is not defined
|
|
|
+Traceback:
|
|
|
+ File "cases/登录功能/login.py", line 20, in teardown
|
|
|
+ apimgr.mgr_logout()
|
|
|
+ File "/Users/miaobao/Documents/work/autoproject/jianyu_auto_api/lib/webapi.py", line 82, in mgr_logout
|
|
|
+ session.post(url=url, headers=headers)
|
|
|
+NameError: name 'session' is not defined
|
|
|
+</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="suite_teardown teardown fail" id="suite_teardown teardown cases/登录功能/">
|
|
|
+ <div class="folder_header">
|
|
|
+ <span class="label">套件清除</span>
|
|
|
+ <span>cases/登录功能/</span>
|
|
|
+ <span class="executetime">2023-07-06 16:05:44</span>
|
|
|
+ </div>
|
|
|
+ <div class="folder_body">
|
|
|
+ <div class="info">用户退出</div>
|
|
|
+ <div class="info error-info">suite teardown fail | name 'session' is not defined
|
|
|
+Traceback:
|
|
|
+ File "cases/登录功能/__st__.py", line 8, in suite_teardown
|
|
|
+ apimgr.mgr_logout()
|
|
|
+ File "/Users/miaobao/Documents/work/autoproject/jianyu_auto_api/lib/webapi.py", line 82, in mgr_logout
|
|
|
+ session.post(url=url, headers=headers)
|
|
|
+NameError: name 'session' is not defined
|
|
|
+</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div id="float_menu">
|
|
|
+ <div class="menu-item" onclick="document.querySelector("body").scrollIntoView()">页首</div>
|
|
|
+ <div class="menu-item" onclick="window.open("http://www.byhy.net/tut/auto/hytest/01", "_blank"); ">帮助</div>
|
|
|
+ <div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
|
|
|
+ <div class="error_jumper" display="block">
|
|
|
+ <div class="menu-item" onclick="previous_error()" title="上一个错误">∧</div>
|
|
|
+ <div class="menu-item" onclick="next_error()" title="下一个错误">∨</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </body>
|
|
|
+</html>
|