Files
Python-Profiler-Visualizer/e2e/perf-optimizations.spec.ts
2026-09-12 14:19:56 +08:00

58 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, expect, _electron as electron, type ElectronApplication, type Page } from '@playwright/test'
import { join } from 'path'
/**
* 守护 Monaco 懒加载的「运行时」正确性。
*
* v1 这里还有「ELK Worker 在 worker 里完成布局」的用例CallGraph 组件用 ELK 跑
* 布局chore/comprehensive-optimization 把 CallGraph 整个砍掉之后,那条用例
* 失去意义,留着只会锁住"CallGraph 必须存在"的反向约束,移走。
*
* 为什么必须有 e2e 兜lazy 边界一旦加载失败Suspense 只会一直显示 fallback 骨架,
* 页面看起来「在加载」—— typecheck + build 全绿但运行时静默坏掉。修这种 bug 不会
* 让 ESLint / tsc 报警,必须在真窗口里断言。
*/
let app: ElectronApplication
let page: Page
const pageErrors: string[] = []
test.beforeAll(async () => {
// 透传父进程 env但必须剔掉 ELECTRON_RUN_AS_NODEPlaywright 自己是 Electron-as-Node
// 跑的,继承这个变量会让被测应用也退化成纯 Node永远开不出窗口。
const env: Record<string, string> = {}
for (const [k, v] of Object.entries(process.env)) {
if (k !== 'ELECTRON_RUN_AS_NODE' && v !== undefined) env[k] = v
}
app = await electron.launch({ args: [join(__dirname, '..', 'out', 'main', 'index.js')], env })
page = await app.firstWindow()
page.on('pageerror', (e) => pageErrors.push(e.message))
// 启动后等待首屏标题
await expect(page.getByRole('heading', { name: 'Python 程序耗时可视化分析' })).toBeVisible()
await page.reload()
})
test.afterAll(async () => {
await app?.close()
})
test('Monaco 懒加载:骨架屏被真实编辑器替换,且编辑器可编辑', async () => {
// 不 waitForTimeout —— 用 web-first 断言等 lazy chunk 落地
const editor = page.locator('.monaco-editor')
await expect(editor).toBeVisible({ timeout: 30_000 })
// 骨架屏必须让位。它带 role="status" + aria-label="app.editorLoading"App.tsx 用
// useT 拿当前 lang 翻译;中英都覆盖)。默认 lang 是 zh-CN,所以这里断言中文文案。
await expect(page.getByLabel('编辑器加载中…')).toHaveCount(0)
// 编辑器不只是「渲染了个壳」:示例代码必须真的被 Monaco tokenize 出来。
// sample.ts 当前是 `def matinv(A):` —— 跟着示例从「矩阵乘法」改成「线性回归」一并换掉。
await expect(page.locator('.view-line').first()).toBeVisible()
await expect(page.locator('.monaco-editor')).toContainText('matinv')
})
test('全程没有未捕获的渲染进程异常', async () => {
expect(pageErrors).toEqual([])
})