天天看點

WebKit自動化回歸測試之LayoutTest實踐 (逾時問題的處理)

轉載請注明出處:http://blog.csdn.net/horkychen

WebKit的回歸測試是由一組腳本構成的Layout Tests,測試内容是測試的網頁和标準結果(Baseline)。其測試腳本執行的基本方式示意如下:

 *腳本會啟動http伺服器以支援網頁加載,在此不做描述。

測試腳本其實就是JavaScript腳本加上這些新對象。需要注意在使用這些對象前最好檢查一下,保持一個相容性,如官網給的例子:

    <script>

    if (window.testRunner)

    {

    testRunner.dumpAsText(true);

    }

   ……

使用WebKit提供的腳本就可以開始測試了: (以下是在WebKit目錄下執行)

 Tools/Scripts/run-webkit-tests --verbose --debug [目标目錄]

  *更多選項,使用Tools/Scripts/run-webkit-tests

--help可以看到。

下面講一個實作,中間要解決一個關于時間控制的問題。

先架環境,下載下傳了Webkit後,還需要從Webkit的代碼庫中導出LayoutTest。在WebKit目錄執行:

  svn export http://svn.webkit.org/repository/webkit/trunk/LayoutTests/ LayoutTests

等吧!有1.5G之大,我可是下了兩天。

說明一下測試目标。測試一下JS Engine對時間控制的準确性。寫了一段JS腳本,會每隔兩秒輸出目前時間及與上次的時間差。是以Document加載完成後,腳本還需要運作一段時間。好在testRunner提供waitUntilDone和notifyDone可以使用。waitUntilDone表示測試程式要等待腳本發送notifyDone才表示測試用例執行結束,然後才能收集結果。否則DumpRenderTree當網頁加載完成後,就後直接Dump,然後走人,而這個時候,這個測試腳本還什麼都沒發生呢。

測試的網頁如下:

然後把腳本放到LayoutTests目錄下:

執行Tools/Scripts/run-webkit-tests腳本,指定運作腳本的目錄就可以了。不幸的是出錯了。

看到是Time-Out的問題(腳本執行時加上--verbose可以看到更多的細節),前面的測試腳本會運作至少20*2s, 也就是至少需要40秒的時間。而run-webkit-tests預設的時間為35s (執行時腳本也有輸出),是以逾時了。喜歡探究一下的,可以看看Scripts/webkitpy/layout_tests/controllers/manager.py。

 run-webkit-tests提供了一個參數可以指定自己的TimeOut設定。

--time-out-ms=TIME_OUT_MS  (針對所有測試用例)

将Time-Out時間設為70秒再試一次:

     Tools/Scripts/run-webkit-tests --verbose --debug --no-build --no-retry --time-out-ms=70000 xxxxx

結果仍然出錯了。真正的問題來了。

這裡關于分析過程省略500字……

最終發現, DumpRenderTree還有一個對于waitUntilDone/notifyDone的限定。預設在收到waitUntilDone後,超過30秒沒有接到notifyDone,就算逾時。相關代碼都在DumpRenderTree工程中:

Mac OS        LayoutTestControllerMac.mm  ->waitToDumpWatchdogInterval指派

     Windows       TestShell.cpp -> 建構函數

是以這裡有兩個Time-Out時間,一個是控制每個測試用例的運作時間,另一個是waitUntilDone等多久的時間。示意如下:

兩個一組合,這個測試還是沒過。而且後者在Mac OS的實作(Windows有入口可以改掉)是Hard Code沒辦法通過參數設定。我們隻能強行改掉它了,關于這個問題我正在聯系WebKit确認準備送出個Bug。

注意,改完後,要使用Tools/Scripts/build-dumprendertree來重新編譯。在run-webkit-tests加--build幫不上你的。

然後再執行一次上面的腳本,就可以看到正常的結果了。測試的結果會被存儲在與DumpRenderTree同級目錄下:

*xxx-actual.txt -> 為實際dump出來的結果 *xxx-diff.txt ->差異比對結果 *xxx-expected.txt -> 标準輸出 *xxx-stderr.txt -> 運作過程中的錯誤資訊輸出

另一種方案,修改layouttest腳本給DumpRenderTree加個--no-timeout使得每個Case幾乎不用考慮逾時的問題。這樣做,風險就太高了,很可能卡死在某個測試用例。

補一張測試執行的示意圖 (英文比較直接一點):

Reference:

繼續閱讀