概述
百度手機瀏覽器T5內核(下稱T5內核)繼承自 android 源碼中帶的 WebKit,增加了許多特有的功能,如主體突出 ,WebGL等HTML5相關的其他功能。但是WebKit 的源碼非常龐大,改動一點就有可能導致其他原有的功能無法正常工作。用什么方法可以保證新增的功能正常工作,而又保證不影響之前的功能是一個困擾團隊很久的問題。早期的方案是拿瀏覽器去加載主流網站,查看有沒有問題。但這樣無法保證主流網站能夠覆蓋所有的情況,最終從開源的 WebKit 項目中找到了 LayoutTest,如前一篇所述 Layout Tests 理論部分 (Layout Tests: Theory) 。本文開始介紹 LayoutTest 是如何引T5 內核的,LayoutTest 的結構介紹,移植過程中遇到的問題等。
LayoutTest 的引入
Android 的源碼庫就是一個寶藏。
我們上面遇到的問題,android 團隊在把WebKit 從PC平臺移植到手機平臺時也會遇到,所以他們必然需要一種方式來保證發布的 WebKit 是可用的。一方面他們要保證系統原生瀏覽器可以滿足大家的日常需要,另一方面他們還要支持開發者基于 WebView 控件的二次開發(現在許多 Hybrid 的應用都是包裝WebView 做的)。沿著這個思路我在 android 源碼中找到了 webkit/LayoutTests 以及 DumpRenderTree 和 DumpRenderTree2。
其中 DumpRenderTree 是把測試用例保存到 sdcard,去加載執行。源碼比較少,但是工具本身經常Crash,需要分批次運行才可以。后來主要精力就放在了 DumpRenderTree2 上面。
DumpRenderTree2 則是把測試用例放到 apache 服務器上,通過網絡加載。源碼比 DumpRenderTree 多,結構也更為復雜。但生成的測試報告比較容易看,所以目前主要在維護這個。
LayoutTest 的主要組成
T5內核 LayoutTest 對 DumpRenderTree2 做了許多改動,但主要結構沒有太多變化, 為了方便維護,我們把 DumpRenderTree2 復制出來,用 git 做代碼管理:
external/webkit 目錄下有個 LayoutTests 目錄,里面存放 LayoutTests 的測試用例,Android 自帶的測試用例有 3166 個,主要以 php, html, xhtml, js 為后綴 ,測試用例相同目錄下會有同名但后綴名為 txt 的文件, 是期望結果。測試的原理是用 封裝了 統一內核SDK 和 T5內核 的 BWebView 來加載待測試的 html 文件,然后用 BWebView 的接口把 頁面展示的內容寫入到一個文本文件中,對比 xxx_actual.txt 和 xxx_expected.txt 是否一致。如果一致這個測試就 pass,否則就fail
LayoutTest_SDK-2.0/assets 下面有兩個比較重要的 python 腳本:
run_apache2_webkit.py 負責啟動 apache 服務器,啟動后,可以通過這臺電腦的瀏覽器訪問 http://127.0.0.1:8000/LayoutTests/ 來瀏覽測試用例目錄,對應到 webkit/LayoutTests.
run_layout_tests.py 負責傳遞參數給 LayouTest.apk 告訴它要運行的測試用例的路徑。 比如 fast, fast/encoding, fast/encoding/css-charset-evil/css-charset-evil.html 等,如果什么都不加,它會默認使用 http://127.0.0.1:8000/LayoutTests/ 下面所有的測試用例。
LayoutTest 的執行過程示意圖:
LayoutTest 的運行方式
1. 啟動模擬器
2. run_apache2_webkit.py restart # 會啟動127.0.0.1:8000/LayoutTests 對應的case 目錄:webkit/LayoutTests
3. run_layout_tests.py -s ${DEVICE_ID} fast/url #會啟動 LayoutTest_SDK-2.0.apk 訪問 127.0.0.1 上面的測試用例
4. 運行完畢,腳本會把執行結果 details.html 用 adb pull 拉出來,和上一次的執行結果對比,這樣可以比較清楚的知道兩次執行之前提交的代碼對產品質量的影響:
+storage/domstorage/localstorage/window-open.html
+storage/domstorage/sessionstorage/window-open.html
dom :
+dom/html/level2/html/HTMLStyleElement03.html
+dom/html/level2/html/HTMLTableRowElement13.html
+dom/xhtml/level2/html/HTMLDirectoryElement01.xhtml
+dom/xhtml/level2/html/HTMLElement120.xhtml
+dom/xhtml/level2/html/HTMLIFrameElement10.xhtml
-dom/html/level2/html/HTMLImageElement01.html
-dom/html/level2/html/HTMLTableCellElement06.html
原文轉自:http://qa.baidu.com/blog/?p=1138&qq-pf-to=pcqq.c2c