天天看點

前端中台化,把格局做大:Node.js與測試服務探索

前端中台化,把格局做大:Node.js與測試服務探索

作者 | 侯策

近些年,“前端領域應該如何在公司業務中落地Node.js”這類問題屢見不鮮。

Node.js自2009年誕生以來便搶盡風頭,圈粉無數。但同時一定有工程師不禁要質疑——Node.js真的已經開辟天地,占據架構體系的一席之地了嗎?聽說Node.js在國外早已如火如荼,國内現在到底是個什麼狀态?聽說阿裡因為Node.js扛下了“雙十一”,确實如此嗎?

沒錯,風頭越大,質疑聲也就越多。但當争議和浮華褪去,技術的落地:就讓上帝的歸上帝,撒旦的歸撒旦。那麼,究竟應該如何在公司業務中落地Node.js呢?本篇我們就來共同探讨。

▊命中注定的緣分——當Node.js遇見端到端測試困局

端到端測試,也叫UI測試,E2E測試。說白了,與常見的自動化測試非常相似,它站在使用者使用的角度,基于協定或其他技術手段打開真實浏覽器,與浏覽器中頁面互動。

端到端測試有着肉眼可見的優勢,比如,項目經過不斷的開發最終肯定會趨于穩定,在适當的時機引入端到端測試能及早發現問題,進而保證産品的品質。這種讓軟體代替人工,實施快速、反複測試的方案,收益非常明顯。有人總結出端到端收益公式:

端到端收益 = 疊代次數 * 全手動執行成本 - 首次自動化成本 - 維護次數 * 維護成本

即便收益明顯,且相關領域工具層出不窮,但端到端測試的落地實施目前仍稱不上廣泛。在有條件接入端到端測試的團隊中,端到端測試似乎也沒有發揮到應有的作用。究其原因,除了“項目特點不适合”,我認為還和端到端測試在開發上線流程中接入的階段有密不可分的關系。

具體來說,相當多的團隊會将端到端測試放到本地執行,和項目代碼強耦合。比如,本地通過npm script腳本來實施端到端測試。端到端測試需要保證最新待測試頁面具有可通路性,是以相關腳本需要優先保障本地服務成功搭建。以 npm run e2e 這樣的npm script為例,相關流程如圖1所示。

前端中台化,把格局做大:Node.js與測試服務探索

本質上,這是一種“看心情”的執行方式。一般需要開發者在本地開發完畢之後,自覺執行腳本并觀察端到端測試結果。看心情的事情,自然是無法正規化、流程化、平台化的,也注定是比較雞肋的存在。

順着上述思路,我們可以想到:借助huskey将上述端到端測試放到pre-commit或者pre-push階段強制執行。這樣一來,端到端測試得以流程化,從“看心情”執行變成了“強制執行”。

但進一步思考,在pre-commit/pre-push階段執行的弊端也很明顯:增加了額外的git hooks,延長了代碼送出流程,直接影響了上線效率。如果是一個hot-fix緊急修改bug,這樣的時間殇是我們無法接受的。同時,本地階段執行端到端測試的一個前提是,先要保證本地服務的可用性。暫且不談開啟本地服務的時間開銷,一個更尴尬問題在于:本地服務環境和線上環境是有天然差别的,本地執行的端到端測試難以幂等于線上真實效果。

基于上述情況,端到端測試在團隊技術體系中,要麼漸漸成為一個“漂亮的玩具”,華而不實;要麼成為一個開發者眼見心煩的累贅,最終淪為雞肋。

這麼看來,端到端測試想要破局并實作突破,勢必在執行流程上進行創新。為此,我們認為:端到端測試應該搬到容器上進行,融合到CI/CD階段實施,徹底做到自動化、服務化。

這裡插入一個知識點:什麼是CI/CD階段呢?

CI和CD都是現代網際網路應用編譯和釋出流程當中的常用詞語,分别表示持續內建(Continuous Integration)和持續部署(Continuous Deployment)。

在持續內建環境中,開發人員将代碼送出到主幹master,并觸發Gitlab的hook自動推進代碼編譯。不同的團隊對持續內建階段的定義也許會有略微不同,我所在團隊在持續內建階段主要完成建構項目流程。具體來說,在這個階段,中台團隊使用基礎鏡像啟動容器拉取最新代碼,安裝必要依賴,執行單測腳本,并最終commit出下一階段(持續部署階段)的鏡像。

在持續部署階段,中台使用建構階段(持續內建階段)産出的鏡像啟動容器,按照一定的pipeline流程,串行釋出最新版本應用,最終啟動服務。

了解CI/CD的概念之後,将端到端測試後置到CD/CD階段,并在真實容器中執行——這似乎是一個很好的嘗試和創新。

▊ 通過Node.js實作端到端服務

截至目前,根據“在容器中執行端到端測試服務并接入CI/CD”的設計思想,我們可以畫出一個簡單的流程圖,如圖2所示。

前端中台化,把格局做大:Node.js與測試服務探索

這裡涉及服務粗略設計及基礎環境的搭建。那麼,如何開發一個在容器上運作的端到端測試系統呢?前面也提到過,其實就是在合适的時機去觸發端到端架構的執行,想來就這麼簡單。但是我們在設計一個系統、一個平台時,應該考慮更多問題,比如:

  • 橫向多項目擴充能力
  • 平台化服務能力
  • 運作效率極緻化設計方案
  • 通報與預警中斷機制
  • 合理選型技術方案以及存儲方案

▊ 總結

在這篇文章中,我們簡單介紹了Node.js助力傳統端到端測試,要想了解更多關于最終實作破局和創新的雙赢項目案例,可以關注我的知乎專欄:Lucas的前端雜談。

對于前端開發者來說,學習并實施Node.js最關鍵的就是格局。我們要熟知 Node.js的特性,更要有所謂的“後端”思維、架構思維。我相信Node.js的蓬勃發展和落地,不是因為它具有了某種與生俱來的力量,而是因為它的某些特點符合技術發展趨勢和自然更疊規律。 

繼續閱讀