K6中的测试使用异步如何在执行另一个请求之前编写等待响应的代码

问题描述 投票:0回答:1

我正在寻找解决方案,但我已经进行了各种配置,但未能获得满意的结果。

我需要做什么?队列取出 4 个 ID,将它们一一传递出去执行,等到队列上的任务结束或执行任务的时间超过,然后再取出下一个。

因此,我需要获取 4 个 id 的列表(我将从数据库下载它们,目前我通过写入列表中的 ID 来缩短条目),它们在队列中执行。首先,一个ID添加请求url,需要等待执行完成并返回响应。如果执行时间超过7分钟。这应该返回我http代码400。 最初,我希望整个测试最多持续 30 分钟。

这就是我的代码的样子:

import http from 'k6/http';
import { expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
import { check, sleep } from 'k6';


let idsParam = `
    65056522
    65056521
    65056520
    65056519
    65056518
    65056517
`;

let params = {
  timeout: '780s',

};


export const optons = {
  vus: 1,
  timeout: '480s',
  duration: '10m',
};

let data = idsParam.trim().split('\n').slice(1).map(row => row.trim());

export default async function () {

    for (let id of data) {
        let url = `https://pagequeue.com/task/{id}`;

        console.info(`Request for ID ${id} `);
        let res = await http.asyncRequest('GET', url, null, params);
        
            // Wait until the request is processed
        if (res.status != 200) {
          console.warn(`Request for ID ${id} is still processing with status ${res.status}...`);
          console.warn(res);
          sleep(60);
        } 


        // Check if the response status is 200 or 400, mark as failure otherwise
        check(res, {
        'Status is 200': (r) => r.status === 200,
        });

        // Check if the response status is 200 or 400, mark as failure otherwise
        check(res, {
        'Status is 400': (r) => r.status === 400,
        });
        
        expect(res.status).to.equal(200);
    }
    
}

对于队列中最长 1 分钟的任务。它工作得很好,但是对于需要 3 分钟以上的请求,不要等待,而是使用 id 接受另一个请求。尽管增加了等待http请求异步响应的超时时间,但它对我不起作用,只有测试结束,尽管将时间设置为20分钟。 10m 30秒后结束。在队列端,服务准备返回 http 代码响应。 我在 jmeter 上检查了这一点,它在那里工作得很好。目前我需要使用我的k6来编写测试。谁能建议它应该是什么样子?

javascript asynchronous testing async-await k6
1个回答
0
投票

我找到了适合我的案例的解决方案。也许这对某人有用。我写的:

import http from 'k6/http';
import { check, sleep } from 'k6';
import { describe } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';

let params = {
    timeout: '420s'
};

let data = [1, 2, 3, 4, 5, 6];

export let options = {
    vus: 1, 
};


function sendRequest(id) {
    
    return new Promise((resolve, reject) => {

        let url = `https://pagequeue.com/task/${id}`;
        let res = http.get(url, params);

        let checkRes = check(res, {
            'Status is 200': (r) => r.status === 200,
        });

        if (!checkRes) {
            reject(`Request for ID ${id} failed with status ${res.status}`);
            console.log('Response time was ' + String(res.timings.duration) + ' ms');
        } else {
            console.log(`Request for ID ${id} completed with status ${res.status}`);
            console.log('Response time was ' + String(res.timings.duration) + ' ms');

            resolve();
        }
    });
}

async function runQueue() {

    for (const [index, id] of data.entries()) {
        
        try {
            await sendRequest(id);
            continue;
        } catch (error) {
            console.warn(error);
        }
    }
}

export default function() {

    describe('[Queue service] Run task from list by id', () => {
        runQueue();
    });
}

在顶部我添加了

params
,在哪里放置超时,我们等待完成请求多长时间。超时的默认值为 60 秒。

© www.soinside.com 2019 - 2024. All rights reserved.