目前,我正在评估k6是否适合我们的负载测试需求。我们有一个相当传统的网站架构,使用Apache和PHPand一个MySQL数据库。用k6发送简单的HTTP请求看起来很简单,我认为我们可以用它测试所有的主要功能,因为我们不依赖于JavaScript,因为大多数页面都是静态的。
但是,我不知道如何处理资源(样式表、图像等)。在请求中返回的HTML中引用的。我们也需要加载它们,因为这有时会导致数据库请求,这必须是负载测试的一部分。
在k6中是否有一些开箱即用的功能,允许您像浏览器一样加载所有资源?我知道k6做而不是呈现页面,我不需要它。我只需要请求HTML中的所有资源。
发布于 2020-03-30 12:10:51
你基本上有两种选择,两种方法都有它们的警告:
import http from "k6/http";
import {parseHTML} from "k6/html";
export default function() {
const res = http.get("https://stackoverflow.com");
const doc = parseHTML(res.body);
doc.find("link").toArray().forEach(function (item) {
console.log(item.attr("href"));
// make http gets for it
// or added them to an array and make one batch request
});
}将产生
NFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=4f32ecc8f43d
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a
INFO[0001] /opensearch.xml
INFO[0001] https://cdn.sstatic.net/Shared/stacks.css?v=53507c7c6e93
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/primary.css?v=d3fa9a72fd53
INFO[0001] https://cdn.sstatic.net/Shared/Product/product.css?v=c9b2e1772562
INFO[0001] /feeds
INFO[0001] https://cdn.sstatic.net/Shared/Channels/channels.css?v=f9809e9ffa90如您所见,一些urls是相对的,而不是绝对的,所以您需要处理这个问题。在这个例子中,只有一部分是css,所以可能需要更多的过滤。这里的问题是,您需要编写代码,如果您添加了一个相对链接或其他什么东西,您需要处理它。幸运的是,k6是可编写脚本的,因此您可以重用代码:D。
发布于 2020-04-07 08:27:47
我遵循了МихаилСтойков的建议,编写了自己的函数来加载资源。也许这会对未来的读者有所帮助。您可以设置加载资源的方式(使用options.concurrentResourceLoading进行批处理或顺序获取)。
/**
* @param {http.RefinedResponse<http.ResponseType>} response
*/
export function getResources(response) {
const resources = [];
response
.html()
.find('*[href]:not(a)')
.each((index, element) => {
resources.push(element.attributes().href.value);
});
response
.html()
.find('*[src]:not(a)')
.each((index, element) => {
resources.push(element.attributes().src.value);
});
if (options.concurrentResourceLoading) {
const responses = http.batch(
resources.map((r) => {
return ['GET', resolveUrl(r, response.url), null, { headers: createHeader() }];
})
);
responses.forEach(() => {
check(response, {
'resource returns status 200': (r) => r.status === 200,
});
});
} else {
resources.forEach((r) => {
const res = http.get(resolveUrl(r, response.url), {
headers: createHeader(),
});
!check(res, {
'resource returns status 200': (r) => r.status === 200,
});
});
}
}https://stackoverflow.com/questions/60927653
复制相似问题