AI 應用元件

測試結果面板

測試結果面板:通過、失敗與略過計數逐位滾動,比例條平順增長,失敗項可展開查看預期與實際值的差異。

給 AI 程式助理跑完測試後的結果面板,或 CI 摘要頁使用。標頭三個計數 chip——通過、失敗、略過——的數字逐位滾動,旁邊是總耗時;下方的分段比例條以 spring 平順增長,仍在執行的部分以斜紋表示。計數 chip 同時是篩選鈕,選中底塊會滑到新的位置。列表依 suite 分組、可摺疊,失敗項展開後顯示錯誤訊息與逐行 diff(- 預期/+ 實際),並提供「只重跑這個」與「複製錯誤」。篩選支援受控/非受控雙模式。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add test-results-panel

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

200
200
編輯中的呼叫預設屬性
<TestResultsPanel/>

完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。

安裝

npx webberui@latest add https://webberui.com/r/test-results-panel.json

或在 components.json 設定 registries 後,改用 @webberui/test-results-panel 安裝。

使用

import { TestResultsPanel } from "@/components/ui/test-results-panel";

<TestResultsPanel
  running={false}
  suites={[
    {
      id: "cart",
      name: "購物車計算.test.ts",
      tests: [
        { id: "c1", name: "加入商品後小計正確", status: "pass", duration: 12 },
        {
          id: "c2",
          name: "滿千折百應套用於含運總額",
          status: "fail",
          duration: 18,
          error: { message: "折扣未套用", expected: "950", actual: "1000" },
        },
        { id: "c3", name: "庫存不足時顯示提示", status: "skip" },
      ],
    },
  ]}
  onRerun={(testId) => console.log(testId ? `重跑 ${testId}` : "全部重跑")}
/>

Props

Prop型別預設值說明
suitesTestSuite[]—依 suite 分組的測試資料
runningbooleanfalse整體是否執行中;為 true 時標頭顯示 spinner 與「執行中…」
filter"all" | "fail" | "pass" | "skip"—受控的篩選條件;未提供時由元件內部管理(非受控)
defaultFilter"all" | "fail" | "pass" | "skip""all"非受控模式的初始篩選條件
onFilterChange(filter: TestResultsFilter) => void—篩選條件變動時回呼
defaultExpandFailedbooleantrue出現失敗項時自動展開第一個失敗項
onRerun(testId?: string) => void—重新執行:不帶參數=全部重跑;帶 testId=只重跑該測試。未提供時隱藏重跑按鈕
stiffnessnumber200計數滾動與比例條的 spring 剛性
dampingnumber26計數滾動與比例條的 spring 阻尼
durationnumber200展開/收合與列進出動畫的時長(毫秒),同時寫入 --wb-test-results-panel-duration
classNamestring—透傳到最外層容器

TestSuite

欄位型別預設值說明
idstring—唯一識別碼
namestring—顯示名稱(檔案路徑或描述)
testsTestCase[]—這個 suite 底下的測試

TestCase

欄位型別預設值說明
idstring—唯一識別碼,onRerun 會帶回這個值
namestring—測試名稱
status"pass" | "fail" | "skip" | "running"—目前狀態
durationnumber—耗時(毫秒);超過 500ms 會以黃字標示為慢
errorTestError—失敗時的錯誤資訊

TestError

欄位型別預設值說明
messagestring—錯誤訊息(以等寬紅字顯示)
expectedstring—預期值;與 actual 同時提供時會顯示逐行 diff
actualstring—實際值;與 expected 同時提供時會顯示逐行 diff

另外具名匯出純函式 diffLines(expected, actual),回傳 { type: "same" | "removed" | "added"; text }[],可在別處重用同一套逐行比對。

細節

  • 計數逐位滾動:每一位數是一個 overflow-hidden 的欄,0–9 縱向堆疊,以 spring(stiffness/damping)把位移滾到目標數字;位數增加時個位保住自己的滾輪。
  • 比例條:通過/失敗/略過/執行中四段的寬度以同一組 spring 補間,執行中的部分用斜紋表示。
  • 篩選:計數 chip 為 aria-pressed 按鈕組,再按一次已選中的 chip 回到「全部」;選中底塊以 layoutId 滑動。篩選變化時列以高度與透明度進出。
  • 逐行 diff:diffLines 以最長共同子序列(LCS)比對兩段文字,不依賴任何套件;預期行紅底、實際行綠底、相同行灰字。
  • 自動展開:defaultExpandFailed 開啟時,第一次出現失敗項會自動展開它;之後全部失敗清空再出現時才會再展開一次,單獨重跑不會一直搶展開。
  • 任一測試的 status 仍為 running 也視為執行中,所以只重跑單一測試時不必另外切換 running。
  • 外層寫入 --wb-test-results-panel-duration,色彩過渡共用這個時長,可從全域覆寫。

可及性

  • 計數 chip 為 aria-pressed 按鈕,aria-label 包含狀態與數量;逐位滾動的數字對輔助科技隱藏
  • 執行結束時以 aria-live="polite" 宣告一次「通過 42,失敗 3,略過 1」,執行中的每次跳動不會打擾
  • 比例條設為 aria-hidden,資訊已在計數中
  • suite 標頭與失敗列為按鈕並設定 aria-expanded/aria-controls;以 ↑/↓/Home/End 在其間移動焦點(roving tabindex),Enter/Space 展開或收合
  • diff 每行的 −/+ 符號對輔助科技隱藏,改以 sr-only 的「預期」「實際」朗讀;每列狀態與慢測試也有 sr-only 文字
  • 使用者系統開啟「減少動態效果」時,計數直接替換、比例條直接到位、展開直接出現、狀態 icon 不彈跳