自動化測試的專業領域
這篇文章主要說明自動化測試的專業領域與範疇。
同時也介紹一些業界常見的工具。
工具的使用源自於需要解決什麼樣的問題,
因此必須根據當下專案的狀況與目標採用適當工具。
要做到這樣,前提必須先知道有哪些工具可以採用?有什麼優缺點?
效能測試
使用工具:Jmeter http://jmeter.apache.org/
解決的問題:效能測試。例如,模擬3000個人同時訪問該網站的網路流量。
另一方面,Jmeter也可以運用在Web API的測試,透過 Http Request/Response的方式來驗證測試結果的正確性。
網站自動化測試
提到網站自動化測試,opensource的兩大主流就是 Selenium與 JMeter
這兩個都是網站自動化測試業界的主流,但是測試的方法與觀點不同。
- Selenium: 主要是以模擬使用者操作為目標的 End to End 測試。實際啟動瀏覽器,尋找瀏覽器上的網頁元件作操作與驗證。優點是這樣的測試最接近使用者的使用行為,但是缺點是這樣的測試會因為許多非預期因素而導致測試失敗。例如,找不到網頁元件、網頁載入過慢等。http://www.seleniumhq.org/
- Jmeter: Jmeter主要是針對 Http Request / Response 內容做驗證。不管該 http response 後呈現的結果,也不會執行CSS/ JavaScript等。對於Jmeter來說 Http 的內容就像一般的文字內容。因此,驗證的動作只是針對該http response回傳的內容確定我們要找的關鍵字是否存在。這樣的測試相對容易,而且比較不會出錯。很適合用在做 WEb Restful 的測試。
手機自動化測試
使用工具:Appium
解決問題:Android app or iOS app 的自動化測試。手機的程式也可以利用Selenium進行自動化測試。
Appium(介於手機與自動化測試程式WebDriver script間)的出現,讓手機程式的自動化程式變得更容易。自動化測試程式不需要管是 iOS or Android,
也可以使用任何熟悉的語言 python, Java等,就可以撰寫自動化測式程式 (WebDriver Script)
Windows App的自動化測試
典型的Windows App像是小算盤,小畫家、EXCEL等。這些應用程式因為不是Web Service的形式,因此無法用Selenium做自動化測試。
目前比較常見使用的就是 AutoIT 或是 sikuli。
- AutoIT: 主要運用Windows Object每個元件的ID來做定位,因此準確度比較高。 https://www.autoitscript.com/site/autoit/
- Sikuli:主要運用看到的”畫面”圖形來做元件的定位,因此如果畫面稍有修改,顏色、字型、位子、形狀等,就會導致自動化測試的執行失敗。 http://www.sikuli.org/
小算盤 | 小畫家 | EXCEL |
Behavior Driver Development(BDD)
Scenario 1: Refunded items should be returned to stock Given a customer previously bought a black sweater from me And I currently have three black sweaters left in stock When he returns the sweater for a refund Then I should have four black sweaters in stock
BDD主要用於 User Acceptance Testing。目標就是希望將 User story 的寫法,變成可執行的測試程式。
與 TDD (unit Test)不同的是,TDD主要在驗證每一個API、function、class的輸入輸出正確性。
BDD主要是以使用者最終觀點來看系統的行為。
因此,BDD的測試程式就會變成這樣user story的形式出現。BDD最大的缺點是這樣的英文語法是需要規範的。
怎麼說呢?電腦怎麼知道 “a customer previously bought a black sweater from me” 這段句子要執行什麼或是如何判斷?
因此,程式語言就要定義這段英文要執行的程式碼。
問題來了,如果該語句英文有文法錯誤、拼錯,或是用不同的英文寫法,程式就會容易出錯。
造成,開發人員或是撰寫User story 一定要符合程式定義的語句。這是BDD開發最大的困難與缺點。
這類的工具程式很多,知名的包含 Robot framework, Cucumber, 還有Python 使用的behave等。
Scenario 1: Refunded items should be returned to stock Given a customer previously bought a black sweater from me And I currently have three black sweaters left in stock When he returns the sweater for a refund Then I should have four black sweaters in stock |
Unit Testing
這類的測試程式主要驗證每一個 function、method、Class等,每個程式模組的正確性。
每一種程式語言都有提供類似的 Unit Testing。例如 python的 unittest或是nose。Java的 Junit與 TestNG。
這類的 unittest都會提供下列主要功能:
- Assertion驗證: Assertion (Expected Results, TargetTesting(“Mydata”) )
如果沒有使用 unittest工具的話,對於 TargetTesting這個函數來說驗證通常寫法如下:
If TargetTesting(“Mydata”) == Expected_Results
print “testing success”
else
print “testing failure”
除此之外,每個測試的個案成功與失敗,如果要做格式化的管理與輸出都會比較麻煩。
使用 Unittest之後,程式就會類似如下:
@test (description = “Target Testing”)
Assertion (Expected Results, TargetTesting(“Mydata”) )
只需要使用 Assertion這個函數,給予兩個值,Unittest就會自動驗證該兩個值是否相等,並且會注意該測試個案成功還是失敗。
- 測試個案執行
測試個案執行比較特別的是通常測試個案執行時需要環境的準備,或是設定 P1的測試個案 or P2的測試個案。
- 測試結果的格式化輸出
UnitTest的工具都會提供格式化的測試結果輸出。例如:Java Junit or TestNG
多台電腦的測試架構 Framework
這裡指的測試架構主要是當有多台電腦環境的時候,如何將測試個案佈署並且回傳執行結果。
由於 Jenkins的使用普及,這部分目前漸漸由 Jenkins取代。每種自動化測試程式也會提供類似的機制。例如:Selenium GRID
自動化測試程式語言 Java or Python?
多半的自動化測試都會支援 Java or Python,
例如:Selenium WebUI的自動化測試,可以使用 Java, Python, C# or Ruby等程式語言
使用 Java or Python哪一種比較好? 其實沒有定論。Java or Python都有自己程式語言的特性與工具。
使用 Java 的優點是Selenium網站上的論壇或是範例多半都是 Java 為例子。另外,Java也可以支援 JMeter , Sikuli等。
以自動化測試所要完成的事情來說,使用 Java or Python都是不錯的選擇。
但是如果是以 UnitTest來看,使用的語言就必須是受測目標所使用的程式語言。該應用程式如果是用 Java 開發,那麼就必須使用 Java UnitTesting。
小結
自動化測試的終極目標,讓每天團隊程式的開發,都可以即早得到驗證的結果。
這裡要強調的是”自動化” 而不是”人力”測試,因為只有”自動化”測試才能夠達到將下列整個軟體開發的周期循環縮短。
(圖檔來源:www.techrains.com)