首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用k6下载整个网站

用k6下载整个网站
EN

Stack Overflow用户
提问于 2020-03-30 09:33:16
回答 2查看 7.3K关注 0票数 4

目前,我正在评估k6是否适合我们的负载测试需求。我们有一个相当传统的网站架构,使用Apache和PHPand一个MySQL数据库。用k6发送简单的HTTP请求看起来很简单,我认为我们可以用它测试所有的主要功能,因为我们不依赖于JavaScript,因为大多数页面都是静态的。

但是,我不知道如何处理资源(样式表、图像等)。在请求中返回的HTML中引用的。我们也需要加载它们,因为这有时会导致数据库请求,这必须是负载测试的一部分。

在k6中是否有一些开箱即用的功能,允许您像浏览器一样加载所有资源?我知道k6做而不是呈现页面,我不需要它。我只需要请求HTML中的所有资源。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-30 12:10:51

你基本上有两种选择,两种方法都有它们的警告:

  1. 记录您的会话 -您可以直接从浏览器导出har,如图中所示,也可以使用延展作为浏览器,这里是火狐色度。如果没有k6云帐户,两者都可以使用,您只需将它们设置为下载har,当您单击stop时,har就会自动(而且有点安静)下载。然后要么使用in k6 har转换器(这是不推荐的,但仍然有效),要么使用新的har-to-k6转换器。 如果您有大量的页面和/或资源,甚至如果您有一个页面样式的应用程序,这种方法尤其好,因为它只是获得浏览器请求的哈尔,然后将其转换为脚本。而且,如果没有需要输入的动态内容(用户名/密码),则可以像大多数时候一样使用最终脚本。 这种方法的最大问题是,如果您添加了一个css文件,则需要重新执行整个练习。如果您的css/js文件名在每次更改或类似的更改上更改,这就更有问题了。这就是下一个方法的优点:
  2. 使用parseHTML,然后找到您关心的元素,并为它们提出请求。
代码语言:javascript
复制
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
     });
}

将产生

代码语言:javascript
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2020-04-07 08:27:47

我遵循了МихаилСтойков的建议,编写了自己的函数来加载资源。也许这会对未来的读者有所帮助。您可以设置加载资源的方式(使用options.concurrentResourceLoading进行批处理或顺序获取)。

代码语言:javascript
复制
/**
* @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,
    });
    });
}
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60927653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档