【问题标题】:Performance testing with PhantomJS使用 PhantomJS 进行性能测试
【发布时间】:2013-05-01 16:11:57
【问题描述】:

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

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

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

我可以使用其他框架来进行负载测试和页面抓取吗?

【问题讨论】:

    标签: node.js load-testing phantomjs


    【解决方案1】:

    您可以使用 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
    }
    

    【讨论】:

    【解决方案2】:

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

    免责声明:我为 LoadBooster 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多