运行多个js文件,而不是每次都启动和停止服务器

时间:2014-09-22 13:36:50

标签: javascript phantomjs

我有一个运行测试套件的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,甚至是文件名数组,或类似的东西。

1 个答案:

答案 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。我不确定是否可以清除缓存。

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

如果您只使用一个page实例,可以尝试在主文件中创建它并分别将其传递给每个测试文件。如果这是一个问题,这可能会修复你的内存消耗。

2。没有改变

您也可能无需更改测试文件。您可以使用fs.read将测试文件读入字符串。您可以使用字符串操作/正则表达式更改某些内容,以便为phantom.exit();交换done();并添加一行来关闭页面。

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