轉載請注明出處: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: