E2E 測試的演進


Selenium是一套javascript開發[1]的類庫,用於對瀏覽器執行一些行爲, 例如點擊網頁上的一個按鈕。爲了避開瀏覽器的同源策略,selenium類庫和web application必須綁定在一起。 同源策略(Same-origin policy) 是web application 中重要的安全模型[2],在這個模型中,瀏覽器只允許一個網頁訪問擁有相同“origin”的網頁。這裏“origin”指的是URI scheme,host name 和port number的組合。在這一階段,測試腳本是一些表格式的符號腳本,這些符號腳本由selenium core 類庫進行解析成javascript。

和web application 綁定在一起的Selenium顯然不是一個好的架構。想象一下,在這種模式下,對於每個web application的每一次測試,都要重複同樣的步驟,即綁定一個selenium上去,很容易出錯而且效率低下。因此,人們引入了代理服務器,用來將selenium類庫解析好的測試指令注入(inject)網頁的head section。不好意思,本人知識有限,暫時只能把它理解爲類似CORS[3][4]的機制。如果有朋友看到這段話並且給予肯定或指正,鄙人不勝感激。

然而proxy的模式仍然讓人們難以忍受,而這個時候許多高級的通用性語言開始在自動化測試領域廣泛發揮起了作用。Selenium的開發者爲這些高級語言分別開發了客戶端的API,通過調用這些API,命令以wire protocol[5]的形式被高級語言發送到selenium server。這裏的wire protocol指的是運行在傳輸層之上的應用層protocol。我猜,很久之前,第一次被大家廣泛使用的就應該是這一模式下的selenium(哎,暴露了我的年齡)。但是這些API的設計難稱完美,並廣爲詬病



相信大家最熟悉的應該是這一模式,它集成了selenium和webdriver,有人叫他selenium 2,甚至有人直呼其爲WebDriver (可憐的selenium)。可以說這個版本的selenium已經算的上是一個非常出色的工具了。API被重新設計成JSON形式,簡潔而優雅,而且大多數主流高級語言都支持JSON。同時,瀏覽器以原生的模式啓動,WebDriver作爲瀏覽器上的extensions同Selenium Webdriver進行交互,同真實的場景更加接近。這種模式很美,但是並不完美。首先它能否很好的發揮作用,取決於作爲extension部署在瀏覽器上driver對API的支持程度。說到這裏,很多朋友可能已經知道我在指誰了,不錯,就是IE。用Webdriver做過測試的人都應該體會過在IE上跑case的痛苦,簡直“欲仙欲死”。另一個問題在於selenium server,driver和瀏覽器版本的兼容性很難控制。例如,selenium server 2.53能很好的支持firefox45,但是如果需要把firefox45升級到47+,就需要把selenium server 升級到3.X。這不是一個輕鬆的過程,因爲selenium的許多API發生了較大的變動。

好消息是目前,JSON wire protocol已經成爲了Web 領域的標準,稱之爲WebDriver protocol。所有的瀏覽器都同意對其進行支持,並將driver集成到自己的產品裏。也就是說driver不再以extension的形式同瀏覽器交互,而是以所謂的“Native call”。Selenium革了瀏覽器開發商的命的同時,也革了自己的命。

[1] https://github.com/SeleniumHQ/selenium/blob/master/javascript/node/selenium-webdriver/index.js#L23
[2] https://en.wikipedia.org/wiki/Same-origin_policy
[3] https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
[4] https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
[5] https://en.wikipedia.org/wiki/Wire_protocol

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章