Node.js 使用PhantomJS进行性能测试

Node.js 使用PhantomJS进行性能测试,node.js,load-testing,phantomjs,Node.js,Load Testing,Phantomjs,我正在使用谷歌大豆模板,并开发了服务器端和客户端渲染解决方案。我想使用性能测试对它们进行基准测试。在对客户端部分进行基准测试时,我想等到所有javascript操作都执行完毕后再计算实际响应时间 我在下面试过了,但没能解决我的问题 支持访问单个页面和查询页面上的所需信息,但is不提供任何选项来模拟并发连接 ,提供加载测试服务器的功能,但没有从页面检索信息的任何选项 是否有其他框架可用于负载测试和页面抓取?您可以使用PhantomJS(和SlimerJS)实现这一点:只需为每个请求创建一个新的

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

我在下面试过了,但没能解决我的问题

  • 支持访问单个页面和查询页面上的所需信息,但is不提供任何选项来模拟并发连接
  • ,提供加载测试服务器的功能,但没有从页面检索信息的任何选项

是否有其他框架可用于负载测试和页面抓取?

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

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

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

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

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

/**
*这将并行调用URL的N个实例
*/
变量url=”http://example.com/";
var N=30;
var-cnt=0;
函数onResourceReceived(响应){
log((Date.now()-startTime)+':'+response.stage+':'+response.url);
}
onResourceRequested函数(requestData、networkRequest){
log((Date.now()-startTime)+':Request:'+requestData.url);
}
功能完成(状态){
++碳纳米管;
console.log((Date.now()-startTime)+':COMPLETE(“+cnt+”):“+status+”:“+this.url);
如果(cnt>=N)phantom.exit();
}
var startTime=Date.now();
对于(变量i=0;i
看看LoadBooster()。它使用PhantomJS/CasperJs分发测试。PhantomJS/CasperJS将解析和呈现每个页面,执行客户端脚本。PhantomJS/CasperJS方法更易于编写测试场景,以支持复杂的AJAX密集型Web2.0应用程序


免责声明:我为LoadBooster工作。

<代码>如果你还不够平行,使用BASH脚本启动,比如幻像JS/<代码> 8个实例,我用幻像来在3个不同的解决方案中对一个站点进行剪切/截图,所以如果你去BASH方式,考虑并行。
/**
 * 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
}