8

我正在使用 Google 大豆模板,并开发了服务器端和客户端渲染解决方案。我想使用性能测试对它们进行基准测试。在对客户端部分进行基准测试时,我想等到执行所有 javascript 操作来计算实际响应时间。

我在下面尝试过,但它并没有解决我的目的。

  • PhantomJS支持访问单个页面并在页面上查询所需信息,但不提供任何选项来模拟并发连接
  • Nodeload提供了对服务器进行负载测试的能力,但没有任何选项可以从页面中检索信息。

是否有其他框架可以用来进行负载测试和页面抓取?

4

2 回答 2

11

您可以使用 PhantomJS(和 SlimerJS)做到这一点:只需page为每个请求创建一个新实例。下面的脚本是一个完整的例子。(警告:如果您的页面请求大量其他资源,这将非常冗长。)左边的数字是自脚本启动以来的毫秒数。

在我的机器上 example.com 指向 localhost,而瓶颈是 Apache。例如,当我以 N=30 运行时,运行大约需要 5 秒。如果我然后立即再次运行它,则需要 0.75 秒(因为已经启动了足够多的 Apache 实例)。当我尝试使用 N=100 时,它花了大约 12 秒,并在我可怜的笔记本上造成了巨大的负载。

这足以向我证明没有达到浏览器的 6 个连接限制,并且所有 100 个连接真正同时运行。如果这对您来说仍然不够并行,请使用 bash 脚本来启动,比如说,8 个 PhantomJS 实例(假设您有 8 个内核)。注意:所有页面实例都共享一个浏览器缓存。例如,我看到一个对 jQuery 的请求。

完全相同的脚本在 SlimerJS 上运行,但行为完全不同。启动每个实例似乎有更多开销,但更重要的是每个实例都有自己的磁盘缓存。所以我的测试时间涉及到 30 个针对 JQuery 的 Google CDN 请求!

(询问 PhantomJS 是否可以配置为不共享缓存,或者 SlimerJS 是否可以,这可能是另一个 StackOverflow 问题,因为我不知道。)

/**
 * This calls N instances of URL in parallel
 */
var url = "http://example.com/";
var N = 30;

var cnt = 0;

function onResourceReceived(response) {
    console.log((Date.now() - startTime) + ':' + response.stage + ':' + response.url);
}

function onResourceRequested(requestData, networkRequest) {
    console.log((Date.now() - startTime) + ':Request:' + requestData.url);
}

function onCompletion(status) {
    ++cnt;
    console.log((Date.now() - startTime) + ':COMPLETE(' + cnt + '):' + status + ':' + this.url);
    if (cnt >= N) phantom.exit();
}

var startTime = Date.now();
for (var i = 0; i < N; i++) {
    var page = require('webpage').create();
    page.onResourceReceived = onResourceReceived;
    page.onResourceRequested = onResourceRequested;
    page.open(url + "?i=" + i, onCompletion); //Append i to allow tracking
}
于 2013-11-08T02:02:16.140 回答
0

看看 LoadBooster ( https://www.loadbooster.com )。它使用 PhantomJS/CasperJs 来分发测试。PhantomJS/CasperJS 将解析和渲染每个页面,执行客户端脚本。PhantomJS/CasperJS 方法更容易编写测试场景以支持复杂的 AJAX 繁重的 Web 2.0 应用程序。

免责声明:我为 LoadBooster 工作。

于 2017-04-10T06:07:56.660 回答