@toby1123yjh/test-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +120 -0
- package/dist/assets/scripts.js +470 -0
- package/dist/locales/en.json +155 -0
- package/dist/locales/zh.json +155 -0
- package/dist/templates/components/case-detail.ejs +62 -0
- package/dist/templates/components/evidence-tabs.ejs +249 -0
- package/dist/templates/components/header.ejs +27 -0
- package/dist/templates/components/overview.ejs +56 -0
- package/dist/templates/components/sidebar.ejs +40 -0
- package/dist/templates/components/video-player.ejs +9 -0
- package/dist/templates/report.ejs +26 -0
- package/dist/templates/styles/main.css +1168 -0
- package/dist/templates/styles/themes.css +59 -0
- package/dist/test-cli.js +1289 -0
- package/dist/test-cli.js.map +7 -0
- package/package.json +64 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<section class="overview-section" aria-label="测试概览">
|
|
2
|
+
<ul class="overview-section__stats" aria-label="统计">
|
|
3
|
+
<li class="stat-card">
|
|
4
|
+
<div class="stat-label">总用例</div>
|
|
5
|
+
<div class="stat-value"><%= summary.total %></div>
|
|
6
|
+
</li>
|
|
7
|
+
|
|
8
|
+
<li class="stat-card">
|
|
9
|
+
<div class="stat-label">通过</div>
|
|
10
|
+
<div class="stat-value"><%= summary.passed %></div>
|
|
11
|
+
</li>
|
|
12
|
+
|
|
13
|
+
<li class="stat-card">
|
|
14
|
+
<div class="stat-label">失败</div>
|
|
15
|
+
<div class="stat-value stat-failed"><%= summary.failed %></div>
|
|
16
|
+
</li>
|
|
17
|
+
|
|
18
|
+
<li class="stat-card">
|
|
19
|
+
<div class="stat-label">跳过</div>
|
|
20
|
+
<div class="stat-value"><%= summary.skipped %></div>
|
|
21
|
+
</li>
|
|
22
|
+
</ul>
|
|
23
|
+
|
|
24
|
+
<div class="progress-section">
|
|
25
|
+
<div class="progress-header">
|
|
26
|
+
<div class="progress-title">通过率</div>
|
|
27
|
+
<div class="progress-percent"><%= summary.passRate %>%</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div
|
|
31
|
+
class="progress-bar"
|
|
32
|
+
role="progressbar"
|
|
33
|
+
aria-valuemin="0"
|
|
34
|
+
aria-valuemax="100"
|
|
35
|
+
aria-valuenow="<%= summary.passRate %>"
|
|
36
|
+
aria-label="通过率"
|
|
37
|
+
>
|
|
38
|
+
<div class="progress-bar__track">
|
|
39
|
+
<div class="progress-bar__fill progress-bar-fill" style="width: <%= summary.passRate %>%"></div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<% if (summary.failed > 0) { %>
|
|
45
|
+
<nav class="failed-cases-section" aria-label="失败用例快速入口">
|
|
46
|
+
<div class="failed-cases-section__title">失败用例</div>
|
|
47
|
+
<ul class="failed-cases-section__list">
|
|
48
|
+
<% modules.forEach((module) => { %>
|
|
49
|
+
<% module.cases.filter((testCase) => testCase.status === 'failed').forEach((testCase) => { %>
|
|
50
|
+
<li><a class="failed-case-link" href="#case-<%= testCase.id %>"><%= testCase.name %></a></li>
|
|
51
|
+
<% }) %>
|
|
52
|
+
<% }) %>
|
|
53
|
+
</ul>
|
|
54
|
+
</nav>
|
|
55
|
+
<% } %>
|
|
56
|
+
</section>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<nav id="report-sidebar" class="sidebar" aria-label="用例导航">
|
|
2
|
+
<div class="sidebar-search__wrapper">
|
|
3
|
+
<input class="sidebar-search" type="search" placeholder="搜索用例..." autocomplete="off" aria-label="搜索用例" />
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="sidebar-modules">
|
|
7
|
+
<% modules.forEach((module, moduleIndex) => { %>
|
|
8
|
+
<% const moduleTitleId = `module-title-${moduleIndex}`; %>
|
|
9
|
+
<% const moduleCasesId = `module-cases-${moduleIndex}`; %>
|
|
10
|
+
<section class="module-group" data-module-id="<%= module.name %>" aria-labelledby="<%= moduleTitleId %>">
|
|
11
|
+
<header class="module-group__header">
|
|
12
|
+
<button
|
|
13
|
+
class="toggle-btn"
|
|
14
|
+
type="button"
|
|
15
|
+
aria-expanded="true"
|
|
16
|
+
aria-label="展开/折叠 <%= module.name %>"
|
|
17
|
+
aria-controls="<%= moduleCasesId %>"
|
|
18
|
+
>
|
|
19
|
+
▾
|
|
20
|
+
</button>
|
|
21
|
+
<h2 id="<%= moduleTitleId %>" class="module-group__title"><%= module.name %></h2>
|
|
22
|
+
</header>
|
|
23
|
+
|
|
24
|
+
<ul id="<%= moduleCasesId %>" class="module-group__cases">
|
|
25
|
+
<% module.cases.forEach((testCase) => { %>
|
|
26
|
+
<% const isActive = typeof activeCaseId !== 'undefined' && activeCaseId === testCase.id; %>
|
|
27
|
+
<li class="case-item <%= isActive ? 'active' : '' %>">
|
|
28
|
+
<a class="case-link" href="#case-<%= testCase.id %>" <%= isActive ? 'aria-current="true"' : '' %>>
|
|
29
|
+
<span class="case-status" aria-hidden="true">
|
|
30
|
+
<%= testCase.status === 'passed' ? '✅' : testCase.status === 'failed' ? '❌' : '⏭️' %>
|
|
31
|
+
</span>
|
|
32
|
+
<span class="case-name"><%= testCase.name %></span>
|
|
33
|
+
</a>
|
|
34
|
+
</li>
|
|
35
|
+
<% }) %>
|
|
36
|
+
</ul>
|
|
37
|
+
</section>
|
|
38
|
+
<% }) %>
|
|
39
|
+
</div>
|
|
40
|
+
</nav>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<section class="video-player" aria-label="视频回放">
|
|
2
|
+
<% if (video && typeof video === 'object' && video.path) { %>
|
|
3
|
+
<video class="video-player__media" controls preload="metadata" src="<%= video.path %>">
|
|
4
|
+
您的浏览器不支持播放该视频。Safari 可能不支持 WebM 格式,请使用 Chrome/Edge 或下载视频文件后观看。
|
|
5
|
+
</video>
|
|
6
|
+
<% } else { %>
|
|
7
|
+
<p class="video-placeholder">📹 无视频录制</p>
|
|
8
|
+
<% } %>
|
|
9
|
+
</section>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN" data-theme="<%= theme %>">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title><%= title %></title>
|
|
7
|
+
<!-- INLINE_CSS -->
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div class="report-container">
|
|
11
|
+
<aside class="sidebar-slot">
|
|
12
|
+
<%- include('components/sidebar', { modules }) %>
|
|
13
|
+
</aside>
|
|
14
|
+
|
|
15
|
+
<div class="sidebar-backdrop" aria-hidden="true"></div>
|
|
16
|
+
|
|
17
|
+
<main class="main-content">
|
|
18
|
+
<%- include('components/header', { title, timestamp, duration }) %>
|
|
19
|
+
<%- include('components/overview', { summary, modules }) %>
|
|
20
|
+
<%- include('components/case-detail', { modules }) %>
|
|
21
|
+
</main>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<!-- INLINE_JS -->
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|