index.html 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. {% extends "base.html" %}
  2. {% block title %}API测试报告 - {{ report_time }}{% endblock %}
  3. {% block content %}
  4. <div id="summary" class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
  5. <h1 class="h2">测试报告概览</h1>
  6. <div class="btn-toolbar mb-2 mb-md-0">
  7. <div class="btn-group me-2">
  8. <button type="button" class="btn btn-sm btn-outline-secondary">导出PDF</button>
  9. <button type="button" class="btn btn-sm btn-outline-secondary">发送邮件</button>
  10. </div>
  11. </div>
  12. </div>
  13. <div class="row">
  14. <div class="col-md-3">
  15. <div class="stats-card passed">
  16. <div class="number">{{ summary.passed }}</div>
  17. <div class="label">通过</div>
  18. </div>
  19. </div>
  20. <div class="col-md-3">
  21. <div class="stats-card failed">
  22. <div class="number">{{ summary.failed }}</div>
  23. <div class="label">失败</div>
  24. </div>
  25. </div>
  26. <div class="col-md-3">
  27. <div class="stats-card skipped">
  28. <div class="number">{{ summary.skipped }}</div>
  29. <div class="label">跳过</div>
  30. </div>
  31. </div>
  32. <div class="col-md-3">
  33. <div class="stats-card total">
  34. <div class="number">{{ summary.total }}</div>
  35. <div class="label">总计</div>
  36. </div>
  37. </div>
  38. </div>
  39. <div class="row mt-4">
  40. <div class="col-md-6">
  41. <div class="card">
  42. <div class="card-header">
  43. <h5 class="card-title">测试统计</h5>
  44. </div>
  45. <div class="card-body">
  46. <canvas id="testChart" width="400" height="200"></canvas>
  47. </div>
  48. </div>
  49. </div>
  50. <div class="col-md-6">
  51. <div class="card">
  52. <div class="card-header">
  53. <h5 class="card-title">执行信息</h5>
  54. </div>
  55. <div class="card-body">
  56. <table class="table table-sm">
  57. <tr>
  58. <th>生成时间:</th>
  59. <td>{{ report_time }}</td>
  60. </tr>
  61. <tr>
  62. <th>测试环境:</th>
  63. <td>{{ environment or '未指定' }}</td>
  64. </tr>
  65. <tr>
  66. <th>总耗时:</th>
  67. <td>{{ summary.duration }}</td>
  68. </tr>
  69. <tr>
  70. <th>成功率:</th>
  71. <td>{{ summary.success_rate }}%</td>
  72. </tr>
  73. </table>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <div id="test-cases" class="mt-5">
  79. <h2 class="h4 mb-3">测试用例详情</h2>
  80. {% for test in tests %}
  81. <div class="test-case {{ test.status }}">
  82. <div class="test-name">{{ test.name }}</div>
  83. <div class="test-duration">耗时: {{ test.duration }}</div>
  84. <span class="badge bg-{% if test.status == 'passed' %}success{% elif test.status == 'failed' %}danger{% else %}warning{% endif %}">
  85. {{ test.status|upper }}
  86. </span>
  87. {% if test.error %}
  88. <div class="mt-2">
  89. <button class="btn btn-sm btn-outline-danger" type="button" data-bs-toggle="collapse"
  90. data-bs-target="#error-{{ loop.index }}" aria-expanded="false">
  91. 查看错误详情
  92. </button>
  93. <div class="collapse mt-2" id="error-{{ loop.index }}">
  94. <div class="card card-body">
  95. <pre class="mb-0">{{ test.error }}</pre>
  96. </div>
  97. </div>
  98. </div>
  99. {% endif %}
  100. </div>
  101. {% endfor %}
  102. </div>
  103. {% endblock %}
  104. {% block extra_js %}
  105. <script>
  106. // 测试统计图表
  107. var ctx = document.getElementById('testChart').getContext('2d');
  108. var testChart = new Chart(ctx, {
  109. type: 'doughnut',
  110. data: {
  111. labels: ['通过', '失败', '跳过'],
  112. datasets: [{
  113. data: [{{ summary.passed }}, {{ summary.failed }}, {{ summary.skipped }}],
  114. backgroundColor: [
  115. '#27ae60',
  116. '#e74c3c',
  117. '#f39c12'
  118. ],
  119. borderWidth: 1
  120. }]
  121. },
  122. options: {
  123. responsive: true,
  124. plugins: {
  125. legend: {
  126. position: 'bottom',
  127. }
  128. }
  129. }
  130. });
  131. </script>
  132. {% endblock %}