You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. 导航超时发生在check之后:日志中的超时错误触发于check执行完毕后的异步操作(如await subCategory.subCategoryPage()),check已完成并返回通过状态,后续错误不会回溯修改check结果。
  2. check断言逻辑宽松:homePageCheck()和subcategoryPageCheck()的实现可能仅检测元素存在而非可见性,或未验证页面URL、加载状态,导致异常场景下仍返回true。
  3. 未捕获异步操作错误:测试未对异步导航操作添加错误处理,超时错误直接抛出但不影响已完成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:31