release: v1.28.1 — WebUI 名词解释折叠帮助 + AI 解读 Prompt 导出 + WF 窗口序列化修复(to_json_native 有限 float 落入 str 兜底,逐窗指标变字符串)

This commit is contained in:
GitHub
2026-09-02 15:49:41 +08:00
parent 534ab0e0c8
commit 8a5ed52a1f
14 changed files with 1354 additions and 17 deletions
+56 -3
View File
@@ -43,12 +43,65 @@ test('勾选附加分析后出现 WF 逐窗柱状图与一条龙评估卡', asyn
timeout: 60_000,
})
await expect(page.locator('.wf-chart canvas')).toBeVisible({ timeout: 120_000 })
await expect(page.getByText('盈利窗占比', { exact: true })).toBeVisible()
// 收窄到汇总区:词条表里也有「盈利窗占比」(dt),全局 getByText 会触发 strict mode
await expect(page.locator('.wf-summary').getByText('盈利窗占比', { exact: true })).toBeVisible()
await expect(page.locator('.wf-summary .stat')).toHaveCount(6)
// 一条龙评估:综合评分 + 高适配徽标 + 基准对比
// 断言收窄到对应容器:名词解释按钮/词条文案里也含这些词,全局匹配会 strict mode
await expect(page.locator('.eval-panel')).toBeVisible({ timeout: 120_000 })
await expect(page.getByText('综合评分')).toBeVisible()
await expect(page.getByText('对比买入持有')).toBeVisible()
await expect(page.locator('.eval-header').getByText('综合评分', { exact: true })).toBeVisible()
await expect(page.locator('.eval-header').getByText('对比买入持有')).toBeVisible()
await expect(page.getByText(/适配性体检 \d+\/\d+/)).toBeVisible()
})
test('名词解释默认折叠,点击展开显示词条', async ({ page }) => {
await page.goto('/backtest?startDate=2023-01-01&endDate=2025-12-31')
await page.getByLabel('Walk-Forward 样本外验证').check()
await page.getByLabel('一条龙评估').check()
await page.getByRole('button', { name: '开始回测' }).click()
await expect(page.locator('.eval-panel')).toBeVisible({ timeout: 120_000 })
// 词条用 .g-term 类定位,与面板统计标签同名也不冲突
const wfTerm = page.locator('.wf-panel .g-term', { hasText: '每窗独立开仓' })
const evalTerm = page.locator('.eval-panel .g-term', { hasText: '高适配' })
const metricTerm = page.locator('.metric-wrap .g-term', { hasText: '卡玛比率' })
// 默认隐藏(内容在 DOM,但折叠框高度为 0)
await expect(wfTerm).toBeHidden()
await expect(evalTerm).toBeHidden()
await expect(metricTerm).toBeHidden()
// 点击「名词解释」按钮逐个展开
await page.locator('.wf-panel .help-toggle').click()
await expect(wfTerm).toBeVisible()
await page.locator('.eval-panel .help-toggle').click()
await expect(evalTerm).toBeVisible()
await page.locator('.metric-wrap .help-toggle').click()
await expect(metricTerm).toBeVisible()
})
test('AI 解读 Prompt 弹窗打包回测配置与各段报告', async ({ page }) => {
await page.goto('/backtest?startDate=2023-01-01&endDate=2025-12-31')
await page.getByLabel('Walk-Forward 样本外验证').check()
await page.getByLabel('一条龙评估').check()
await page.getByRole('button', { name: '开始回测' }).click()
await expect(page.locator('.eval-panel')).toBeVisible({ timeout: 120_000 })
await page.getByRole('button', { name: '🤖 AI 解读' }).click()
const area = page.locator('.ai-prompt-area')
await expect(area).toBeVisible()
// textarea 的内容在 value 属性而非文本节点,用 toHaveValue(正则=子串匹配)
await expect(area).toHaveValue(/# 角色设定/)
await expect(area).toHaveValue(/# 回测配置/)
await expect(area).toHaveValue(/SZ:000001(日线)/)
await expect(area).toHaveValue(/- 总收益率:/)
await expect(area).toHaveValue(/Walk-Forward 样本外验证/)
await expect(area).toHaveValue(/# 一条龙评估/)
await expect(area).toHaveValue(/# 评级(不看收益率/)
await expect(area).toHaveValue(/# 背景与免责/)
// 关闭弹窗回到报告
await page.getByRole('button', { name: '关闭' }).click()
await expect(area).toBeHidden()
})