K6浏览器负载测试check函数误报问题求助
K6浏览器负载测试中check函数误报问题解决方法
问题描述
在基于浏览器的K6负载测试套件中,执行测试后出现waiting for navigation: timed out after 30s错误,但所有check函数均显示通过,实际这些check本应失败,需要正确捕获check的失败情况。
测试代码示例
describe('[Load Testing - Browser]', async () => { // Search Attorney await searchAttorney.goto(); check(page, { 'Should be at Home Page': () => searchAttorney.homePageCheck() }); await searchAttorney.searchAttorney(); // Select Sub Category check(page, { 'Should be at Select Sub Category Page': () => subCategory.subcategoryPageCheck() }); await subCategory.subCategoryPage(); page.close(); });
错误日志
ERRO[0086] Uncaught (in promise) waiting for navigation: timed out after 30s executor=per-vu-iterations scenario=ui ✓ Should be at Home Page ✓ Should be at Select Sub Category Page █ [Load Testing - Browser] browser_data_received..........: 7.5 MB 90 kB/s browser_data_sent..............: 314 kB 3.8 kB/s browser_http_req_duration......: avg=1.18s min=637µs med=286.62ms max=9.26s p(90)=3.47s p(95)=7.25s browser_http_req_failed........: 0.00% ✓ 0 ✗ 220 browser_web_vital_cls..........: avg=0 min=0 med=0 max=0 p(90)=0 p(95)=0 browser_web_vital_fcp..........: avg=7.65s min=6.26s med=7.65s max=9.03s p(90)=8.76s p(95)=8.9s browser_web_vital_fid..........: avg=4.15ms min=1.8ms med=4.15ms max=6.5ms p(90)=6.03ms p(95)=6.26ms browser_web_vital_inp..........: avg=144ms min=144ms med=144ms max=144ms p(90)=144ms p(95)=144ms browser_web_vital_lcp..........: avg=8.35s min=7.04s med=8.35s max=9.66s p(90)=9.39s p(95)=9.53s browser_web_vital_ttfb.........: avg=2.6s min=273.4ms med=2.98s max=4.15s p(90)=3.98s p(95)=4.07s ✓ checks…: 100.00% ✓ 2 ✗ 0 data_received…: 437 kB 5.3 kB/s data_sent…: 4.2 kB 51 B/s group_duration…: avg=5.99s min=5.99s med=5.99s max=5.99s p(90)=5.99s p(95)=5.99s http_req_blocked…: avg=179.79ms min=0s med=0s max=570.53ms p(90)=539.39ms p(95)=554.96ms http_req_connecting…: avg=87.19ms min=0s med=0s max=269.22ms p(90)=261.57ms p(95)=265.4ms http_req_duration…: avg=3.05s min=0s med=2.62s max=7.43s p(90)=6.42s p(95)=6.93s { expected_response:true }…: avg=5.96s min=5.03s med=5.4s max=7.43s p(90)=7.03s p(95)=7.23s http_req_failed…: 50.00% ✓ 3 ✗ 3 http_req_receiving…: avg=2.64s min=0s med=2.34s max=6.11s p(90)=5.59s p(95)=5.85s http_req_sending…: avg=343.1µs min=0s med=258.05µs max=940.8µs p(90)=771.25µs p(95)=856.02µs http_req_tls_handshaking…: avg=84.76ms min=0s med=0s max=275ms p(90)=254.3ms p(95)=264.65ms http_req_waiting…: avg=409.9ms min=0s med=284.31ms max=1.32s p(90)=834.01ms p(95)=1.07s http_reqs…: 6 0.072059/s iteration_duration…: avg=1m21s min=1m21s med=1m21s max=1m21s p(90)=1m21s p(95)=1m21s iterations…: 1 0.01201/s vus…: 1 min=1 max=1 vus_max…: 1 min=1 max=1 running (1m23.3s), 0/1 VUs, 1 complete and 0 interrupted iterations ui ✓ [======================================] 1 VUs 1m23.3s/2m0s 1/1 iters, 1 per VU
原因分析
- 导航超时发生在check之后:日志中的超时错误触发于check执行完毕后的异步操作(如
await subCategory.subCategoryPage()),check已完成并返回通过状态,后续错误不会回溯修改check结果。 - check断言逻辑宽松:
homePageCheck()和subcategoryPageCheck()的实现可能仅检测元素存在而非可见性,或未验证页面URL、加载状态,导致异常场景下仍返回true。 - 未捕获异步操作错误:测试未对异步导航操作添加错误处理,超时错误直接抛出但不影响已完成的check统计。
解决方案
1. 调整check执行时机,确保导航完成后验证
在执行check前,等待页面导航完全完成(如网络空闲或关键元素加载):
await searchAttorney.goto(); // 等待网络空闲,确保页面加载完成 await page.waitForNavigation({ waitUntil: 'networkidle' }); check(page, { 'Should be at Home Page': () => searchAttorney.homePageCheck() });
2. 修正check断言逻辑
确保断言逻辑能准确验证页面状态,比如同时检查URL和关键元素可见性:
// 示例homePageCheck实现 homePageCheck() { return page.url().includes('/home') && page.locator('#home-main-header').isVisible(); }
优先使用isVisible()而非exists(),后者仅检查元素是否在DOM中,不保证可见。
3. 添加错误捕获,关联导航失败与check结果
捕获异步操作错误,手动标记check失败或终止测试:
describe('[Load Testing - Browser]', async () => { try { await searchAttorney.goto(); await page.waitForNavigation({ waitUntil: 'networkidle' }); const homePagePass = check(page, { 'Should be at Home Page': () => searchAttorney.homePageCheck() }); if (!homePagePass) throw new Error('首页验证失败'); await searchAttorney.searchAttorney(); await page.waitForNavigation({ waitUntil: 'networkidle' }); const subCatPagePass = check(page, { 'Should be at Select Sub Category Page': () => subCategory.subcategoryPageCheck() }); if (!subCatPagePass) throw new Error('子分类页验证失败'); await subCategory.subCategoryPage(); page.close(); } catch (err) { // 标记测试失败 check(page, { '测试因错误终止': () => false }); throw err; // 抛出错误终止迭代,确保错误被统计 } });
4. 配置导航超时时间
若页面加载较慢,可延长导航超时时间避免误报:
await page.waitForNavigation({ waitUntil: 'networkidle', timeout: 60000 }); // 设置为60秒
内容的提问来源于stack exchange,提问作者cris07
相关产品推荐
相关产品推荐

