我有一个运行测试套件的grunt配置,目前我无法改变它的结构。
在某些时候,我有一个文件路径数组,并执行以下操作:
files.forEach(function(testFile){
grunt.task.run( 'shell:phantomjs:' + testFile );
});
和
grunt.initConfig({
phantomjs: {
command: function(testFile){
return 'node_modules/phantomjs/bin/phantomjs ' + testFile;
}
}
});
这种方法的问题是SPEED 当我为每个文件运行phantomjs时,每次运行时服务器的设置和删除都会使我的测试运行时间超过4分钟。
我正在寻找一种方法,使用像tests/**/*.js
这样的blob路径调用phantomjs,甚至是文件名数组,或类似的东西。
答案 0 :(得分:2)
您需要处理两个问题。
tests/**/*.js
是一个glob通配符语法,其中有一个node.js module。问题是PhantomJS的运行时与node.js不同,fs模块的功能大不相同。因此,您不能只需要node-glob。您必须将it移植到PhantomJS。在PhantomJS中有一个feature-request包含此权利。
如果您有许多测试文件并且想要将它们单独传递给主PhantomJS脚本,则可能会遇到命令行调用长度的问题。根据shell / OS,缓冲区可能只包含命令和测试文件的有限数量的字符。
最简单的方法是将单个文件中的所有测试文件作为列表进行策划,并将此文件传递到主PhantomJS脚本中。您也可以在主脚本中找到文件列表。
无论你做什么,你都需要在测试之间清除cookies和localStorage。我不确定是否可以清除缓存。
您可能需要调整测试脚本。当您致电phantom.exit()
时,整个过程终止。通过覆盖exit
这样的
phantom.exit = function(){};
因为它是本机属性。您需要在模块中更改脚本:
module.exports = function(done){
// your script ...
setTimeout(function(){
// some more of your script
// add clean up and queue next script...
page.close(); // clean up memory consumption; might still be not enough
done(); // call instead of "phantom.exit();"
}, 1000);
};
主脚本如下所示:
var testfiles = ["..."];
var async = require("async"); // install async through npm
testfiles = testfiles.map(function(file){
return require(file);
});
async.series(testfiles, function(err){
console.log("ERROR", err);
phantom.exit();
});
如果您只使用一个page
实例,可以尝试在主文件中创建它并分别将其传递给每个测试文件。如果这是一个问题,这可能会修复你的内存消耗。
您也可能无需更改测试文件。您可以使用fs.read
将测试文件读入字符串。您可以使用字符串操作/正则表达式更改某些内容,以便为phantom.exit();
交换done();
并添加一行来关闭页面。
当你完成后,你可以只eval
字符串(异步)。使用eval
可能不是安全问题,因为您可能已经编写了测试脚本。