非常認可這句話:
自動化測試是為了提高效率,測試腳本要易維護,不能讓測試腳本變成另一種技術債務,不能為了自動化測試而自動化測試。
文章轉自:持續集成實踐之自動化測試
軟件測試
軟件測試大概這么分類:
- 黑盒測試 VS 白盒測試,以及介于黑盒白盒之間的灰盒測試
- 按測試粒度可分為: unit test, functional test, integration test, system test, acceptance test 等
- 按測試目的可分為: sanity test(smoke test), build verification test(BVT), regression test, stress test, performance test, usability test, security test, ad hoc test 等
- 按是否自動化可分為: manual test VS automated test (簡稱TA)
BVT, regression test, performance test等都應該是automated test, 否則測試效率會很低.
在TA成本可接受的情況下,應該盡可能將測試都做成automated test, 除非某些測試需要人來校驗(界面是否美觀,音視頻質量是否可接受等).
自動化測試
自動化測試就是用程序測試程序。項目需要快速迭代快速交付,或手工測試無法完成(譬如性能測試)時,就需要考慮自動化測試,自動化測試可以簡單分為:
- UI driven testing - 模擬鼠標鍵盤事件來驗證程序行為,或者錄制回放(UI通常變化較快,錄制腳本不容易維護,因此不推薦)
- Code driven
- testingUnit Test - 利用xUnit框架測試類方法,模塊接口,庫接口的輸入輸出來驗證程序行為
- API driven testing - 程序常常分層設計,可以測試每一層的API interface來驗證程序行為
記住,自動化測試是為了提高效率,測試腳本要易維護,不能讓測試腳本變成另一種技術債務,不能為了自動化測試而自動化測試。
自動化測試框架
正如有各種各樣的開發框架,自動化測試也有各種各樣的框架,這些框架可以幫助我們更快速的實現自動化測試,更方便的寫測試腳本,讓我們更專注于項目邏輯和測試本身,自動化測試框架非常多,有的開源,有的收費,開源測試框架基本能滿足我們的大多數需要,因此我們將主要推薦開源測試框架。
如何選擇測試框架?不同框架適用不同測試目的,支持不同平臺,支持不同語言等,想明白這幾個問題就很容易找到適合自己的框架了。
Unit test, UI driven test, performance test這三種類型是比較常見的自動化測試類型,相應的自動化測試框架也多一些。
下面列出一些比較常見的框架,后面會詳細介紹一些框架。
STAF/STAX - Software Test Automation Framework (STAF) 是由IBM開發的開源、跨平臺、支持多語言的自動化測試框架
-
Robot Framework
- 由Nokia Networks提供的跨平臺、支持Python,Java等語言的開源測試框架,主要代碼由Python實現,是一種keyworld driven的測試框架。可以通過XML-RPC插件實現跨機器的testing。Robot Framework + Selenium是比較常見的web UI的測試方案。
- STAF和Robot Framework都屬于管理執行框架,本身不提供基礎的自動化測試支持,一般會集成一個其他自動化測試框架,譬如robot可以集成selenium,http://wiki.opensfs.org/Automation_framework_evaluation有STAF vs Robot Framework的比較.
TestNG - Java功能測試一般使用這個框架
JMeter - Java性能測試一般使用這個框架
-
UI testing framework:
- QTP(收費) - HP QuickTest Professional
- calabash-android, calabash-ios - 移動平臺的測試框架
- Selenium/webdriver - web UI測試一般使用這個框架
- Robotium - android UI測試一般使用這個框架
- AutoIt - windows UI,基于windows控件消息
- UI Automation - 微軟提供的測試框架,基于MSAA技術
LoadRunner(收費) - HP提供,用于性能測試
iOS/Android/OSX等平臺都自帶了測試自動化的支持,Visual Stadio和Xcode也包含自動化測試工具.
xDD
軟件工程界流行各種xDD (x driven developmen),下面介紹幾個:
TDD - Test Driven Development
大概的流程是先針對每個功能點抽象出接口代碼,然后編寫單元測試代碼,接下來實現接口,運行單元測試代碼,循環此過程,直到整個單元測試都通過。
BDD - Behavior Driven Development
BDD基于TDD,使用Given/When/Then的句式描述一個個use case,描述更接近自然語言和容易理解,方便DEV/QA/PO/stakeholders等人員相互交流。Cucumber是目前流行的BDD框架,由Ruby實現。
其他的xDD還有IDD(Inteface Driven Development), DDD(Domain Driven Development), FDD(Feature Driven Development), MDD(Model Driven Development), ATDD(Acceptance Test-Driven Development)等。
個人認為,程序能做到Interface Driven Design就可以有效的實現模塊間的解耦和方便測試代碼的編寫,IDD也是TDD的基礎,因此開發代碼時需要先做到IDD,再做到TDD,其他的xDD則未必需要。
單元測試框架 - xUnit/xMock
單元測試是最常見的測試類型,一般為xUnit框架,常用的Unit Test框架有:
- Java - JUnit, TestNG, jMock
- C++ - Google Test, Google Mock
- JavaScript - QUnit, JSTestDriver
- Python - py.test, nose
- C# - NUnit
更多閱讀:
- http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks - 各種語言的單元測試框架列表
- http://gamesfromwithin.com/exploring-the-c-unit-testing-framework-jungle - C++ unit test框架比較
STAF/STAX
Software Test Automation Framework (STAF) 是由IBM開發的開源、跨平臺、支持多語言的自動化測試框架,主要代碼由C++實現,支持Windows/Linux/Mac/Solaris等平臺。
STAF封裝了不同平臺和不同語言間通信的復雜性,提供了消息、互斥、同步、日志等可復用的服務,使用戶可以在此基礎上方便快速地構建自動化測試解決方案。
STAFProc
STAF的核心是一個后臺程序STAFProc,也叫STAF Daemon,舉例,如果你想在你的本地linux機器上驅動實驗室里的3臺windows test machine和2臺mac test machine,那么需要在這6臺機器上都裝上STAF,也就是說,這6臺機器上都運行STAFProc程序,如下圖:
從STAF的環境里,并沒有客戶端/服務器的區別,這6臺機器都是平等的,從一個STAF端可以直接調用另一個STAF端提供的服務。
STAF Service
STAF是一個插件架構,這些插件就是Service,STAF的具體功能都是由各種service提供,STAFProc自帶了一些service(稱為內部service),也有很多外部service,用戶還可以開發自己的service,外部Service可以用C++或Java開發,STAF可以加載DLL文件或JAR文件里的Service。
內部Service和STAFProc在一起,這表示內部Service是永遠可用的,名字也是固定的,下面是幾個常見的內部Service(非完整列表):
- DIAG - diagnostics, 用于調試
- DELAY - 延遲等待一段時間
- FS - file system, 用于文件操作
- PING - 檢查本地或遠程服務是否可用
- PROCESS - 可以啟動、停止或者查詢進程
- SHUTDOWN - 用于shutdown STAFProc
外部service一般需要到STAF官網去下載服務組件包,一般服務組件包下完后還需要一些配置,下面是一些常用的外部服務:
- STAX - 一個基于XML的執行引擎,在XML中定義測試工作流,可以實現并行執行、嵌套測試用例、控制運行時間等,STAX支持Java 和 Python 模塊
- CRON - 定義定時任務,使用Jenkins的話,也可以在Jenkins里定義定時任務
- EMAIL - 發送郵件
- HTTP - 發送HTTP請求
- ZIP - 提供壓縮與解壓
STAF Requests
STAF實現了跨機器的通訊,用戶程序通過發送請求來調用各個服務的功能,每個請求都以字符串的形式發送,這樣可以保證 STAF 能夠跨平臺的運行。每個請求都有三個參數,以“系統-服務-參數”的形式出現,第一個參數表示此請求需要被發送到的哪個機器,第二個參數表示要調用哪個Service,第三個參數傳給被調用的Service使用。舉例,"STAF local ECHO hello"表示調用本機的ECHO Service,“STAF 1.2.3.4 PING PING”表示調用機器1.2.3.4上的PING服務。
STAF的通訊層基于CORBA,http://www.51testing.com/html/36/n-73836.html詳細介紹了STAF的由來和設計細節。
Windows GUI測試 - MSAA與AutoIt
MSAA全稱為Microsoft Active Accessibility,基于COM技術,核心接口是IAccessible,MSAA的下一代產品是UI Automation (UIA),核心接口為IAccessibleEx和IRawElementProviderSimple,從 Windows7以來,微軟在努力把它的accessibility technologies放進一個framework里面,稱之為Windows Automation API。詳情參考博客
Windows GUI的自動化測試一般都是基于MSAA技術,被測程序需要支持MSAA/UIA,實現對應的COM接口,然后測試程序就可以通過MSAA接口讀取UI元素。
另一個測試windows UI的常用工具是AutoIt,AutoIt基于類似Spy++的窗口技術,可以識別標準的window控件,使用類似basic的自有語言來寫test case,AutoIt不僅用于Windows GUI測試,也常用來開發windows平臺工具軟件來自動執行常見的任務,還常用來開發計算機游戲機器人,用來自動執行游戲中的任務等。
更多閱讀: http://en.wikipedia.org/wiki/List_of_GUI_testing_tools
Web UI測試 - Selenium WebDriver
Selenium是由ThoughtWorks公司開發的開源的web自動化測試工具,用于自動化瀏覽器。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持所有主流瀏覽器,也支持多種語言來編寫測試代碼,是應用最廣泛的web程序自動化測試工具.
Selenium 2.0(又名 Selenium WebDriver)的主要新功能是集成了 WebDriver。WebDriver 曾經是 Selenium 1(又名 Selenium Remote Control, 簡寫為Selenium RC)的競爭對手。Selenium RC 在瀏覽器中運行 JavaScript 應用,而 WebDriver 通過原生瀏覽器支持或者瀏覽器擴展直接控制瀏覽器。
Selenium 1.0 + WebDriver = Selenium 2.0
Selenium 1 是一款流行和完善的測試框架,支持眾多瀏覽器(因其 JavaScript 實現),允許用戶通過許多編程語言(從 Java/C# 到 PHP、Erlang...)編寫測試腳本,而 WebDriver 則彌補了 Selenium 1 的缺點,跳出了 JavaScript 的沙箱,提供快速、輕量級的瀏覽器模擬器。之所以合并,原因如下:
- WebDriver 解決了 Selenium 存在的缺點(比如,繞過 JS 沙箱)
- Selenium 解決了 WebDriver 存在的問題(例如支持廣泛的瀏覽器)
WebDriver 針對各個瀏覽器而開發,使用各個瀏覽器提供的native support操縱瀏覽器,取代了 Selenium RC 中嵌入到被測 Web 應用中的 JavaScript,與瀏覽器的緊密集成可以支持創建更高級的測試,且避免了 JavaScript 安全模型導致的限制。除了來自瀏覽器廠商的支持,WebDriver 還利用操作系統級的調用模擬用戶輸入。
WebDriver 支持 Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver) 和 Chrome (ChromeDriver)。它還支持 Android (AndroidDriver) 和 iPhone (IPhoneDriver) 的移動應用測試。此外,還包括一個基于 HtmlUnit 的無界面實現,即 HtmlUnitDriver。WebDriver API 可以通過 Python、Ruby、Java 和 C# 訪問,支持開發人員使用他們偏愛的編程語言來創建測試。
Selenium 2.0包含如下幾個工具:
- Selenium IDE - 一個Firefox插件,錄制回放用戶的基本操作,生成測試用例
- Selenium WebDriver - 前身為Selenium RC, 包括一組browser driver和不同語言對應的language bindings, 支持多種平臺(Windows,Linux,Mac等)和多種瀏覽器(IE,Firefox,Opera,Safari,Chrome等),可以用多種語言(Java,Ruby,Python,Perl,PHP,C#等)編寫測試用例
- Selenium Server - 單機運行測試腳本時無需這個工具,使用Selenium Grid分發到遠程機器上運行Webdriver測試腳本時需要
假設在Mac機器上用Java寫測試腳本在Chrome里測試,配置Selenium開發環境可能需要如下幾個工具:
- Selenium Chrome Driver, 用于驅動Chrome瀏覽器
- Selenium Client Drivers - Java, 用于支持Java測試腳本
- Selenium Server, 用于遠程機器測試,單機時不需要
另一個簡單的方法是使用Maven來配置Java環境的Selenium開發環境,參考官網可以了解更多配置文檔.
更多閱讀:
- http://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver
- http://www.cnblogs.com/nbkhic/tag/webdriver/ - 乙醇的blog
- https://github.com/easonhan007/webdriver_guide/blob/master/README.md - WebDriver使用指南
- http://watirwebdriver.com - Watir WebDriver, in Ruby
- http://www.17test.info - Watir WebDriver中文站, by 乙醇
Android測試 - Robotium
Robotium用于Android平臺上進行黑盒自動化測試,作用類似于web平臺的selenium,提供了模擬各種手勢操作(點擊、長按、滑動等)、查找和斷言機制的API,能夠對各種控件進行操作,適用于測試android native app and hybrid app。
Robotium是 android 自帶類 Instrumentation 的一個封裝,方便測試人員直接調用封裝好的接口,也就是說,實際上我們直接使用Instrumentation 也能夠進行自動化測試,但robotium可以簡化我們的測試步驟,我們只需要調用某個robotium的API,傳幾個參數,就等于我們在調用一部分的Instrumentation幫我們實現測試。
Java代碼測試 - TestNG
TestNG是類似JUnit/NUnit的測試工具,能夠實現unit test, functional test, end-to-end test, integration test等各種測試.
TestNG和JUnit是針對Java語言的兩個比較常用的測試框架,兩者的相同點:
- 使用annotation,且大部分annotation相同。
- 都可以進行單元測試(Unit test)。
- 都是針對Java測試的工具。
TestNG與JUnit的不同點:
- JUnit只能進行單元測試,TestNG可以進行單元測試,功能測試,端到端測試,集成測試等
- TestNG需要一個額外的xml配置文件,配置測試的class、method甚至package
- TestNG的運行方式更加靈活:命令行、ant和IDE,JUnit只能使用IDE
- TestNG的annotation更加豐富,比如@ExpectedExceptions、@DataProvider等
其他工具
自動化測試一般是持續集成的一部分,為了做好持續集成,通常會需要:
- Jenkins - CI工具
test case fail時,可能會需要自動創建bug跟蹤,因此可能需要集成下面的bug管理工具:
- Jira/Bugzilla - Bug管理工具
為了提高代碼質量,可能會用到下面一些工具:
- 代碼靜態掃描 -
- 內存泄漏分析 - valgrind on linux, appverifier on windows
- 性能分析
為了驗證測試coverage,可能需要用到code coverage tool:
- gcov, c++, gcc only
- BullseyeCoverage, c++
- Rational PureCoverage, c++
- EMMA, java
- ScriptCover, javascript
- JSCoverage, javascript
更多閱讀:
- http://mysuperbaby.iteye.com/blog/1393781 - jenkins入門
- http://blog.csdn.net/windone0109/article/details/15814653 - c++ code coverage tools
- http://www.csdn.net/article/2010-09-09/279253 - 代碼覆蓋率:80%,不能少