Storybook Test Runner 本地构建 CI 工作流实战:在 GitHub Actions 中构建、服务并运行组件测试

发布时间:2026/9/10 16:58:47

Storybook Test Runner 本地构建 CI 工作流实战:在 GitHub Actions 中构建、服务并运行组件测试 Storybook Test Runner 本地构建 CI 工作流实战在 GitHub Actions 中构建、服务并运行组件测试【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybookStorybook Test Runner 能够把项目中的每一个 Story 转化为可执行的测试对于没有 play function 的 Story它验证组件能否无错误渲染对于带有 play function 的 Story它还会执行交互并校验断言结果。本文聚焦官方文档提供的“本地构建工作流”——在 CI以 GitHub Actions 为例中先构建 Storybook 静态产物再用静态服务器托管最后对构建产物运行 Test Runner。读完本文你将掌握这套工作流的完整 YAML 配置、每个步骤的底层原理以及它与“针对已部署 Storybook 测试”方案的取舍。为什么需要“本地构建”式的工作流Storybook 的 Test Runner 是一个独立于 Storybook 框架运行的测试工具它需要在测试执行时访问一个正在运行的 Storybook 实例——无论是本地开发服务器还是已经部署到公网的静态站点。官方文档明确指出Test Runner 要求本地运行中的 Storybook 或已发布的 Storybook 才能执行全部已有测试。在 CI 环境中最常见的两种接入方式针对已部署的 Storybook 测试依赖 Vercel、Netlify 等平台触发 GitHub Actions 的deployment_status事件将部署 URL 通过TARGET_URL环境变量传给 Test Runner针对本地构建产物测试本文主题不依赖任何部署平台在 CI 内完成build-storybook构建 →http-server静态服务 →wait-on端口探测 →test-storybook执行测试的全流程。第二种方式尤其适合以下场景Storybook 需要认证才能访问、团队希望测试与部署解耦或者 CI 中根本没有接部署平台。官方文档也建议当已发布的 Storybook 需要认证时优先采用“非部署式”的本地构建方案。核心工作流完整配置与逐行解析官方在 test-runner-local-build-workflow.md 中给出了推荐配方该片段被主文档 test-runner.mdx 引用。它将构建、服务、测试三个环节用concurrently组织在一个任务中通过-k保证测试结束成功或失败后自动终止静态服务器避免 CI 任务悬挂。完整配置如下name: Storybook Tests on: push jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-nodev4 with: node-version-file: .nvmrc - name: Install dependencies run: yarn - name: Install Playwright run: npx playwright install --with-deps - name: Build Storybook run: yarn build-storybook --quiet - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n SB,TEST -c magenta,blue \ npx http-server storybook-static --port 6006 --silent \ npx wait-on tcp:127.0.0.1:6006 yarn test-storybook触发器与任务级配置on: push任意分支的推送都会触发测试。如果希望只在主分支或 pull request 上运行可以替换为on: [push, pull_request]或配合branches限定范围。timeout-minutes: 60整个 Job 的硬性超时时间。首次构建依赖、下载 Playwright 浏览器二进制、构建 Storybook 并跑完测试通常需要数分钟到十几分钟60 分钟是文档提供的安全默认值若项目 Storybook 较大或 Story 数量多可适当调大。runs-on: ubuntu-latestTest Runner 底层基于 Playwright需要 Linux 环境来运行浏览器其他 CI 供应商GitLab Pipelines、CircleCI 等可以参照 Playwright 的 CI 文档选择基础镜像。环境准备步骤actions/checkoutv4拉取仓库代码。actions/setup-nodev4node-version-file: .nvmrc从仓库根目录的.nvmrc文件读取 Node.js 版本。如果你的项目没有.nvmrc可以改用node-version: 20这类写法。yarn安装依赖。官方文档给出的配方默认使用 Yarn实际项目中完全可以用npm ci或pnpm install --frozen-lockfile替代保持与本地开发一致的包管理器即可。npx playwright install --with-deps安装 Playwright 浏览器二进制及系统级依赖。--with-deps会在 ubuntu 镜像中额外安装浏览器运行所需的系统库这是 CI 上避免“浏览器启动失败”的关键一步。构建 Storybook 静态产物yarn build-storybook --quietbuild-storybook对应storybook/cli提供的构建命令将项目构建为纯静态 Web 应用。--quiet减少构建日志输出避免 CI 日志过长。官方文档特别提醒默认情况下 Storybook 将构建产物输出到storybook-static目录。如果项目通过main.js/main.ts中的配置改动了输出目录例如自定义outputDir必须同步调整下方http-server的静态目录参数。仓库内 test-storybooks/mcp/package.json 中即可看到真实的脚本示例build-storybook: storybook build其配套的 MCP 测试tests/mcp-endpoint.e2e.test.ts同样遵循“构建 → 服务 → 测试”的模式。并行服务与测试concurrently http-server wait-onnpx concurrently -k -s first -n SB,TEST -c magenta,blue \ npx http-server storybook-static --port 6006 --silent \ npx wait-on tcp:127.0.0.1:6006 yarn test-storybook这是整套工作流中最核心也最容易出问题的一行三个第三方工具各司其职工具作用关键参数说明concurrently同时启动多个命令并统一转发输出-kkill others任一命令退出时终止其余命令-s firstsuccess first以第一个成功退出的命令的结果作为整体退出码-n SB,TEST为两个命令命名-c magenta,blue设置前缀颜色便于区分日志http-server零配置静态文件服务器storybook-static为构建产物目录--port 6006与 Test Runner 默认期望的本地端口一致--silent抑制请求日志wait-on轮询等待某个资源就绪tcp:127.0.0.1:6006表示等待本机 6006 端口可连接避免测试命令在服务器尚未监听时抢先执行而失败整条链路的执行语义是concurrently同时拉起“静态服务器”与“等待端口 运行测试”两条命令wait-on探测到 6006 端口可访问后test-storybook才开始运行测试跑完无论通过与否-k会立刻杀掉仍在监听的http-server配合-s first将测试的退出码传递给 CI从而让 GitHub Actions 正确标记构建的成败状态。关于端口Test Runner 默认假设本地 Storybook 运行在6006端口所以配方中http-server显式指定--port 6006正是为了与默认行为对齐若你通过--url指定了其他端口这里也需保持一致。前置配置安装与本地脚本在把工作流搬上 CI 之前需要先在项目中完成 Test Runner 的安装与脚本配置详见 test-runner.mdx# npm npm install storybook/test-runner --save-dev # 或 pnpm pnpm add --save-dev storybook/test-runner # 或 yarn yarn add --dev storybook/test-runner在package.json中注册脚本{ scripts: { test-storybook: test-storybook } }本地开发时先启动 Storybook 开发服务器默认 6006 端口再开一个新终端执行yarn test-storybook或npm run test-storybook/pnpm run test-storybook即可运行测试。这套本地流程与 CI 工作流是同一套测试逻辑CI 中只是把“开发服务器”替换成了“构建产物 http-server”。备选方案针对已部署 Storybook 的 deployment_status 工作流官方文档在“Run against deployed Storybooks”一节给出了另一份配方test-runner-with-deploy-event-workflow.md与本地构建方案形成互补name: Storybook Tests on: deployment_status jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest if: github.event.deployment_status.state success steps: - uses: actions/checkoutv4 - uses: actions/setup-nodev4 with: node-version-file: .nvmrc - name: Install dependencies run: yarn - name: Install Playwright run: npx playwright install --with-deps - name: Run Storybook tests run: yarn test-storybook env: TARGET_URL: ${{ github.event.deployment_status.target_url }}两种方案的关键差异部署方案由 Vercel、Netlify 等平台触发deployment_status事件if: github.event.deployment_status.state success保证只在部署成功后执行测试并通过TARGET_URL环境变量把部署地址传给 Test Runner前提是已发布的 Storybook 必须可公开访问若需要认证则建议改用本地构建方案。本地构建方案不依赖外部部署平台直接在 CI 内构建、服务、测试产物无需公网可达。运行测试时--url参数与TARGET_URL环境变量是等效的两种指定目标地址的方式test-runner-execute-with-url.md# 方式一--url 参数 yarn test-storybook --url https://the-storybook-url-here.com # 方式二TARGET_URL 环境变量 TARGET_URLhttps://the-storybook-url-here.com yarn test-storybook常用 CLI 参数与排查要点Test Runner 基于 Jest 构建接受其部分 CLI 参数。以下是高频使用的选项完整清单见 test-runner.mdx参数用途示例--url指定测试目标 URL默认本地 6006test-storybook --url http://localhost:6007--maxWorkers限制并行 worker 数适合内存受限的 CItest-storybook --maxWorkers2--watch/--watchAll监听模式仅本地开发使用test-storybook --watch--coverage配合storybook/addon-coverage生成覆盖率test-storybook --coverage--failOnConsole浏览器出现 console 错误即判定失败test-storybook --failOnConsole--index-json基于index.json静态索引运行不支持 watchtest-storybook --index-json--eject生成test-runner-jest.config.js便于深度定制test-storybook --eject--ciCI 模式下快照不自动写入失败需-u更新test-storybook --ci--shard 1/8将测试套件拆分到多台机器并行test-storybook --shard1/8官方文档还给出了两个 CI 环境下的高频排查点Troubleshooting测试超时若出现Timeout - Async callback was not invoked within the 15000 ms timeout specified by jest.setTimeout通常是 Story 数量过多或 CI 内存不足可通过--maxWorkers2限制并行度解决错误输出过短CLI 默认截断错误输出为 1000 字符可通过DEBUG_PRINT_LIMIT5000 yarn test-storybook放大限制完整堆栈也可直接在浏览器中打开对应 Story 查看。演进方向Vitest Addon官方文档在 Test Runner 文档开头给出了重要提示Test Runner 正被 Vitest addon 逐步取代——后者基于更快、更现代的 Vitest 浏览器模式提供同样的能力并能在 Storybook 应用中直接运行交互、无障碍与视觉测试。对于使用 Vite 构建的 Storybook 框架官方推荐优先考虑 Vitest addon。对于仍在 Webpack 技术栈或需要零配置 Jest Playwright 组合的团队本文的本地构建工作流依然是经过官方验证的稳定方案。小结本文完整拆解了 Storybook Test Runner 的“本地构建 CI 工作流”在 GitHub Actions 中用build-storybook产出静态产物以http-server托管在 6006 端口通过wait-on探测就绪后由concurrently -k -s first编排执行test-storybook测试结束后自动回收服务器并把退出码正确回传给 CI。这套方案无需公网部署即可在任何 CI 供应商上运行 Storybook 组件测试适合需要认证访问或希望测试与部署解耦的项目若 Storybook 可公开访问也可改用deployment_statusTARGET_URL的部署式工作流。两种方案共享同一套安装、配置与 CLI 参数体系可从 test-runner.mdx 获取全部细节。【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 17:48:54

无刷双馈电机原理、控制与应用全解析

1. 无刷双馈电机的独特魅力 第一次接触无刷双馈电机(Brushless Doubly-Fed Machine,简称BDFM或BDFIG)是在2015年的一个风电项目现场。当时工程师指着机舱里那个比传统双馈电机小一号的设备说:"这玩意儿不用碳刷,维…

2026/9/10 17:48:54

中鸣MR-RCU轨迹赛裸机C工程解析与开发实战

简介:本资源是面向中小学生及机器人竞赛初学者的中鸣机器人超级轨迹赛实战参考程序包,聚焦赛道识别、运动控制与硬件协同等核心能力训练。压缩包共4个文件,含2个C语言源码(主控程序与硬件交互模块)、1张PNG轨迹示意图及…

2026/9/10 17:48:54

物联网设备分组与权限管理的最佳实践

1. 项目概述:无人值守设备管理的核心痛点 在物联网和边缘计算快速发展的今天,企业运维团队常常需要同时管理数百甚至上千台无人值守设备。这些设备可能分布在不同的地理位置,承担着数据采集、边缘计算、自动化控制等关键任务。传统的人工逐台…

2026/9/10 17:48:54

Solidworks导出URDF文件过大的优化技巧

1. 问题背景:为什么Solidworks导出的URDF文件过大?在机器人仿真领域,Solidworks作为主流的三维建模软件,常被用于机械结构设计。当我们需要将设计好的机器人模型导入MuJoCo等物理引擎进行运动学/动力学仿真时,通常需要…

2026/9/10 17:43:54

西门子SMART200 PLC实现烘箱PID温度控制方案

1. 项目概述这个案例展示了如何用西门子SMART200 PLC实现烘箱流水线的4路加热PID温度控制。作为工业自动化领域的经典应用,温度控制在食品加工、电子元件生产、化工等行业中都非常常见。我最近在一个食品包装厂的烘箱改造项目中就采用了类似的方案,实测效…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码