在複雜的網絡環境下構建 DevOps 測試的最佳實踐

在複雜的網絡環境下構建 DevOps 測試的最佳實踐

DevOps 技術簡介

“DevOps”是“Development”和“Operations”的組合。表示通過吸引並協調軟件交付生命週期中的所有參與者來完成其工作 ( 參與者包括業務團隊、架構師、開發人員和測試人員、還有 IT 運營和生產人員等 ) 他們都有一個共同的目標:持續創新,通過持續交付來支持持續創新,並通過持續反饋來改進創新。具體地說,就是在軟件交付和部署的過程中溝通合作,更快速更可靠地發佈質量更好的產品應用。

一個典型的 DevOps 由下面四個不斷循環的步驟所組成:

  1. 規劃與度量 (Steer)
  2. 開發和測試(Develop/Test)
  3. 發佈和部署 (Deploy)
  4. 監控和優化 (Operate)
圖 1. DevOps 流程圖
DevOps 流程圖
圖 2. 傳統的開發流程
傳統的開發流程

DevOps 強調了系統的整體協作性能,而不是單個參與者或團隊的性能和輸出。

在傳統的工作流中,通過識別需求(由業務團隊進行)、構建需求(由開發和測試團隊進行),然後將需求傳遞到 IT 操作進行部署並交付給用戶。業務團隊想要使解決方案可以盈利(控制成本);開發和測試團隊想要使解決方案可以處理儘可能多的新特性和缺陷(最大化改變);IT 操作團隊想要是的解決方案可以擴展、安全且不易被破壞(最大程度地減少更改)。這樣的結果往往會導致最終的項目產品和客戶預期產生偏差,而且工作週期也很長

在 DevOps 工作流中,業務團隊常常提早接觸客戶,以便不斷掌握和重塑需求。開發和測試團隊與操作團隊協同工作,並使用共同目標和流程來構建解決方案,這些解決方案很穩定,而且很容易供 IT 操作團隊進行交付和維護。另外,將相同的部署工具用於所有開發和測試環境,有助於儘早檢測出錯誤並進行修復。

引入 DevOps 之前項目開發遇到的問題

對客戶的需求反饋不及時

客戶的真實需求往往隱藏在具體需求之中,這需要產品經理、開發以及測試人員一起進行挖掘和及時反饋才能得到,但是原先傳統的開發流程並不能及時獲取用戶的需求並及時進行反饋和修正。而且到了項目後期產品預發佈之前經常會出現當前開發的功能與用戶實際需求的偏差,後期的修復成本很高,往往會導致項目的延期。

開發和測試人員的溝通存在障礙

溝通問題還是由於傳統開發流程所導致,只有開發人員正式提交版本之後測試人員才能進行測試,這樣很多本應在重構、迭代初期就能發現的問題只能累積到測試版本提交的時候才能發現。

項目開發週期過長

一方面是由於傳統的編碼測試開發流程工作流模式所導致;另外一方面往往在項目後期產品預發佈之前才發現當前開發的功能與用戶實際需求會有一定程度的偏差,爲了滿足客戶需求,又需要進行編碼測試的流程,這樣預期之外的流程也會導致項目的延期和開發週期變長。

測試範圍不明確

當項目交付週期臨近時,每一個新版本出來以後,測試範圍到底應該覆蓋原先的所有模塊,還是將有限的時間和精力放在新功能和需求測試上面,這是每個測試人員感到疑惑的地方,往往會導致測試範圍的不明確。

項目週期內測試覆蓋率不高

在有限的項目週期內由於不能進行完整測試,會導致測試覆蓋率不高

測試人員搭建環境和重複性手工測試的耗費時間過長

現在軟件的安裝和部署日趨複雜,導致了測試人員很多時候不得不將過多的時間耗費在環境的搭建上面,而且由於自動化測試的普及率不高,重複的手工測試也會耗費很多精力。

其他挑戰和解決方式

除此之外,在部署環境和項目進展過程中還有其他挑戰,其解決方式如下:

挑戰一:網絡環境橫跨幾道防火牆,測試服務器位於不同國家

如圖所示,如果想訪問客戶端(Client)機器,原先的連接步驟是通過防火牆後登陸服務器(也稱登陸節點 Login Node),然後通過內部防火牆後才能訪問到 Client 機器。

圖 3. 網絡拓撲圖
網絡拓撲圖

解決方案:爲了將複雜的網絡環境簡單化,方便開發調試和測試用例的執行,我們採用遠程端口轉發技術來構建 SSH 隧道。通過端口轉發技術,我們將 GUI 和 CLI 後臺的命令調用統一轉發到到指定的登錄節點機器上面,這樣不僅避免了反覆通過 BSO 登錄到實際節點的繁瑣步驟,也爲後面的自動化測試提供了一個外部能訪問的 http 站點。這樣只需要通過直接訪問 Server 就能達到控制和操作 Client 的目的 ( 極大的提高了開發、測試效率 )

圖 4. 網絡解決方案圖
網絡解決方案圖

Figure-2. Remote port forwarding.

相關的轉發代碼如下:

 ssh -Nf -g -L 8080:10.0.XX.X:8080 172.X.XXX.XXX 
 ssh -Nf -g -L 2111:10.0.XX.X:2111 172.X.XXX.XXX

注:轉發到遠端:ssh -L 本地端口 : 目標 IP: 目標端口 用戶名 @ 目標 IP

轉發到本地:ssh – R 本地端口 : 目標 IP: 目標端口 用戶名 @ 目標 IP

-f :後臺認證用戶 / 密碼,通常和 -N 連用,不用登錄到遠程主機。

-N :不執行腳本或命令,通常與 -f 連用。

-g :在 -L/-R/-D 參數中,允許遠程主機連接到建立的轉發的端口,如果不加這個參數,只允許本地主機建立連接。

挑戰二:開發新特性所依賴的硬件版本不穩定

儘管所有功能必須依託該硬件才能進行開發和測試,但是由於特殊條件導致硬件的固件版本並不穩定,給開發和測試帶來了極大的困擾。由圖可以看出,2 月到 3 月這一個月之間固件就升級了 4 次,而且並非每次都是穩定版本。

圖 5. 固件版本更新列表
固件版本更新列表

解決方案:敏捷開發和持續測試的思路就是不要等到固件版本完美了再開始。開發採用設置樁模塊的方式先繞過該硬件 ( 這裏假定固件版本沒有問題 ),進行後續的開發工作。測試先採用一個暫時穩定的內部版本進行測試,待產品每個週期 (Sprint) 結束之前再替換成正式穩定版。

挑戰三:需要支持的操作系統很多,各種 arch 平臺 (LE/BE/x64) 都需要測試

由於項目的需要,Redhat Enterprise/Centos/Ubuntu 的各種版本,以及 x86_64 LE BE 各種架構平臺都需要支持,這給開發和測試帶來了極大的挑戰,如何在有限的時間內完成各種平臺測試和開發。

圖 6. 系統和平臺列表
系統和平臺列表

解決方案:操作系統和架構平臺太多,在限定時間內每個平臺都完整測試顯然不太可能,因此根據市場佔有率的權重,經開發和測試討論生成一個測試矩陣,使用該測試矩陣來在單位時間內覆蓋客戶 / 市場所需的絕大部分平臺和操作系統,測試矩陣覆蓋範圍之內的所有平臺都需要完整測試以保證交付客戶的產品質量;其餘的平臺則採用最小測試方案,來有效的減少測試工作量。與此同時,也在一定程度上提高了測試覆蓋率。

結合 DevOps 的項目開發測試流程簡介

爲了解決了上述的一系列問題,我們依據 DevOps 將整個項目劃分爲:測試範圍策略的制定、行爲驅動開發、測試環境管理、自動化功能測試四大階段,然後再細分爲九個具體子步驟。 具體的內容以及相應階段的負責人蔘見下表:

圖 7. 開發步驟圖
開發步驟圖
圖 8. 完整開發流程圖
完整開發流程圖

結合 DevOps 的項目開發測試具體流程

S1[ 測試範圍策略的制定 ] 制定測試範圍

爲了及時的對客戶需求進行反饋,一旦客戶的需求被產品經理所批准,產品經理需要和開發以及測試人員一起討論明確需求,當需求明確以後開發和測試人員一起討論並制定測試範圍,下面這些問題在需求文檔中都需要得到體現:

  • 用戶的真實需求是什麼?是需要一個新功能還是希望解決一個已知的 bug
  • 爲了滿足客戶需求,是否有些潛在的風險和依賴關係需要被解決? ( 通常這些潛在的風險會將項目週期放大 )
  • 此次開發最主要的功能是哪些?
  • 我們是否需要引入自動化測試來覆蓋其他的範圍?

注:

1. 這裏假定產品經理角色來完成與客戶的溝通和前期需求討論工作,也可以依據項目的不同由其他人員來代替

2. 測試範圍一旦討論劃分清楚,測試計劃也可以同步生成並提供

S2[ 測試範圍策略的制定 ] 及時矯正測試範圍和資源分配

測試人員需要依據客戶需求和開發人員在開發工作中的設計流程調整來及時矯正測試範圍

  • 開發人員隨着開發的進度不斷深入會發現客戶需求的變更,而且有時由於資源的限制(通常是開發進度 deadline 的原因)導致計劃的調整
  • 一旦開發人員有計劃的調整,測試範圍和資源的分配也要相應進行調整

注:只有開發和測試的高度一致性才能保證項目的進度

S3[ 測試範圍策略的制定 ] 自動化測試用例和腳本的優化

項目的進行過程中,測試人員需要不斷的優化自動化測試用例和腳本

  • 優化和規劃測試用例能保證自動用例的覆蓋範圍最大化

下面一個例子就是 7x24 小時的規劃樣例

表 1. 自動化測試 7x24 小時的規劃樣例
週六 ~ 週日 週一 ~ 週五
完整的自動化測試 ( 覆蓋產品所有模塊 ) 自動化冒煙測試 手工測試
48 小時 晚上 19:00~ 次日早上 8:00 早上 9:00~ 下午 18:00

注:這裏假定測試服務器只有一臺,測試人員的所有行爲都需要在該測試環境裏面進行

S4[ 行爲驅動模式開發 ] 將用戶新需求直接轉換成用戶故事 (User Story) 模式

  • 行爲驅動開發 (Behavior-Driven Development:BBD) 模式可以有效縮短開發週期。用戶故事可以直接轉換成開發、測試任務,從而縮短測試用例的設計和準備週期。

注:如果需求比較大,預計開發週期比較長,也可以用戶故事地圖模式來進行階段性的需求分解分析

S5[ 行爲驅動模式開發 ] 幫助文檔採用在線編輯模式

  • 幫助文檔採用在線文檔方式有利於團隊裏面所有的成員進行訪問,各種角色的人對文檔的理解和解讀角度都不一致,有助於文檔的完善

注:幫助文檔在 beta 版本之前就可以發佈

S6[ 測試環境管理 ] 測試服務器的管理

測試服務器的自動化構建解決了測試人員搭建環境耗費時間過長問題,而且環境集中分配和部署也有助於提高資源利用率。典型的測試服務器的搭建就是採用 Openstack 技術的 SelfServer 環境

如下圖所示,將 Lab 裏面所有的機器組成集羣,當有編譯、開發、測試需求的時候纔會申請一臺機器,並進行安裝

如圖所示登錄 Openstack 集羣管理系統:

圖 9. 登錄集羣管理系統界面
登錄集羣管理系統界面

創建包含所需要的產品集羣

圖 10. 創建產品集羣
創建產品集羣
圖 11. 配置集羣相關參數
配置集羣相關參數

配置完成後開始創建

圖 12. 集羣創建中
集羣創建中

創建成功後如下

圖 13. 集羣創建成功
集羣創建成功

然後可以在 Overview 界面進行查看

圖 14. 集羣預覽頁面
集羣預覽頁面

測試服務器一旦生成完畢,也可以採用計劃任務進行規範化:

9:00AM 啓動服務器的編譯腳本

9:30AM 版本編譯完畢,啓動腳本進行服務器相關配置腳本

11:00AM 配置腳本執行完畢,服務器可以隨時交付測試組使用

圖 15. 計劃任務示例
計劃任務示例

S7[ 自動化功能測試 ] 覆蓋範圍包括產品原先的功能模塊以及新功能和缺陷

自動化測試功能覆蓋範圍如下:

  • 原先既有功能的自動化測試
  • 根據客戶反饋在原先產品版本上發現並修復的缺陷自動化測試
  • 新功能已經生成用戶故事的部分

覆蓋測試範圍的明確有利於開發和測試集中精力處理新功能和需求,將重複的功能測試交由自動化功能測試來完成。

注:這裏假定在開發測試過程中已經給予測試團隊一定的時間來撰寫自動化測試腳本的時間,並且產品的 GUI 界面比較穩定沒有太大的變動,並且 CLI 後臺有比較豐富的接口函數便於集成調用

S8[ 自動化功能測試 ] 執行每日自動化測試腳本並生成報告

自動化測試的引入能夠將測試人員從日復一日耗時過長的重複性手工測試解放出來。每日自動化測試的目的用以確保產品每日構建版本的穩定性,沒有在修復缺陷的同時被引入新的問題。由於時間和資源問題,每日自動化測試的腳本運行時間一般控制在 3 小時以內,首先要保證的是產品的基礎功能都能正常工作

下圖是以 Selenium 爲基礎框架生成的自動化測試報告示例:

  1. 首先在模塊中確定需要執行的測試用例集,然後執行用例
圖 16. 瀏覽測試用例集
瀏覽測試用例集
圖 17. 執行指定測試用例
執行指定測試用例
  1. 用例執行完畢後會自動生成如下的測試報告
圖 18. 生成測試報告
生成測試報告

如果配合框架接口,可以將各個模塊、產品的報告集合在 Web Portal 進行集中展示和實時查看

圖 19. 網頁實時查看測試狀態
網頁實時查看測試狀態

注:由於本文重點在於流程的設計,所以 selenium 框架具體的實施細節並沒有在此展示,如果有興趣的讀者可以留言一起進行探討

S9[ 持續測試 ] 在每次的持續集成中持續測試

DevOps 需要持續集成測試,在每次重構 / 集成 / 迭代後都需要進行功能測試、單元測試來確保產品的穩定性。持續的集成測試能夠確保問題的提早發現,降低後期修改的項目成本,也能一定程度上消除開發和測試人員的溝通障礙。

圖 20. 持續測試流程圖
持續測試流程圖

注:持續測試只是持續計劃、持續開發、持續部署、持續監控的一部分,DevOps 就是在各個角色之間進行快速的高效的協作策略來縮短週期提高效率

結束和展望

引入 DevOps 後測試新流程後帶來的便利

  • 對客戶的反饋更及時
  • 開發和測試人員的溝通更方便
  • 開發和測試範圍更清晰
  • 需求變更更加快捷
  • 縮短了開發週期
  • 提高了有限項目週期內測試覆蓋率
  • 減少了測試人員搭建環境和重複性手工測試的時間週期

DevOps 作爲敏捷開發 (Agile) 的一種項目具體實踐過程,在項目的實施中,採用 Backlog 進行每個 Sprint 的管理,任務分解成用戶故事取代原先的模塊組件分離過程就是 Agile 的實施方式。每日的 Scrum 例會也可提高團隊的協作性和進度控制管理。

另外這裏的流程管理只是基於目前的項目所展開的,仍然有一些不足,比如:

  • 測試環境的管理應該更加智能化和方便回收和複用
  • 優化測試腳本來在有限的時間內提高測試模塊覆蓋率
  • 開發和測試人員需要更加緊密的協作來保證用戶故事的開發、測試更加便捷

隨着項目的不斷深入進行,測試服務器的管理腳本優化,自動化測試腳本的不斷完善,我們相信一定會讓 DevOps 的開發測試流程更加便捷和高效。

相關主題


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