1、單元測試
2皮假、自動化測試
自動化測試鞋拟,把人對軟件的測試行為轉化為由機器執(zhí)行測試行為的一種實踐骂维。
自動化測試的本質是先寫一段代碼惹资,然后去測試另外一段代碼,所以實現(xiàn)自動化測試用例本身屬于開發(fā)工作航闺,需要投入大量的時間和精力褪测,并且已經開發(fā)完成的用例還必須隨著被測對象的改變而不斷更新,你還要為此付出維護測試用例的成本潦刃。
當你發(fā)現(xiàn)自動化測試用例的維護成本高于其節(jié)省的測試成本時侮措,自動化測試就失去了價值與意義,你也就需要在是否使用自動化測試上權衡取舍了乖杠。
為什么要自動化測試分扎?(優(yōu)勢)
(1)自動化測試可以替代大量的手工機械重復性操作,測試工程師可以把更多時間花在更全面的用例設計和新功能的測試上胧洒。
(2)? 自動化測試可以大幅提升回歸測試的效率畏吓,非常適合敏捷開發(fā)過程。
(3)自動化測試可以更好地利用無人值守時間卫漫,去更頻繁地執(zhí)行測試菲饼,特別適合現(xiàn)在非工作時間執(zhí)行測試,工作時間分析失敗用例的工作模式列赎;
(4)自動化測試可以高效實現(xiàn)某些手工測試無法完成或者代價巨大的測試類型宏悦,比如關鍵業(yè)務?7×24?小時持續(xù)運行的系統(tǒng)穩(wěn)定性測試和高并發(fā)場景的壓力測試等;
(5)自動化測試還可以保證每次測試執(zhí)行的操作以及驗證的一致性和可重復性包吝,避免人為的遺漏或疏忽饼煞。
劣勢
(1)自動化測試并不能取代手工測試,它只能替代手工測試中執(zhí)行頻率高、機械化的重復步驟施禾。你千萬不要奢望所有的測試都自動化霸株,否則一定會得不償失。
(2)自動測試遠比手動測試脆弱芭届,無法應對被測系統(tǒng)的變化,業(yè)界一直有句玩笑話“開發(fā)手一抖感耙,自動化測試忙一宿”褂乍,這也從側面反映了自動化測試用例的維護成本一直居高不下的事實。
其根本原因在于自動化測試本身不具有任何“智能”即硼,只是按部就班地執(zhí)行事先定義好的測試步驟并驗證測試結果逃片。對于執(zhí)行過程中出現(xiàn)的明顯錯誤和意外事件,自動化測試沒有任何處理能力。
(3)自動化測試用例的開發(fā)工作量遠大于單次的手工測試褥实,所以只有當開發(fā)完成的測試用例的有效執(zhí)行次數(shù)大于等于?5?次時呀狼,才能收回自動化測試的成本。
(4)手工測試發(fā)現(xiàn)的缺陷數(shù)量通常比自動化測試要更多损离,并且自動化測試僅僅能發(fā)現(xiàn)回歸測試范圍的缺陷哥艇。
(5)測試的效率很大程度上依賴自動化測試用例的設計以及實現(xiàn)質量,不穩(wěn)定的自動化測試用例實現(xiàn)比沒有自動化更糟糕僻澎。
(6)實行自動化測試的初期貌踏,用例開發(fā)效率通常都很低,大量初期開發(fā)的用例通常會在整個自動化測試體系成熟窟勃,和測試工程師全面掌握測試工具后祖乳,需要重構。
(7)業(yè)務測試專家和自動化測試專家通常是兩批人秉氧,前者懂業(yè)務不懂自動化技術眷昆,后者懂自動化技術但不懂業(yè)務,只有二者緊密合作汁咏,才能高效開展自動化測試亚斋。
(8)自動化測試開發(fā)人員必須具備一定的編程能力。
什么樣的項目適合自動化測試梆暖?
第一伞访,需求穩(wěn)定,不會頻繁變更轰驳。
第二厚掷,研發(fā)和維護周期長,需要頻繁執(zhí)行回歸測試级解。
建議:對于一些中長期項目冒黑,對比較穩(wěn)定的軟件功能進行自動化測試,對于變動較大或者需求暫時不明確的功能進行手工測試勤哗,最終目標是用20%的精力去覆蓋80%的回歸測試抡爹。
第三,需要在多種平臺上重復運行相同測試的場景芒划。
第四冬竟,某些測試項目通過手工測試無法實現(xiàn),或者手工成本太高民逼。
第五泵殴,被測軟件的開發(fā)較為規(guī)范,能夠保證系統(tǒng)的可測試性拼苍。
另外笑诅,某些用例的自動化必須要求開發(fā)人員在產品中預留可測試性接口,否則后續(xù)的自動化會很難開展。
第六吆你,測試人員已經具備一定的編程能力弦叶。
在軟件研發(fā)生命周期的各個階段都有自動化測試技術的存在,并且對提升測試效率有著至關重要的作用
1妇多、單元測試的自動化技術
從廣義上講伤哺,單元測試階段的“自動化”內涵不僅僅指測試用例執(zhí)行的自動化,還應該包含以下五個方面:
(1)用例框架代碼生成的自動化砌梆;
(2)部分測試輸入數(shù)據的自動化生成默责;
如果函數(shù)內部沒有對空指針進行特殊處理,那么函數(shù)?fun?的調用必定會拋出異常咸包,從而發(fā)現(xiàn)函數(shù)的設計缺陷。同樣地杖虾,對于輸入參數(shù)?short?b?會自動生成超出?short?范圍的?b烂瘫,測試函數(shù)?fun?的行為。
(3)自動樁代碼的生成奇适;
簡單地說坟比,樁代碼(stub?code)是用來代替真實代碼的臨時代碼。比如嚷往,某個函數(shù)?A?的內部實現(xiàn)中調用了一個尚未實現(xiàn)的函數(shù)?B葛账,為了對函數(shù)?A?的邏輯進行測試,那么就需要模擬一個函數(shù)?B皮仁,這個模擬的函數(shù)?B?實現(xiàn)就是所謂的樁代碼籍琳。
自動樁代碼的生成是指自動化工具可以對被測試代碼進行掃描分析,自動為被測函數(shù)內部調用的其他函數(shù)生成可編程的樁代碼贷祈,并提供基于測試用例的樁代碼管理機制趋急。此時,單元測試開發(fā)者只需重點關注樁代碼內的具體邏輯實現(xiàn)势誊,以及樁代碼的返回值呜达。
必要的時候,自動化工具還需要實現(xiàn)?“抽樁”粟耻,以適應后續(xù)的代碼級集成測試的需求查近。
那什么是“抽樁”呢?其實也很簡單挤忙,在單元測試階段霜威,假如函數(shù)?A?內部調用的函數(shù)?B?是樁代碼,那么在代碼級集成測試階段饭玲,我們希望函數(shù)?A?不再調用假的函數(shù)?B侥祭,而是調用真實的函數(shù)?B,這個用真實函數(shù)?B?代替原本樁代碼函數(shù)?B?的操作,就稱為“抽樁”矮冬。
(4)被測代碼的自動化靜態(tài)分析谈宛;
靜態(tài)分析主要指代碼的靜態(tài)掃描,目的是識別出違反編碼規(guī)則或編碼風格的代碼行胎署。通常這部分工作是結合項目具體的編碼規(guī)則和編碼風格吆录,由自動化工具通過內建規(guī)則和用戶自定義規(guī)則自動化完成的。目前比較常用的代碼靜態(tài)分析工具有?Sonar?和?Coverity?等琼牧。
嚴格意義上講恢筝,靜態(tài)分析不屬于單元測試的范疇,但這部分工作一般是在單元測試階段通過自動化工具完成的巨坊,所以我也把它歸入到了單元測試自動化的范疇撬槽。
(5)測試覆蓋率的自動統(tǒng)計與分析。
單元測試用例執(zhí)行結束后趾撵,自動化工具可以自動統(tǒng)計各種測試覆蓋率侄柔,包括代碼行覆蓋率、分支覆蓋率占调、MC/DC?覆蓋率等暂题。這些自動統(tǒng)計的指標,可以幫你衡量單元測試用例集合的充分性和完備性究珊,并可以為你提供適當增補測試用例以提高測試覆蓋率的依據薪者。
代碼級集成測試的自動化技術
通俗地講,代碼級集成測試是指將已經開發(fā)完成的軟件模塊放在一起測試剿涮。
從測試用例設計和測試代碼結構來看言津,代碼級集成測試和單元測試非常相似,它們都是對被測試函數(shù)以不同的輸入參數(shù)組合進行調用并驗證結果幔虏,只不過代碼級集成測試的關注點纺念,更多的是軟件模塊之間的接口調用和數(shù)據傳遞。
代碼級集成測試與單元測試最大的區(qū)別只是想括,代碼級集成測試中被測函數(shù)內部調用的其他函數(shù)必須是真實的陷谱,不允許使用樁代碼代替,而單元測試中允許使用樁代碼來模擬內部調用的其他函數(shù)瑟蜈。
以上的這些異同點就決定了代碼級集成測試“自動化”的內涵與單元測試非常相似烟逊,尤其是在實際操作層面,比如測試用例的設計方法铺根、測試用例的代碼結構以及數(shù)據驅動思想的應用等等宪躯。
但是,代碼級集成測試對測試框架的要求非常高位迂,這個框架除了可以順利裝載自己的軟件模塊外访雪,還必須能裝載其他相互依賴的模塊详瑞,做到被測軟件模塊可運行(Runnable)。
由于代碼級集成測試主要應用在早期非互聯(lián)網的傳統(tǒng)軟件企業(yè)臣缀,那時候的軟件以“單體”應用居多坝橡,一個軟件內部包含大量的功能,每一個軟件功能都是通過不同的內部模塊來實現(xiàn)的精置,那么這些內部模塊在做集成的時候计寇,就需要做代碼級集成測試。
現(xiàn)在的開發(fā)理念追求的是系統(tǒng)復雜性的解耦脂倦,會去盡量避免“大單體”應用番宁,采用?Web?Service?或者?RPC?調用的方式來協(xié)作完成各個軟件功能。所以現(xiàn)在的軟件企業(yè)赖阻,尤其是互聯(lián)網企業(yè)蝶押,基本不會去做代碼級集成測試,我在這里也就不再進一步展開了政供。
Web?Service?測試的自動化技術
Web?Service?測試播聪,主要是指?SOAP?API?和?REST?API?這兩類?API?測試,最典型的是采用?SoapUI?或?Postman?等類似的工具布隔。但這類測試工具基本都是界面操作手動發(fā)起?Request?并驗證?Response,所以難以和?CI/CD?集成稼虎,于是就出現(xiàn)了?API?自動化測試框架衅檀。
如果采用?API?自動化測試框架來開發(fā)測試用例,那么這些測試用例的表現(xiàn)形式就是代碼霎俩。為了讓你更直觀地理解基于代碼的?API?測試用例是什么樣子的哀军,我給你舉一個“創(chuàng)建用戶”API?的例子,你只需要看代碼的大致步驟就可以了打却,具體到每行代碼的含義杉适,我會在后續(xù)文章中詳細講解。
對于基于代碼的?API?測試用例柳击,通常包含三大步驟:
(1)準備?API?調用時需要的測試數(shù)據猿推;
(2)準備?API?的調用參數(shù)并發(fā)起?API?的調用;
(3)驗證?API?調用的返回結果捌肴。
目前最流行的?API?自動測試框架是?REST?Assured蹬叭,它可以方便地發(fā)起?Restful?API?調用并驗證返回結果。關于?REST?Assured?的用法和優(yōu)點状知,我會在后續(xù)文章中詳細介紹秽五。
同樣地,Web?Service?測試“自動化”的內涵不僅僅包括?API?測試用例執(zhí)行的自動化饥悴,還包括以下四個方面:
(1)測試腳手架代碼的自動化生成坦喘;
(2)部分測試輸入數(shù)據的自動生成盲再;
(3)Response?驗證的自動化;
(4)基于?SoapUI?或者?Postman?的自動化腳本生成瓣铣。
第一答朋,測試腳手架代碼的自動化生成
和單元測試階段的用例框架代碼自動生成一個道理,你在開發(fā)?API?測試的過程中更關心的是坯沪,如何設計測試用例的輸入參數(shù)以及組合绿映,以及在不同參數(shù)組合情況下?Response?的驗證,而你不希望將精力浪費在代碼層面如何組織測試用例腐晾、測試數(shù)據驅動如何實現(xiàn)等非測試業(yè)務上叉弦。
這時,測試腳手架代碼的自動生成技術就派上用場了藻糖。它生成的測試腳手架代碼淹冰,通常包含了被測試?API?的調用、測試數(shù)據與腳本的分離巨柒,以及?Response?驗證的空實現(xiàn)樱拴。
第二,部分測試輸入數(shù)據的自動生成
這一點和單元測試的測試輸入數(shù)據的自動化生成也很類似洋满,唯一不同的是晶乔,單元測試針對的參數(shù)是函數(shù)輸入參數(shù)和函數(shù)內部輸入,而?API?測試對應的是?API?的參數(shù)以及?API?調用的?Payload牺勾。數(shù)據生成的原則同樣遵循邊界值原則正罢。
第三,Response?驗證的自動化
對于?API?調用返回結果的驗證驻民,通常關注的點是返回狀態(tài)碼(status?code)翻具、Scheme?結構以及具體的字段值。如果你寫過這種類型的測試用例回还,那你就會知道字段值的驗證相當麻煩裆泳,只有那些你明確寫了?assert?的字段才會被驗證,但是通常你不可能針對所有的字段都寫?assert柠硕,這時就需要?Response?驗證的自動化技術了工禾。
Response?驗證自動化的核心思想是自動比較兩次相同?API?調用的返回結果,并自動識別出有差異的字段值仅叫,比較過程可以通過規(guī)則配置去掉諸如時間戳帜篇、會話?ID(Session?ID)等動態(tài)值。?這部分內容诫咱,我會在后續(xù)文章中詳細講解笙隙。
第四,基于?SoapUI?或者?Postman?的自動化腳本生成
你在使用?SoapUI?或者?Postman?等工具進行?Web?Service?測試時坎缭,已經在這些工具里面積累了很多測試用例竟痰。那么签钩,在引入了基于代碼實現(xiàn)的?API?測試框架之后,就意味著需要把這些測試用例都用代碼的方式重寫一遍坏快,而這額外的工作量是很難被接受的铅檩。
我的建議是,開發(fā)一個自動化代碼轉換生成工具莽鸿。這個工具的輸入是?SoapUI?或者?Postman?的測試用例元數(shù)據(即測試用例的?JSON?元文件)昧旨,輸出是符合?API?測試框架規(guī)范的基于代碼實現(xiàn)的測試用例。這樣一來祥得,原本的測試用例積累可以直接轉換成在?CI/CD?上可以直接接入的自動化測試用例兔沃。
對于新的測試用例,還可以繼續(xù)用?SoapUI?或者?Postman?做初步的測試驗證级及,初步驗證沒有問題后乒疏,直接轉換成符合?API?測試框架規(guī)范的測試用例。對于復雜的測試用例饮焦,也可以直接基于代碼來實現(xiàn)怕吴,而且靈活性會更好。
GUI?測試的自動化技術
GUI?測試的自動化技術可能是你最熟悉的县踢,也是發(fā)展時間最長转绷、應用最廣的自動化測試技術。它的核心思想是硼啤,基于頁面元素識別技術暇咆,對頁面元素進行自動化操作,以模擬實際終端用戶的行為并驗證軟件功能的正確性丙曙。
目前,GUI?自動化測試主要分為兩大方向其骄,傳統(tǒng)?Web?瀏覽器和移動端原生應用(Native?App)的?GUI?自動化亏镰。雖然二者采用的具體技術差別很大,但是用例設計的思路類似拯爽。
對于傳統(tǒng)?Web?瀏覽器的?GUI?自動化測試索抓,業(yè)內主流的開源方案采用?Selenium,商業(yè)方案采用?Micro?Focus?的?UFT(前身是?HP?的?QTP)毯炮;
對于移動端原生應用逼肯,通常采用主流的?Appium,它對?iOS?環(huán)境集成了?XCUITest桃煎,對?Android?環(huán)境集成了?UIAutomator?和?Espresso篮幢。