做自動化測試之前需要了解的
首先理清自動化測試的概念,什麽是自動化測試?
廣義上來講,自動化包括一切通過工具(程序)的方式來代替或輔助手工測試的行為都可以看做是自動化,包括性能測試工具(Loadrunner、Jmeter),或自己所寫的一段程序,用於生成1到100個測試數據。
狹義上來講,通過工具記錄或編寫腳本的方式模擬手工測試的流程,通過回放或運行腳本來執行測試用例,從而代替人工對系統的功能進行驗證。
一般我們普遍認識把“自動化測試”看做“基於產品或項目UI層的自動化測試”。
分層的自動化測試:這個概念最近曝光度比較高,傳統的自動化測試更關註產品UI層的自動化測試,而分層的自動化測試倡導產品的不同階段(層次)都需要自動化測試。
很多人會認為這個不就是產品開發不同階段所對應的測試麽!但我們需要規範來做,單元測試同樣需要相應的單元測試框架,如java的Junit、testNG ;C#的Nunit ;Python的Unittest 、pytest等,幾乎所有的主流語言都會有其對應的單元測試框架。
集成、接口測試對於不少測試新手來說不太容易理解,單元測試關註代碼的實現邏輯,例如一個if分支或一個for循環的實現,那麽集成、接口測試關註的是一個函數、類(方法)所提供的接口是否可靠,例如我定義一個add()函數用於計算兩個參數的結果並返回,那麽我需要調用add()並傳參,並比較返回值是否兩個參數相加。當然,接口測試也可以是url的形式進行傳遞。例如,我們通過get方式向服務器發送請求,那麽我們發送的內容做為URL的一部分傳遞到服務器端。但比如WEB service 技術對外提供的一個公共接口,需要通過soapUI等工具對其進行測試。
UI層的自動化測試,大部分測試人員的大部分工作都是對UI層的功能進行測試,例如,我們不斷重復的對一個表單提交,結果查詢等功能進行測試,我們可以通過相應的自動化測試工具來模擬這些操作,從而解放重復的勞動。UI層的自動化測試工具特別多,比較主流的是QTP、 Robot Framework 、watir 、selenium等。
為什麽要畫成一個金字塔形,不是長方形或者金字塔形呢?這是為了表示不同階段所投入自動化測試的比例。如果一個產品從沒有做單元測試與接口測試,只做UI層的自動化測試是不科學的,從而很難從本質上保證產品的質量,如果妄圖實現全面的UI層的自動化測試,那更是一個勞民傷財的舉動,投入了大量的人力時間,最終獲得的收益可能會遠遠低於所支付的成本。因為越往上層,維護成本越高。尤其是UI層的元素會時常發生改變。所以,我們應該把更多的自動化測試放在單元測試與接口測試階段進行。
既然UI層的自動化測試這麽勞民傷財,那我們只做單元測試與接口測試就好了,NO!因為不管什麽樣的產品,最終呈現給客戶的是UI層。所以,測試人員應該更多的精力放在UI層,有必要通過自動化的方式部分解放“重復的勞動”。
在自動化測試中,最怕的就是變動,因為變動的直接結果就是導致測試用例執行的失敗,那麽就需要對自動化腳本進行維護,如何控制失敗,降低維護成本對自動化的成敗至關重要,反過來講,一份永遠都運行成功的自動化測試用例是沒有價值的。
至於在金字塔中三種測試的比例要根據實際的項目需求來劃分,在《Google測試之道》一書,對於Google產品,70%投入為單元測試,20%為集成、接口測試,10%為UI層的自動化測試。
為什麽要學習自動化測試?
從測試人員自身的發展來說,其實非常需要通過自動化測試技術來增加自己的競爭力。
從測試行業發展來說,國內產品由於產品特點,世界級的產品不多,技術含量相對不高,質量要求相對不高,外包國外項目,測試人力成本低廉,所以需要大量的手工測試人員。
也許不久的獎勵,手工測試會消失。
什麽項目適合做自動化測試?
軟件需求變動不頻繁
測試腳本的穩定性決定了自動化測試的維護成本。如果軟件需求變動過於頻繁,測試人員需要根據變動的需求來更新測試用例以及相關的測試腳本,而腳本的維護本身就是一個代碼開發的過程,需要修改、調試。必要的時候還要修改自動化測試框架,所以所花費的成本不能低於利用其節省的測試成本,那麽自動化測試是失敗的。
項目中的某些模塊相對穩定,而某些模塊需求的變動性很大,我們便可對相對穩定的模塊進行自動化測試,而變動較大的還是用手工測試。
項目周期較長
由於自動化測試需求的確定、自動化測試的框架設計、測試腳本的編寫與調試均需要相當長的時間來完成。如果項目的周期比較短,沒有足夠的時間去支持這樣的一個過程,那麽自動化測試是不可行的。
自動化測試腳本可重復使用
自動化測試腳本的重復要從三個方面來考量,一方面所測試的項目之間是否很大的差異性(如C/S、B/S系統的差異性),所選擇的測試工具是否適應這種差異性,最後,測試人員是否有能力開發適應這種差異的自動化測試框架。
選擇什麽工具進行自動化測試?
首先要先確認所測試的產品是桌面程序(C/S)還是WEB應用(B/S)。
桌面程序的工具有:QTP、Autorunner;
WEB應用的工具有:QTP、Autorunner、Robot Framework、watir、selenium
由於B/S架構的諸多優勢,早幾年前大量C/S架構的應用轉為B/S架構,從而也推動了WEB開發與測試技術的發展。
假如,被測試產品是C/S架構的,那麽推薦QTP,QTP在UI自動化測試領域占到了一半的試用率。所以,足以說明QTP在自動化領域強大、易用性等。要想學好QTP,必須要掌握VBS腳本語言。
如果,被測產品是B/S架構,那麽推薦selenium,為什麽不是QTP或其他工具?因為selenium對B/S應用支持很好,更重要的一點,它支持多語言開發,同時學習一門變成語言是最好的。
selenium 是支持Java 、Python、Ruby 、Php、C#、JavaScript。
從語言易學性來講,首選Ruby、Python;
從語言應用廣度來講,首選Java 、Php、C#;
從語言相關測試技術程度來講:Java 、Python、Ruby 。
selemiun 用前須知:
在開始selenium之前,需要花一到兩個月的時間去學習一門語言,Java 、Python、Ruby 任意一門。
學好語言之後,就要先了解selenium ,selenium並不是單純的一個工具,它是一組工具的集合,每個工具都有其特點和應用,有1.0、2.0、3.0的區分。
selenium IDE
selenium IDE 是嵌入到Firefox瀏覽器中的一個插件,實現簡單的瀏覽器操作的錄制與回放功能,那麽什麽情況下用到它呢?
快速的創建Bug重現腳本,在測試人員的測試過程中,發現了Bug之後可以通過IDE將重現的步驟錄制下來,以幫助開發人員更容易的重現Bug。
IDE錄制的腳本可以轉換成多種語言,從而幫助我們快速的開發腳本。
selenium Gird
selenium Gird 是一種自動化的測試輔助工具,Gird通過利用現有的計算機基礎設施,能加快WEB-APP的功能測試,利用Gird ,可以很方便的同時在多臺計算器上和異構環境中並行運行多個測試用例。其特點為:
並行執行
通過一個主機統一控制用例在不同環境、不同瀏覽器下運行。
靈活添加變動測試機
selenium RC
selenium RC是selenium家族的核心工具,selenium RC支持多種不同的語言編寫自動化測試腳本,通過selenium RC的服務器作為代理服務器去訪問應用從而達到測試的目的。
selenium RC使用分Client Libraries 和 selenium server , Client Libraries庫主要用於編寫測試腳本,用來控制selenium server 的庫。
selenium server負責控制瀏覽器行為,主要包括三個部分,Launcher 、 Http Proxy 、Core 。其中selenium core 是被 selenium server 嵌入到瀏覽器頁面中的,其實selenium core 就是一堆JS函數的集合 ,就是通過這些JS函數,我們才可以實現用程序對瀏覽器進行操作,Launcher用於啟動瀏覽器,把selenium core 加載到瀏覽器頁面當中,並把瀏覽器的代理設置為selenium server 的 Http Proxy 。
selenium 2.0
selenium 2.0 是把Webdriver加入 ,簡單用公式表示為:
selenium 2.0=selenium 1.0 + Webdriver
需要強調的是,selenium 2.0 主推Webdriver ,Webdriver是selenium RC的替代品,因為,selenium為了向下兼容性,所以selenium RC並沒有徹底拋棄,如果你使用selenium 開發一個新的自動化測試項目,強烈推薦使用Webdriver ,那麽selenium RC與Webdriver有什麽區別呢?
selenium RC在瀏覽器中運行JavaScript應用,使用瀏覽器內置的JavaScript翻譯器來翻譯和執行selenese命令,(selenese是selenium命令集合)。
Webdriver通過原生瀏覽器支持或者瀏覽器擴展直接控制瀏覽器,Webdriver針對各個瀏覽器開發,取代了嵌入到被測Web應用中的JavaScript,與瀏覽器的緊密集成支持創建更高級的測試,避免了JavaScript安全模型導致大限制,除了來自瀏覽器廠商的支持,Webdriver還利用操作系統級的調用模擬用戶輸入。
如果是新項目直接學習Webdriver就可以了 ,RC是過時技術。
selenium 學習路線
配置測試環境,針對所學語言配置相應的selenium 的測試環境。
然後熟悉Webdriver API ,API就是selenium 所定義一方法 ,用於定位 ,操作頁面上的各種元素。
先學習元素的定位,selenium提供了id 、name、class name 、tag name 、link text 、partial link text、xpath 、css 等定位方法 。xpath和css功能強大且語法稍微復雜,所以還需要了解更多的前端知識,xml 、 javascript 等。
定位元素的目的是為了操作元素,接著就要學習各種元素操作、輸入框、下拉框、按鈕點擊、文件上傳、下載、分頁、對話框、警告框等等。
經過一段時間的學習,可以遊刃有余的模擬手工測試來操作頁面上的各種元素了,然後把這些用例組織起來,統一來跑。
需要學習並使用單元測試框架,單元測試框架本身就解決了用例的組織與運行。
當寫了一些測試用例後,發現測試用例中有大量的重復操作,能不能單獨寫到一個文件當中,需要的時候調用這些操作,所以運用編程能力實現這點跟簡單。
然後發現每個測試用例中都有一些數據,這些數據也是一樣的,但如果變化了修改起來很麻煩,可以把它寫到一個單獨的文件去讀取。
然後又發現腳本測試用例都是流水式的,怎麽知道用例運行是失敗還是成功呢?那麽就需要在腳本中加一些驗證與斷言。
然後就會發現單元測試框架的Log太簡陋了,能不能生成一張漂亮的測試報告出來?能不能定時的跑一下這個腳本?能不能把每次跑腳本的結果能不能直接發到郵箱等等新的想法。。。
為了解決這些問題,不得不學習更多的編程技術,然後測試結構的功能會越來越強大,越來越靈活,產生了一定的通用性和移植性,最後一個有模有樣的自動化測試框架就這麽的誕生了。
深入學習就會發現自己的知識是不足的,我們就要不斷的去學習,正所謂“活到老、學到老”嘛!
本文出自 “學習改變命運” 博客,謝絕轉載!
做自動化測試之前需要了解的