提到自動化測試,很常見的誤解就是把自動化測試等同於某種自動化測試工具,例如最廣為人知的Selenium,但這只是狹義上的理解。在真正的項目實踐中,自動化測試包含的內容很多,不僅僅只是某種自動化測試工具,我理解的一個成熟的自動化測試平台,應該包含以下這些方面:
- 對被測系統進行操作的自動化框架或者工具:例如web程序的Selenium, 移動端程序的Appium,windows應用程序的white,autoit,QTP等。請注意,它們只是自動化框架,提供了能夠自動化操作被測系統的功能,不是測試框架,因為它們不具備測試框架基本的用例組織,結果校驗等功能,所以在實踐基本上都是需要和一個測試框架集成起來使用的。
- 測試框架:與自動化框架集成,提供用例整理,分類,調度,結果校驗,報告輸出等功能,例如Java的Junit, TestNG, Python的Pytest, Ruby的Rspec, 以及能夠適應各種語言的Cucumber等。
- 測試環境構建:使用Vmware,AWS等虛擬化和雲技術構建和管理操作系統級別的服務器,使用docker等容器化技術構建和管理應用級別的服務。當需要多個容器時可以使用docker compose,docker swarm等,再復雜時可以使用kubernetes來管理和維護整個環境。理想狀態下測試環境應該是自動化的一鍵式部署,有完整的部署腳本且納入版本管理系統控制。可追溯,可回滾,可以很方便的從零開始構建,能夠快捷的在本地構建起一個測試環境,測試人員有自己的專屬測試環境,對於環境有控制權,同時具備維護環境的能力,可以按照需要隨時構建或者銷毀。
- 測試數據准備:自動化測試需要完整的,可控的測試數據作為支持,否則自動化測試就是擺設,無法預判的執行結果反而會成為團隊的負擔。主要的障礙其實在於人員能力和權限管理,需要測試人員對於業務和系統有深刻的了解,才能准確的准備所需要的數據(例如業務中的操作和數據對應哪些API的哪些字段,又對應數據庫中的哪些表)。數據的准備從底向上可以分為直接構建數據庫(一般比較難實現,需要對數據庫具有權限,且熟悉表結構,但卻是最高效的方法),調用API創建數據(需要熟悉被測系統API消息體的結構,並且有權限),通過UI自動化腳本創建(可見性最好,但是最低效,最不穩定),在執行完自動化測試后也需要有相應的方法來清理數據。還有一種方法是通過mock server,這樣既能解決依賴系統的問題,也能完成依賴數據的准備,但是開發mock server需要一定的工作量,且需要對系統和業務非常熟悉,而且使用mock server會導致測試的不真實性,無法發現真實系統集成之間的問題。Java的spring boot,wiremock,python的flask,Ruby的sinatra等都可以用來做mock server。
- 並發執行:並發執行是提高測試執行速度的有效方法,有不同的方法可以實現並發執行,比如使用構建工具的並行測試功能,例如maven的surefire和failsafe,gradle的多線程執行功能,cucumber-jvm的並發執行。也可以使用其他工具或者庫來實現,例如ruby的parallel-test,再復雜一些的,可以寫個專門的程序或者服務來將測試的分發到不同的docker容器上執行,在BAT等頂尖互聯網公司的測試分享中有過這樣的案例。並發執行的另一個難題是需要解決好測試用例,測試數據,測試環境的隔離性問題,避免出現並發時互相干擾的情況。這就需要在設計測試用例時做好解藕,每個測試用例或者測試場景都是可以單獨執行的,不存在用例間互相依賴的情況。在測試數據的准備上,要做好數據的唯一性和獨立性,執行前預先准備好數據,執行后清除無用的數據,某些場景還要考慮共享數據在多線程運行時的同步,死鎖等問題,不過目前主流的編程語言例如Java, Python在處理多線程編程時都有很成熟的方法。關於測試環境的准備,根據項目場景也有不同的方法,可以在多個測試環境上執行,也可以只在一個環境上執行,但是某些系統可能存在賬戶不能同時登陸等問題,需要提前考慮或者規避。在這里我想再替docker打個廣告,docker容器技術的輕量化,低開銷啟動銷毀,容器間互相隔離等特點,非常適合用來快速構建測試環境和並發執行測試。
- 與CI集成:自動化測試只有與CI集成才能最大的發揮作用,否則如果只能在測試人員的機器上執行,將存在結果對團隊不可見,缺乏規范的調度策略,無法引起團隊的重視等問題,導致自動化測試形同虛設。而一個完整的CI流水線也需要包含自動化測試,在敏捷理念中有一句話,沒有自動化測試的CI不能稱之為CI。自動化測試與CI集成在技術上並不難實現,本質就是把測試由在本地執行放到CI的執行機上去執行,目前主流的CI工具,例如Jenkins,Bamboo,CircleCI等都能很容易的完成配置。需要注意的依然是測試環境,這里的測試環境包含兩部分,被測系統的環境和執行自動化測試的環境。被測系統的環境需要能夠被CI執行機訪問,執行自動化測試的環境一般在CI的執行機上,就需要配置CI執行機的環境了,例如Java或者Python環境,Webdriver,瀏覽器等等。而這又會牽扯很多細節問題,例如CI的執行機一般都是Linux環境,無法運行圖形界面,需要使用瀏覽器的headless模式,依然強烈推薦使用docker來封裝整個的測試執行環境,這樣在CI執行機上只需要docker pull, docker run就可以了,避免因為環境,依賴包等差異帶來眾多的問題。在我的另一篇文章中有介紹如何在docker容器中執行自動化測試。
- 與用例管理系統集成:自動化測試執行后都會生成測試報告,但是更進一步,如果能夠和用例管理系統集成,自動標注執行結果,那就更省事了,在很多項目中也是常見的做法。不同公司和項目使用的用例管理系統千差萬別,有些還是內部開發的系統,需要根據實際情況分析解決。但一般都需要用例管理系統能夠提供標注執行結果的API,在測試執行后有專門的程序來收集整理測試報告,再調用用例管理系統的API來標注結果。以業界名氣最大的JIRA舉例,就提供了API可以查詢和標注test case的執行結果,所以只需要將執行結果按照API規定消息格式整理好,調用即可,並不難實現。
以上介紹了一個通用的自動化測試平台需要包含哪些功能,以及這些功能如何實現。如果是移動端的測試平台,則還有更多的問題,例如不同設備的兼容性,如何並發和調度多台不同設備,在BAT這些頂尖互聯網公司有成熟的實踐,而我自己這方面的經驗並不多,依然處在學習探索的階段。從本質上看,構建一個比較完善的自動化測試平台,需要對被測系統有深入的了解,有扎實的軟件測試和編程基礎,熟悉至少一門編程語言,熟悉CI和Devops,有比較廣的知識面和技術棧,知道如何選用合適的工具和框架來解決問題。