對于自動化測試,原來談這方面的內容比較少,但是現在我們做DevOps支撐平臺的時候,在整個持續集成和交付的過程中,有一個重要的內容就是自動化測試。自動化測試的覆蓋面相當大,其中既包括了CS,BS和移動App的自動化測試分類;也包括了單元測試,接口自動化測試和UI自動化測試的分類。
DevOps成熟度中測試管理概述
測試管理是一個過程,通過該過程,所有和測試相關的方法,流程,人員都被定義。在產品投入到生產環境運行之前,通過測試過程驗證產品的需求,盡可能地發現軟件中的缺陷,從而提高軟件產品的質量。測試管理分為測試分層策略,代碼質量管理和自動化測試三個維度進行表達。
測試分層策略
先談下有哪些測試分類的方法,在持續集成里面我們當然更加會強調自動化測試,因此可以理解為人工測試和自動化測試兩類;也可以離開為代碼級測試,接口測試和前端測試分離。也可以理解為功能測試和非功能測試兩類。
當然也可以看到,在微服務架構下,我們希望我們本身的開發也是分層的,即中臺模塊+服務接口+前臺功能,即我們通常說的前后端分離,在這種前后端分離的情況下,可以更加方便我們進行測試分層設計和自動化測試。只要是厚中臺+薄前臺模式,那么就越容易實現測試過程的自動化。
越是持續集成自動化承擔越高,那么自動化測試的比重就會越大。
可以看到首先在架構設計上就要做到前后端分離,中臺+服務+前臺,這種分離后可以更加方便后面進行后端代碼和接口的自動化測試工作。
可以看到在測試分層策略里面的四到五級描述里面,我們看到TDD測試驅動開發方面的內容,比如先寫測試代碼再寫實現代碼或者兩者同時在進行等。其次,我們還是要將在整個devops最佳實踐里面,不僅僅開發過程是持續增量進行的,對于測試過程本身也是持續增量進行的,兩者必須匹配。
或者理想狀態應該是沒有獨立的測試周期,開發完成的階段往往就是測試也配套完成的時間點。
代碼質量管理
是軟件研發過程中保證代碼質量的一種機制,即在代碼變更后,需要對代碼進行檢查,分析,并給出結論和改進建議,對代碼質量數據進行管理,并可以對代碼質量進行追溯。主要包括了質量規約,檢查方式,反饋處理三方面的內容。
代碼質量管理即我們常說的代碼靜態檢查,其基于我們制定的代碼質量規約進行。質量規約是指對軟件代碼質量的要求和規范,其中包含了編碼規范,復雜度,覆蓋率,以及安全漏洞,合規性要求等多個方面的內容。其中檢查方式即包括了我們傳統手工方面的檢查和CodeReview,也包括了運行相關的自動化檢查工具進行檢查。
自動化測試
自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程,在預設條件下運行系統或應用程序,執行測試并評估測試結果,以達到節省資源和人力,提高測試效率和準確性,主要包括了自動化設計,自動化開發,自動化執行和自動化分析。
對于自動化測試可以看到,對于服務接口和代碼級的自動化測試相對來說比較容易實現,但是對于前端和UI級的自動化測試相對來說就比較困難些。因此對于前期實踐,我們也是建議先實現接口服務和代碼級的自動化測試,再來靠前端UI的自動化測試。
對于性能測試由于可以提前錄制腳本,相對來說自動化測試實現起來比較容易。不論是那種類型的自動化測試都可以看到,實際上可以看到如下幾個關鍵點。
- 自動化測試代碼或腳本的編寫,可以是人工編寫,也可以通過錄制生成。
- 測試數據的產生問題,參考測試管理過程域
- 自動化測試腳本能夠重復執行的要求,確保每次持續集成都能夠重復運行測試腳本
到了自動化測試的第四級開始,可以看到增加了對獨立的自動化測試平臺的要求,同時也增加了對測試結果分析和度量的要求,即通過測試結果的度量分析來進一步改進測試效率,提升代碼質量。
自動化測試概述
今天只談下對于常見的一個Web應用的自動化測試應該如何去考慮。
要知道自動化測試不是一個新鮮的東西,很早就有,只是最近幾年有了新的發展。比如在10多年前我們做每日構建和冒煙測試,持續集成的過程中,我們就已經在用Junit做自動化測試,并集成到整個持續集成過程。在每日構建完成后,自動化運行Junit的自動化測試腳本并輸出冒煙測試的測試結果報告。
而在當時如果涉及到CS應用的自動化測試,包括對于Web類應用的自動化測試,我們采用QTP(現在改名為UFT)工具來做自動化測試,但是并沒有得到廣泛的應用,一個核心的原因就是QTP來做Web端的自動化測試,實際上腳本錄制和代碼編寫量都很大,而且很難對所有的測試用例做到完全覆蓋,同時即使用了QTP工具錄制和維護腳本,實際的人工測試還是不能省略,因此這些都導致了QTP自動化測試并沒有大范圍推廣。
而最近幾年的發展可以看到,對于Web自動化測試Selenium和Robot Framework逐漸成為了主流的自動化測試框架和選擇。同時在微服務架構,前后端分層開發推廣下,對于接口的自動化測試也發展很快。
UFT/QTP自動化測試工具
QTP是Quick Test Professional的簡稱,是一種自動測試工具。當前已經更名為UFT,即統一功能測試框架。使用QTP的目的是想用它來執行重復的自動化測試,主要是用于回歸測試和測試同一軟件的新版本。因此你在測試前要考慮好如何對應用程序進行測試,例如要測試哪些功能、操作步驟、輸入數據和期望的輸出數據等。
HP QuickTest Professional 提供符合所有主要應用軟件環境的功能測試和回歸測試的自動化。采用關鍵字驅動的理念以簡化測試用例的創建和維護。它讓用戶可以直接錄制屏幕上的操作流程,自動生成功能測試或者回歸測試用例。專業的測試者也可以通過提供的內置腳本和調試環境來取得對測試和對象屬性的完全控制。
以QTP為核心的自動化測試框架優點在于:適用性好,很多人都已經會用或者至少說可以簡單應用,腳本也簡單易懂,大多數無任何代碼基礎的測試人員都可以加入腳本錄制和調試。然而它最大的缺點就是對象庫,關鍵字的框架,靈活度也不高,且加上QTP在對flex等的支持上,也是讓許多人頭疼的問題。
在原來對于編碼能力往往測試工程師都比較弱,因此對于QTP這種可以自動錄制,自動執行和輸出報告完整工具應用相當廣泛。而現在的自動化測試技術棧,不管是接口、web、移動端,絕大多數都是基于開源項目來構建,測試人員本身的編碼能力也在加強,特別是類似Python等腳本語言的大量使用,因此現在實際還在采用類似QTP商用工具的已經越來越少。自動化測試更多的采用類似Selenium, Robot Framework等開源工具進行集成。
Selenium自動化測試工具
Selenium是一個用于Web應用程序測試的工具。
這個工具的主要功能包括:測試與瀏覽器的兼容性,測試你的應用程序,看是否能夠很好得工作,在不同瀏覽器和操作系統之上。測試系統功能,創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成 .Net、JAVA、Perl等不同語言的測試腳本。
Selenium當前免費,而且可以和Jenkins,Maven,TestNG等實現集成,同時支持多語言,多平臺和瀏覽器。因此當前被使用的相當多。
Selenium框架底層使用JavaScript模擬真實用戶對瀏覽器進行操作。測試腳本執行時,瀏覽器自動按照腳本代碼做出點擊,輸入,打開,驗證等操作,就像真實用戶所做的一樣,從終端用戶的角度測試應用程序。
對于Selenium,里面有一個核心組件即Browser bot,類似于瀏覽機器人,可以執行從測試腳本接收到的命令,自動化的完成頁面瀏覽和各種操作,并記錄相應的測試結果。
Selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的并行處理(SeleniuBm Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。Selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器。
具體可參考:
https://selenium.dev/
http://www.selenium.org.cn/ (中文站點)
Robot Framework
Robot Framework是一個跨平臺的通用的,與應用程序和技術無關的測試框架。它的優點是:易于擴展,提供了簡單的API,用戶可以自定義基于Python和Java的測試庫。它還提供強大的標簽功能,來歸類測試運行,在測試運行時可以選擇不同的Tag或tag組合進行測試運行。
支持報告合并,以便讓你可以多機執行,然后合并報告,全局測試超時時間設置,局部可以覆蓋全局的設置非常方便,不會測試卡殼的等等。其主要優點包括:
- 通過使用關鍵字驅動測試(KDT)方法簡化了自動化測試過程。
- 測試數據語法簡單易用。
- 生態系統豐富。由各種通用測試庫和工具組成,這些工具都是作為獨立項目開發的。
- 具有高度可擴展性。
要注意到Robot Framework本身是關鍵字驅動的測試,庫和關鍵字就很重要,對于當前的庫和關鍵字沒有的時候你還需要自己寫代碼進行擴展。
在Robotframework當中,由SeleniumLibrary(非robot自帶,需要安裝)庫提供對網頁的操作關鍵字(功能)。即Robot Framework+SeleniumLibrary結合基本就能夠完成我們需要的Web和UI自動化測試能力。
具體可參考:
http://robotframework.org/
https://blog.csdn.net/qq_27534003/article/details/87437195
https://www.jianshu.com/p/2ebea3256e21
接口自動化測試
對于接口自動化測試,主要是指類似SOAP , Http Rest等接口服務如何進行自動化測試。實際上在我們SOA管控平臺的開發過程中,我們也定制化開發了接口自動化測試的工具,先是人工運行一篇接口測試,這本身類似一個腳本錄制的動作,然后后續再根據已經錄制的腳本批量自動化運行接口測試腳本并輸出結果。
Python+Request
Requests 是?Python語?編寫,基于urllib,采?Apache2 Licensed開源協議的 HTTP 庫。它? urllib 更加?便,可以節約我們?量的?作,完全滿?HTTP測試需求。整個測試思路基本如下:
- 對于每個Http接口請求手工編寫測試腳本
- 把對同一個接口的所有測試用例py腳本封裝為方法,每個接口封裝一個接口類
- 使用Testsuite調用這些接口類,構建測試集,或利用unittest自動識別測試用例
- 構建自動化測試
- 輸出測試結果報告
可以看到要使用Python+Request一方面是要熟悉Python語言和Request庫,一方面是需要手工編寫測試腳本,整個代碼編寫量仍然很大。這個方法跟采用Junit單元測試基本是差不多的。
參考:
https://www.cnblogs.com/ailiailan/p/8535293.html
https://blog.csdn.net/songlh1234/article/details/84317617
Postman
Postman一款非常流行的API調試工具。其實,開發人員用的更多。因為測試人員做接口測試會有更多選擇,例如Jmeter、soapUI等。不過,對于開發過程中去調試接口,Postman確實足夠的簡單方便,而且功能強大。
Postman最早是作用chrome瀏覽器插件存在的,2018年初Chrome停止對Chrome應用程序的支持。當前Postman提供了獨立的安裝包,不再依賴于Chrome瀏覽器了。同時支持mac、windows和linux。
具體參考和下載:
https://learning.getpostman.com/docs/
https://www.postman.com/downloads/
JMeter
開源測試工具Jmeter可以承擔接口請求、結果解析和斷言的工作,可以作為輕量級接口自動化的實現手段,對于開發能力不強或規模不大的團隊也能接受。Jmeter可以在協議層實現基本的功能,包括接口訪問、參數化構造、返回值斷言和數據庫訪問,基本足夠滿足一個輕量級的接口自動化框架的功能。
注意Jmeter不僅僅是用做接口自動化測試,同時更加重要的一個功能是做接口的性能測試,我們在錄制完成Http請求腳本后,可以對腳本的線程數,運行時長,循環數等進行配置并執行,執行完成后會輸出詳細的性能測試報告。
具體參考:
https://www.cnblogs.com/rd-ddddd/p/9578242.html
基于Java+TestNG+Rest Assured進行自動化測試
可以看到TestNG和Rest Assured是兩個用于自動化測試的獨立類庫,這種方法偏白盒測試,需要自己編寫測試代碼,但是靈活性卻相當高,同時可以和類似Jekins工具集合,當然也就可以和我們DevOps平臺集成。
Rest-Assured 是一個測試Restful Web Service的Java類庫,我們可以創建高度定制的HTTP請求以發送到Restful服務器。這使我們能夠測試各種各樣的請求組合,依次測試核心業務邏輯的不同組合。Rest-Assured庫提供了驗證從服器收到的HTTP響應的功能。
例如我們可以驗證狀態碼,狀態信息,標題甚至是響應的正文。這使Rest-Assured成為一個非常靈活,可用于測試的Java庫。
而TestNG是一個開源自動化測試框架,實際上可以看到是和Junit差不多的一個自動化測試框架,只是增加了一些新的功能和更強大的集成能力。其優勢是支持依賴測試方法,并行測試,負載測試,局部故障;靈活的插件API;支持多線程測試。
同時TestNG不僅僅可以測試Rest接口,也可以測試標準的Java API接口方法。
具體可參考:
https://www.cnblogs.com/wade-xu/p/4229805.html
注:上面這篇文章可以看到采用TestNG實現接口自動化測試,同時進行擴展,將測試腳本管理和測試數據管理分離。同時測試數據全部體現在Excel中。從Excel中讀入測試輸入,同時將測試接口輸出到Excel中。
https://my.oschina.net/u/4112294/blog/3037471
注:上面這篇文章談到TestNG和Rest Assured相結合如何進行接口自動化測試,同時如何和Jekins持續集成工具集成,將測試結果報告進行輸出。
Rest Assured 自帶支持對JSON、xml的解析,同時也提供了類似hasITems ,is,equalTo等靜態方法供使用。盡管Rest Assured 提供了校驗方法,但是在實際API自動化測試過程中,因為往往需要校驗的字段非常多,建議還是直接先把要校驗的JSON字段解析出來,再通過TestNG提供的Assert類進行校驗。
對于Rest Assured的參考網站如下:
http://rest-assured.io/
https://github.com/rest-assured/rest-assured
LuckyFrame開源測試平臺
LuckyFrame測試平臺是一款免費開源的測試平臺,最大的特點是全緯度覆蓋了接口自動化、WEB UI自動化、APP自動化,并且支持分布式測試。既然是一個完整的測試平臺,那么自然會提供測試用例管理,測試數據管理,測試執行,質量管理,測試結果和測試報告查看等相關的功能。這個平臺提供在線的Demo可以查看。
LuckyFrame自動化測試框架分為兩個項目:
一個服務端項目(LuckyFrameWeb),一個客戶端項目(LuckyFrameClient),服務端項目主要負責自動化過程的管理,比如用例管理、測試任務管理等等。客戶端其實就是測試執行機,主要負責測試用例以及任務的執行。
Web項目主要分為系統管理、UTP、 質量管理、測試工具測試環境管理等模塊。
具體演示地址:
http://www.luckyframe.cn/page/lfdemo.html
https://gitee.com/seagull1985/LuckyFrameWeb
這個平臺感覺有些思路還是可以借鑒,在前面DevOps整個子系統劃分的文章里面我也談到,對于測試管理既可以是一個簡單的模塊放在DevOps支撐平臺里面,也可以是一個獨立的子系統,然后再實現和DevOps支撐平臺的集成。
可以看到整個工具還是基本按照一個完整的測試管理平臺來實現,覆蓋了測試計劃,測試設計,測試執行,測試報告等多個方面的內容。同時支持Web UI自動化測試,API接口自動化測試,整體框架相當也完整,但是相關諸多細節估計還需要不斷迭代完善。
Http Runner自動化測試框架
HttpRunner 是一個基于 Python 開發的測試框架,2018年python開發者大會上,了解到HttpRuuner開源自動化測試框架,采用YAML/JSON格式管理用例,能錄制和轉換生成用例功能,充分做到用例與測試代碼分離,相比excel維護測試場景數據更加簡潔。
HttpRunner 是一款面向 HTTP(S) 協議的通用開源測試框架,只需編寫維護一份 YAML/JSON 腳本,即可實現自動化測試、性能測試、線上監控、持續集成等多種測試需求。
為了簡化測試用例的編寫工作,HttpRunner 實現了測試用例生成的功能,對應的轉換工具為一個獨立的項目:har2case。即通過當前主流的抓包工具將抓取到的數據包導出為HAR,然后再將HAR格式轉化為YAML/JSON格式的測試用例文件。
對于HTTPrunner當前已經到2.0版本,但是整體感覺還不是一個完整的自動化測試框架平臺,當前對于HTTPrunner可以應用于一些簡單的接口測試,或者是不會有大改動的接口的回歸測試,這樣也挺方便的。但是對于一些復雜的測試不如采用Rest Assured功能強和靈活,畢竟Rest Assured基于Java,可以靈活進行Java代碼腳本的擴展。
具體參考:
https://v1.httprunner.org/