??提到自動(dòng)化測試山叮,很常見的誤解就是把自動(dòng)化測試等同于某種自動(dòng)化測試工具吠撮,例如最廣為人知的Selenium,但這只是狹義上的理解碳却。在真正的項(xiàng)目實(shí)踐中,自動(dòng)化測試包含的內(nèi)容很多新啼,不僅僅只是某種自動(dòng)化測試工具追城,我理解的一個(gè)成熟的自動(dòng)化測試平臺,應(yīng)該包含以下這些方面:
- 對被測系統(tǒng)進(jìn)行操作的自動(dòng)化框架或者工具:例如web程序的Selenium, 移動(dòng)端程序的Appium燥撞,windows應(yīng)用程序的white座柱,autoit,QTP等物舒。請注意色洞,它們只是自動(dòng)化框架,提供了能夠自動(dòng)化操作被測系統(tǒng)的功能冠胯,不是測試框架火诸,因?yàn)樗鼈儾痪邆錅y試框架基本的用例組織,結(jié)果校驗(yàn)等功能荠察,所以在實(shí)踐中基本上都是需要和一個(gè)測試框架集成起來使用的置蜀。
- 測試框架:與自動(dòng)化框架集成奈搜,提供用例整理,分類盯荤,調(diào)度馋吗,結(jié)果校驗(yàn),報(bào)告輸出等功能秋秤,例如Java的Junit, TestNG, Python的Pytest, Ruby的Rspec, 以及能夠適應(yīng)各種語言的Cucumber等宏粤。
- 測試環(huán)境構(gòu)建:使用Vmware,AWS等虛擬化和云技術(shù)構(gòu)建和管理操作系統(tǒng)級別的服務(wù)器灼卢,使用docker等容器化技術(shù)構(gòu)建和管理應(yīng)用級別的服務(wù)绍哎。當(dāng)需要多個(gè)容器時(shí)可以使用docker compose,docker swarm等鞋真,再復(fù)雜時(shí)可以使用kubernetes來管理和維護(hù)整個(gè)環(huán)境崇堰。理想狀態(tài)下測試環(huán)境應(yīng)該是自動(dòng)化的一鍵式部署,有完整的部署腳本且納入版本管理系統(tǒng)控制灿巧「习溃可追溯,可回滾抠藕,可以很方便的從零開始構(gòu)建饿肺,能夠快捷的在本地構(gòu)建起一個(gè)測試環(huán)境,測試人員有自己的專屬測試環(huán)境盾似,對于環(huán)境有控制權(quán)敬辣,同時(shí)具備維護(hù)環(huán)境的能力,可以按照需要隨時(shí)構(gòu)建或者銷毀零院。
- 測試數(shù)據(jù)準(zhǔn)備:自動(dòng)化測試需要完整的溉跃,可控的測試數(shù)據(jù)作為支持,否則自動(dòng)化測試就是擺設(shè)告抄,無法預(yù)判的執(zhí)行結(jié)果反而會成為團(tuán)隊(duì)的負(fù)擔(dān)撰茎。主要的障礙其實(shí)在于人員能力和權(quán)限管理,需要測試人員對于業(yè)務(wù)和系統(tǒng)有深刻的了解打洼,才能準(zhǔn)確的準(zhǔn)備所需要的數(shù)據(jù)(例如業(yè)務(wù)中的操作和數(shù)據(jù)對應(yīng)哪些API的哪些字段龄糊,又對應(yīng)數(shù)據(jù)庫中的哪些表)。數(shù)據(jù)的準(zhǔn)備從底向上可以分為直接構(gòu)建數(shù)據(jù)庫(一般比較難實(shí)現(xiàn)募疮,需要對數(shù)據(jù)庫具有權(quán)限炫惩,且熟悉表結(jié)構(gòu),但卻是最高效的方法)阿浓,調(diào)用API創(chuàng)建數(shù)據(jù)(需要熟悉被測系統(tǒng)API消息體的結(jié)構(gòu)他嚷,并且有權(quán)限),通過UI自動(dòng)化腳本創(chuàng)建(可見性最好,但是最低效筋蓖,最不穩(wěn)定)卸耘,在執(zhí)行完自動(dòng)化測試后也需要有相應(yīng)的方法來清理數(shù)據(jù)。還有一種方法是通過mock server扭勉,這樣既能解決依賴系統(tǒng)的問題鹊奖,也能完成依賴數(shù)據(jù)的準(zhǔn)備苛聘,但是開發(fā)mock server需要一定的工作量涂炎,且需要對系統(tǒng)和業(yè)務(wù)非常熟悉,而且使用mock server會導(dǎo)致測試的不真實(shí)性设哗,無法發(fā)現(xiàn)真實(shí)系統(tǒng)集成之間的問題唱捣。Java的spring boot,wiremock网梢,python的flask震缭,Ruby的sinatra等都可以用來做mock server。
- 并發(fā)執(zhí)行:并發(fā)執(zhí)行是提高測試執(zhí)行速度的有效方法战虏,有不同的方法可以實(shí)現(xiàn)并發(fā)執(zhí)行拣宰,比如使用構(gòu)建工具的并行測試功能,例如maven的surefire和failsafe烦感,gradle的多線程執(zhí)行功能巡社,cucumber-jvm的并發(fā)執(zhí)行。也可以使用其他工具或者庫來實(shí)現(xiàn)萍嬉,例如ruby的parallel-test恳谎,再復(fù)雜一些的成玫,可以寫個(gè)專門的程序或者服務(wù)來將測試的分發(fā)到不同的docker容器上執(zhí)行,在BAT等頂尖互聯(lián)網(wǎng)公司的測試分享中有過這樣的案例朝群。并發(fā)執(zhí)行的另一個(gè)難題是需要解決好測試用例,測試數(shù)據(jù)中符,測試環(huán)境的隔離性問題姜胖,避免出現(xiàn)并發(fā)時(shí)互相干擾的情況。這就需要在設(shè)計(jì)測試用例時(shí)做好解藕淀散,每個(gè)測試用例或者測試場景都是可以單獨(dú)執(zhí)行的右莱,不存在用例間互相依賴的情況。在測試數(shù)據(jù)的準(zhǔn)備上吧凉,要做好數(shù)據(jù)的唯一性和獨(dú)立性隧出,執(zhí)行前預(yù)先準(zhǔn)備好數(shù)據(jù),執(zhí)行后清除無用的數(shù)據(jù)阀捅,某些場景還要考慮共享數(shù)據(jù)在多線程運(yùn)行時(shí)的同步胀瞪,死鎖等問題,不過目前主流的編程語言例如Java, Python在處理多線程編程時(shí)都有很成熟的方法。關(guān)于測試環(huán)境的準(zhǔn)備凄诞,根據(jù)項(xiàng)目場景也有不同的方法圆雁,可以在多個(gè)測試環(huán)境上執(zhí)行,也可以只在一個(gè)環(huán)境上執(zhí)行帆谍,但是某些系統(tǒng)可能存在賬戶不能同時(shí)登陸等問題伪朽,需要提前考慮或者規(guī)避。在這里我想再替docker打個(gè)廣告汛蝙,docker容器技術(shù)的輕量化烈涮,低開銷啟動(dòng)銷毀,容器間互相隔離等特點(diǎn)窖剑,非常適合用來快速構(gòu)建測試環(huán)境和并發(fā)執(zhí)行測試坚洽。
- 與CI集成:自動(dòng)化測試只有與CI集成才能最大的發(fā)揮作用,否則如果只能在測試人員的機(jī)器上執(zhí)行西土,將存在結(jié)果對團(tuán)隊(duì)不可見讶舰,缺乏規(guī)范的調(diào)度策略,無法引起團(tuán)隊(duì)的重視等問題需了,導(dǎo)致自動(dòng)化測試形同虛設(shè)跳昼。而一個(gè)完整的CI流水線也需要包含自動(dòng)化測試,在敏捷理念中有一句話肋乍,沒有自動(dòng)化測試的CI不能稱之為CI鹅颊。自動(dòng)化測試與CI集成在技術(shù)上并不難實(shí)現(xiàn),本質(zhì)就是把測試由在本地執(zhí)行放到CI的執(zhí)行機(jī)上去執(zhí)行住拭,目前主流的CI工具挪略,例如Jenkins,Bamboo滔岳,CircleCI等都能很容易的完成配置杠娱。需要注意的依然是測試環(huán)境,這里的測試環(huán)境包含兩部分谱煤,被測系統(tǒng)的環(huán)境和執(zhí)行自動(dòng)化測試的環(huán)境摊求。被測系統(tǒng)的環(huán)境需要能夠被CI執(zhí)行機(jī)訪問,執(zhí)行自動(dòng)化測試的環(huán)境一般在CI的執(zhí)行機(jī)上刘离,就需要配置CI執(zhí)行機(jī)的環(huán)境了室叉,例如Java或者Python環(huán)境,Webdriver硫惕,瀏覽器等等茧痕。而這又會牽扯很多細(xì)節(jié)問題,例如CI的執(zhí)行機(jī)一般都是Linux環(huán)境恼除,無法運(yùn)行圖形界面踪旷,需要使用瀏覽器的headless模式曼氛,依然強(qiáng)烈推薦使用docker來封裝整個(gè)的測試執(zhí)行環(huán)境,這樣在CI執(zhí)行機(jī)上只需要docker pull, docker run就可以了令野,避免因?yàn)榄h(huán)境舀患,依賴包等差異帶來眾多的問題。在我的另一篇文章中有介紹如何在docker容器中執(zhí)行自動(dòng)化測試气破。
- 與用例管理系統(tǒng)集成:自動(dòng)化測試執(zhí)行后都會生成測試報(bào)告聊浅,但是更進(jìn)一步,如果能夠和用例管理系統(tǒng)集成现使,自動(dòng)標(biāo)注執(zhí)行結(jié)果低匙,那就更省事了,在很多項(xiàng)目中也是常見的做法朴下。不同公司和項(xiàng)目使用的用例管理系統(tǒng)千差萬別努咐,有些還是內(nèi)部開發(fā)的系統(tǒng),需要根據(jù)實(shí)際情況分析解決殴胧。但一般都需要用例管理系統(tǒng)能夠提供標(biāo)注執(zhí)行結(jié)果的API,在測試執(zhí)行后有專門的程序來收集整理測試報(bào)告佩迟,再調(diào)用用例管理系統(tǒng)的API來標(biāo)注結(jié)果团滥。以業(yè)界名氣最大的JIRA舉例,就提供了API可以查詢和標(biāo)注test case的執(zhí)行結(jié)果报强,所以只需要將執(zhí)行結(jié)果按照API規(guī)定消息格式整理好灸姊,調(diào)用即可,并不難實(shí)現(xiàn)秉溉。
??以上介紹了一個(gè)通用的自動(dòng)化測試平臺需要包含哪些功能力惯,以及這些功能如何實(shí)現(xiàn)。如果是移動(dòng)端的測試平臺召嘶,則還有更多的問題父晶,例如不同設(shè)備的兼容性,如何并發(fā)和調(diào)度多臺不同設(shè)備弄跌,在BAT這些頂尖互聯(lián)網(wǎng)公司有成熟的實(shí)踐甲喝,從本質(zhì)上看,構(gòu)建一個(gè)比較完善的自動(dòng)化測試平臺铛只,需要對被測系統(tǒng)有深入的了解埠胖,有扎實(shí)的軟件測試和編程基礎(chǔ),熟悉至少一門編程語言淳玩,熟悉CI和Devops直撤,有比較廣的知識面和技術(shù)棧,知道如何選用合適的工具和框架來解決問題蜕着。