本文翻譯自 The New York Times,原作者為 Silas Ray:https://open.blogs.nytimes.com/2014/04/08/improving-the-user-experience-of-automated-integration-testing/
紐約時報的測試架構開發小組發展全新前端的匯報系統,用以呈現功能測試套件的結果。我們在持續開發之餘,更決定開源我們的專案。
測試工具就好像車子。一般而言,他們可以歸入兩種類別之一:一個是專注于開發者的類型,從引擎向外打造,強調動力與彈性;另一個則是專注于管理者的類型,從車體向內打造,重視易用性與展示方式。由引擎向外的方式能創造非常強大的工具,但通常得拿車體與操控作為代價。另一方面,由車體向內的方式,則傾向打造出非常優雅、簡易的操控,具回饋力的介面,但通常會有個蹩腳的引擎。
有效的測試自動化基本上拆分為兩大部分:告訴電腦如何像用戶 (引擎) 一般產生行為 ,以及,告訴管理者、開發者與開發團隊其他成員,測試做了什麼 (車體與操控)。我們認為,現在已經有許多很棒的方法,可以告訴電腦要做什麼,那就是程式語言。問題在於程式語言在向人們描述它們做了什麼時,一向是不太稱職的。我們決定從一顆好引擎 (Python 與 nose) 開始,在上面打造車體跟操控 (Pocket Change)。
在紐約時報,我們使用以 Python 打造的功能性自動框架。在該框架之上,我們用了 nose 單元測試框架作為測試探索與執行之用。我們的框架使用 Python 的日誌模組建構了許多的自動日誌功能 (服務要求與回應、網頁表單行為、資料庫查詢等)。這給了我們能吐出有用且格式一致資訊的測試,之後再輸出冗長且難看的文字區塊到 stdout/stderr。我們可以在透過 Hudson 執行測試時收集資料,不過卻沒辦法讓輸出更具可讀性,也沒辦法抓取元數據 (metadata),像是測試所在的環境組態等,甚至沒辦法給出有用的歷史快照資料。
為此,我們打造了一個 nose 插件,能夠在執行時間將測試日誌與元數據分流至資料庫。我們還建構了一套網路應用程式,讓結果更容易瀏覽、過濾與閱讀。這麼一來我們不得不被綁定在匯報用 Python 撰寫的測試上,但這個限制還算能接受。我們在功能自動化上有單一框架,堅守這套框架意味著我們不用每次需要新功能程式庫或希望整合新的框架功能時,都要花時間在多種語言之間移植功能。
這套工具有四個部分。Sneeze 是一個 nose 插件,定義了匯報資料庫的核心綱要,並管理匯報介面的狀態以及與 nose 狀態的互動。Sneeze 自己有一個插件介面,揭露了資料庫模型並便於功能延伸。Pocket 是 Sneeze 的插件,負責佇列來自日誌的訊息,並推送至資料庫中。Pocket Change 是供 Sneeze 資料輸出的網路介面。最後的 Kaichu 是 Sneeze 插件,使用 JIRA REST API 與 JIRA 進行互動。
現在,這套系統看似 nose 測試結果的網路圖形介面,然而其建造之時已經著眼於未來的功能,我們計劃加以擴展的部分有:
如果你有興趣,請看一下我們的存儲庫。歡迎提供建議與貢獻。
連接、安裝與其他
GitHub 存儲庫的到達頁面。
從 PyPI (由於 Sneeze 會安裝客制的 nose 版本,推薦使用 virtualenv) 安裝:
$ pip install pocket-change # installs Pocket as well $ pip install sneeze-pocket # installs Sneeze as well $ pip install kaichu # installs Sneeze as well $ pip install nose-sneeze # installs fork of nose 1.3.0
文件: