update
This commit is contained in:
57
e2e/perf-optimizations.spec.ts
Normal file
57
e2e/perf-optimizations.spec.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
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_NODE:Playwright 自己是 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([])
|
||||
})
|
||||
Reference in New Issue
Block a user