Javascript 运行多个js文件,而无需每次启动和停止服务器

Javascript 运行多个js文件,而无需每次启动和停止服务器,javascript,phantomjs,Javascript,Phantomjs,我有一个运行测试套件的grunt配置,目前我无法改变它的结构 在某些情况下,我有一个文件路径数组,并执行如下操作: files.forEach(function(testFile){ grunt.task.run( 'shell:phantomjs:' + testFile ); }); 及 这种方法的问题在于速度。 当我为每个文件运行phantomjs时,每次运行时服务器的设置和关闭会使我的测试运行时间超过4分钟 我正在寻找一种使用blob路径调用phantomjs的方法,比如tes

我有一个运行测试套件的grunt配置,目前我无法改变它的结构

在某些情况下,我有一个文件路径数组,并执行如下操作:

files.forEach(function(testFile){
   grunt.task.run( 'shell:phantomjs:' +  testFile );
});

这种方法的问题在于速度。
当我为每个文件运行phantomjs时,每次运行时服务器的设置和关闭会使我的测试运行时间超过4分钟


我正在寻找一种使用blob路径调用phantomjs的方法,比如
tests/***.js
,或者甚至是一个文件名数组,或者诸如此类的东西

通过测试文件
tests/***/.js
是一种全局通配符语法,其中有。问题在于PhantomJS的运行时与node.js不同,fs模块的功能也大不相同。因此,您不能只需要节点glob。您必须移植到PhantomJS。在PhantomJS中包含这项权利是有必要的

如果您有许多测试文件,并且希望将它们分别传递给主PhantomJS脚本,那么您可能会遇到命令行调用长度的问题。根据shell/OS的不同,缓冲区可能仅为命令和测试文件保留有限数量的字符

最简单的方法是将所有测试文件整理成一个单独的文件列表,并将该文件传递到主PhantomJS脚本中。也可以在主脚本中包含文件列表

连续运行多个脚本 不管您做什么,您都需要在测试之间清除cookie和localStorage。我不确定是否可以清除缓存

1.调整 您可能需要调整测试脚本。调用
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();
});
如果在整个过程中只使用一个
页面
实例,则可以尝试在主文件中创建它,并将其分别传递给每个测试文件。如果这是一个问题,这可能会修复内存消耗

2.不变 也有可能您不需要更改测试文件。您可以使用
fs.read
将测试文件读入字符串。您可以使用字符串操作/regex来交换
phantom.exit()用于
完成()并添加一行以关闭页面

完成后,您可以
eval
字符串(异步)。使用
eval
可能不是安全问题,因为您可能已经编写了测试脚本

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();
});