2012-02-28 63 views
0

我試圖從一個Ant構建腳本中使用PhantomJS獲取一組異步QUnit測試。我似乎正在努力,但似乎應該有一個更好的方法來實現它。在PhantomJS中從Ant運行異步QUnit測試

運行時PhantomJS負載是如下的腳本(簡化):

var page = require("webpage").create(); 

page.onConsoleMessage = function(msg) { 
    if(msg.indexOf("FINISHED") > -1) { 
     var failed = msg.split(" "); 
     phantom.exit(failed[1]); 
    } 
}; 

page.open("testrunner.html", function() { 
    page.evaluate(function() { 
     QUnit.done = function(result) { 
      console.log("FINISHED " + result.failed); 
     }; 
    }); 
}); 

這將加載包含測試(testrunner.html)的文件。它使用PhantomJS evaluate方法在加載頁面的上下文中運行一些代碼。該代碼將事件處理程序綁定到QUnit done事件。在事件處理程序中,所發生的只是對console.log的簡單調用。

PhantomJS在默認情況下不會對console.log調用做任何事情,所以我還爲PhantomJS onConsoleMessage事件綁定了一個事件處理程序。當執行QUnit.done事件處理程序中的console.log調用時,將觸發onConsoleMessage事件。如果控制檯消息匹配給定的字符串,那麼我們知道測試已經完成。然後我們可以退出PhantomJS,退出代碼等於失敗單元測試的數量(Ant腳本使用它來確定這部分構建是否成功)。

我的問題是,有沒有更好的方法來找出單元測試何時完成運行?

回答

0

您是否檢出了phantom js網站上提供的qunit亞軍? https://github.com/ariya/phantomjs/blob/1.2/examples/run-qunit.js

本質上,你只需將它指向你的qunit測試頁面(testrunner.html),它會擦除​​頁面以查看是否有任何失敗並將結果輸出到控制檯。您可以修改它以打印到可以集成到構建腳本中的文件。

+0

謝謝,我還沒有看到。然而,它看起來非常像我已經在做的事情,只需將'onTimeEmptyMessage'回調切換到一個'setTimeout'循環,等待一些條件成立,或者等待一段時間才能通過。我真的想避免這樣的事情(例如1個問題 - 如果由於某種原因,請求花費的時間超過了允許的最大時間?)這就是爲什麼我使用了我使用的onConsoleMessage事件方法此時此刻。 – 2012-03-01 23:09:17

+0

我同意,你的方法更簡潔,因爲你有知道你的測試完成的好處(給出'QUNIT.done'回調)。我可以看到'waitFor'方法對於不用的情況很有用,比如當你等待頁面上的元素可見時。我實際上在做一些與你在做什麼非常相似的事情,除了不是指向qunit測試頁面,而是指向我網站上的頁面,在頁面中注入我的qunit測試,以便我可以在頁面上進行集成測試HTML/JS。 – 2012-03-02 02:32:10