2014-09-22 56 views
2

我有一個運行測試套件的grunt配置,目前,我無法改變它的結構。運行多個js文件,無需每次啓動和停止服務器

在某些時候,我有一個文件路徑的數組,這樣做:

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

grunt.initConfig({ 
    phantomjs: { 
     command: function(testFile){ 
      return 'node_modules/phantomjs/bin/phantomjs ' + testFile; 
     } 
    } 
}); 

這種方法的問題是速度。
當我爲每個文件運行phantomjs時,每次運行時服務器的設置和刪除都會使我的測試運行時間超過4分鐘。

我正在尋找一種方法來調用像tests/**/*.js這樣的blob路徑的phantomjs,或者甚至是一些文件名或類似的東西。

+0

謝謝,經過幾個小時的調查,我得出了同樣的結論。 @ArtjomB。你會把它放在一個答案的形式,所以我可以upvote和接受它? – 2014-09-25 11:39:41

回答

1

你有兩個問題需要處理。

通過測試文件

tests/**/*.js是其中有一個node.js module一個水珠通配符語法。問題是PhantomJS具有與node.js不同的運行時,並且fs模塊具有完全不同的功能。正因爲如此,你不能只需要節點glob。您必須將it連接到PhantomJS。在PhantomJS中包含feature-request這個權利。

如果您有很多測試文件,並且您想將它們分別傳遞給主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(); 
}); 

如果你只使用一個page實例貫穿你可以嘗試創建它主文件並將其分別傳遞給每個測試文件。這可能會解決你的內存消耗,如果這是一個問題。

2。沒有變化

也有可能你不需要改變你的測試文件。您可以使用fs.read將測試文件讀入字符串。您可以使用字符串操作/正則表達式來更改phantom.exit();done();並添加一行以關閉頁面。

當你完成,你可以只是eval字符串(異步)。使用eval可能不是安全問題,因爲您可能已編寫測試腳本。