使用PhantomJS进行性能testing

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

我在下面尝试过,但是这并不能解决我的目的。

  • PhantomJS支持访问单个页面并查询页面上所需的信息,但是不提供任何选项来模拟并发连接
  • Nodeload提供了加载testing服务器的function,但是没有任何选项可以从页面中检索信息。

是否有其他的框架,我可以用来做负载testing以及页面抓取?

您可以使用PhantomJS(和SlimerJS)来完成这项工作:为每个请求创build一个新的page实例。 下面的脚本是一个完整的例子。 (警告:如果您的页面请求大量其他资源,则是相当详细的)。左边的数字是自脚本启动以来的毫秒数。

在我的机器example.com指向本地主机,瓶颈是Apache。 例如,当我运行N = 30时,大约需要5秒钟的时间。 如果我再立即运行它,耗时0.75秒(因为已经有足够的Apache实例已经启动)。 当我尝试N = 100时,花费了大约12秒,并在我可怜的笔记本电脑上创造了巨大的负担。

这足以向我certificate浏览器的6连接限制没有受到打击,并且所有100个连接同时真正运行。 如果对于你来说还不够平行的话,用一个bash脚本来启动8个PhantomJS实例(假设你有8个内核)。 注:所有页面实例共享一个浏览器caching。 所以我看到一个单一的jQuery请求,例如。

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

(询问PhantomJS是否可以configuration为不共享caching,或者如果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 } 

看看LoadBooster( https://www.loadbooster.com )。 它使用PhantomJS / CasperJs来分发testing。 PhantomJS / CasperJS将parsing并呈现每一页,执行客户端脚本。 PhantomJS / CasperJS方法更容易编写testing场景来支持复杂的AJAX沉重的Web 2.0应用程序。

免责声明:我为LoadBooster工作。