非常認(rèn)可這句話:
自動(dòng)化測(cè)試是為了提高效率箫踩,測(cè)試腳本要易維護(hù)惦界,不能讓測(cè)試腳本變成另一種技術(shù)債務(wù)垫桂,不能為了自動(dòng)化測(cè)試而自動(dòng)化測(cè)試鲜戒。
文章轉(zhuǎn)自:持續(xù)集成實(shí)踐之自動(dòng)化測(cè)試
軟件測(cè)試
軟件測(cè)試大概這么分類(lèi):
- 黑盒測(cè)試 VS 白盒測(cè)試专控,以及介于黑盒白盒之間的灰盒測(cè)試
- 按測(cè)試粒度可分為: unit test, functional test, integration test, system test, acceptance test 等
- 按測(cè)試目的可分為: sanity test(smoke test), build verification test(BVT), regression test, stress test, performance test, usability test, security test, ad hoc test 等
- 按是否自動(dòng)化可分為: manual test VS automated test (簡(jiǎn)稱TA)
BVT, regression test, performance test等都應(yīng)該是automated test, 否則測(cè)試效率會(huì)很低.
在TA成本可接受的情況下,應(yīng)該盡可能將測(cè)試都做成automated test, 除非某些測(cè)試需要人來(lái)校驗(yàn)(界面是否美觀,音視頻質(zhì)量是否可接受等).
自動(dòng)化測(cè)試
自動(dòng)化測(cè)試就是用程序測(cè)試程序遏餐。項(xiàng)目需要快速迭代快速交付伦腐,或手工測(cè)試無(wú)法完成(譬如性能測(cè)試)時(shí),就需要考慮自動(dòng)化測(cè)試失都,自動(dòng)化測(cè)試可以簡(jiǎn)單分為:
- UI driven testing - 模擬鼠標(biāo)鍵盤(pán)事件來(lái)驗(yàn)證程序行為柏蘑,或者錄制回放(UI通常變化較快,錄制腳本不容易維護(hù)粹庞,因此不推薦)
- Code driven
- testingUnit Test - 利用xUnit框架測(cè)試類(lèi)方法咳焚,模塊接口,庫(kù)接口的輸入輸出來(lái)驗(yàn)證程序行為
- API driven testing - 程序常常分層設(shè)計(jì)庞溜,可以測(cè)試每一層的API interface來(lái)驗(yàn)證程序行為
記住革半,自動(dòng)化測(cè)試是為了提高效率,測(cè)試腳本要易維護(hù),不能讓測(cè)試腳本變成另一種技術(shù)債務(wù)又官,不能為了自動(dòng)化測(cè)試而自動(dòng)化測(cè)試延刘。
自動(dòng)化測(cè)試框架
正如有各種各樣的開(kāi)發(fā)框架,自動(dòng)化測(cè)試也有各種各樣的框架六敬,這些框架可以幫助我們更快速的實(shí)現(xiàn)自動(dòng)化測(cè)試碘赖,更方便的寫(xiě)測(cè)試腳本,讓我們更專(zhuān)注于項(xiàng)目邏輯和測(cè)試本身觉阅,自動(dòng)化測(cè)試框架非常多崖疤,有的開(kāi)源钦睡,有的收費(fèi)纠亚,開(kāi)源測(cè)試框架基本能滿足我們的大多數(shù)需要乐疆,因此我們將主要推薦開(kāi)源測(cè)試框架。
如何選擇測(cè)試框架割笙?不同框架適用不同測(cè)試目的,支持不同平臺(tái)眯亦,支持不同語(yǔ)言等伤溉,想明白這幾個(gè)問(wèn)題就很容易找到適合自己的框架了。
Unit test, UI driven test, performance test這三種類(lèi)型是比較常見(jiàn)的自動(dòng)化測(cè)試類(lèi)型妻率,相應(yīng)的自動(dòng)化測(cè)試框架也多一些乱顾。
下面列出一些比較常見(jiàn)的框架,后面會(huì)詳細(xì)介紹一些框架宫静。
STAF/STAX - Software Test Automation Framework (STAF) 是由IBM開(kāi)發(fā)的開(kāi)源走净、跨平臺(tái)、支持多語(yǔ)言的自動(dòng)化測(cè)試框架
-
Robot Framework
- 由Nokia Networks提供的跨平臺(tái)孤里、支持Python,Java等語(yǔ)言的開(kāi)源測(cè)試框架伏伯,主要代碼由Python實(shí)現(xiàn),是一種keyworld driven的測(cè)試框架捌袜∷到粒可以通過(guò)XML-RPC插件實(shí)現(xiàn)跨機(jī)器的testing。Robot Framework + Selenium是比較常見(jiàn)的web UI的測(cè)試方案虏等。
- STAF和Robot Framework都屬于管理執(zhí)行框架弄唧,本身不提供基礎(chǔ)的自動(dòng)化測(cè)試支持,一般會(huì)集成一個(gè)其他自動(dòng)化測(cè)試框架霍衫,譬如robot可以集成selenium套才,http://wiki.opensfs.org/Automation_framework_evaluation有STAF vs Robot Framework的比較.
TestNG - Java功能測(cè)試一般使用這個(gè)框架
JMeter - Java性能測(cè)試一般使用這個(gè)框架
-
UI testing framework:
- QTP(收費(fèi)) - HP QuickTest Professional
- calabash-android, calabash-ios - 移動(dòng)平臺(tái)的測(cè)試框架
- Selenium/webdriver - web UI測(cè)試一般使用這個(gè)框架
- Robotium - android UI測(cè)試一般使用這個(gè)框架
- AutoIt - windows UI,基于windows控件消息
- UI Automation - 微軟提供的測(cè)試框架慕淡,基于MSAA技術(shù)
LoadRunner(收費(fèi)) - HP提供背伴,用于性能測(cè)試
iOS/Android/OSX等平臺(tái)都自帶了測(cè)試自動(dòng)化的支持,Visual Stadio和Xcode也包含自動(dòng)化測(cè)試工具.
xDD
軟件工程界流行各種xDD (x driven developmen),下面介紹幾個(gè):
TDD - Test Driven Development
大概的流程是先針對(duì)每個(gè)功能點(diǎn)抽象出接口代碼傻寂,然后編寫(xiě)單元測(cè)試代碼息尺,接下來(lái)實(shí)現(xiàn)接口,運(yùn)行單元測(cè)試代碼疾掰,循環(huán)此過(guò)程搂誉,直到整個(gè)單元測(cè)試都通過(guò)。
BDD - Behavior Driven Development
BDD基于TDD静檬,使用Given/When/Then的句式描述一個(gè)個(gè)use case炭懊,描述更接近自然語(yǔ)言和容易理解,方便DEV/QA/PO/stakeholders等人員相互交流拂檩。Cucumber是目前流行的BDD框架侮腹,由Ruby實(shí)現(xiàn)。
其他的xDD還有IDD(Inteface Driven Development), DDD(Domain Driven Development), FDD(Feature Driven Development), MDD(Model Driven Development), ATDD(Acceptance Test-Driven Development)等稻励。
個(gè)人認(rèn)為父阻,程序能做到Interface Driven Design就可以有效的實(shí)現(xiàn)模塊間的解耦和方便測(cè)試代碼的編寫(xiě),IDD也是TDD的基礎(chǔ)望抽,因此開(kāi)發(fā)代碼時(shí)需要先做到IDD加矛,再做到TDD,其他的xDD則未必需要煤篙。
單元測(cè)試框架 - xUnit/xMock
單元測(cè)試是最常見(jiàn)的測(cè)試類(lèi)型斟览,一般為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 - 各種語(yǔ)言的單元測(cè)試框架列表
- http://gamesfromwithin.com/exploring-the-c-unit-testing-framework-jungle - C++ unit test框架比較
STAF/STAX
Software Test Automation Framework (STAF) 是由IBM開(kāi)發(fā)的開(kāi)源辑奈、跨平臺(tái)苛茂、支持多語(yǔ)言的自動(dòng)化測(cè)試框架,主要代碼由C++實(shí)現(xiàn)身害,支持Windows/Linux/Mac/Solaris等平臺(tái)味悄。
STAF封裝了不同平臺(tái)和不同語(yǔ)言間通信的復(fù)雜性,提供了消息塌鸯、互斥侍瑟、同步、日志等可復(fù)用的服務(wù)丙猬,使用戶可以在此基礎(chǔ)上方便快速地構(gòu)建自動(dòng)化測(cè)試解決方案涨颜。
STAFProc
STAF的核心是一個(gè)后臺(tái)程序STAFProc,也叫STAF Daemon茧球,舉例庭瑰,如果你想在你的本地linux機(jī)器上驅(qū)動(dòng)實(shí)驗(yàn)室里的3臺(tái)windows test machine和2臺(tái)mac test machine,那么需要在這6臺(tái)機(jī)器上都裝上STAF抢埋,也就是說(shuō)弹灭,這6臺(tái)機(jī)器上都運(yùn)行STAFProc程序督暂,如下圖:
從STAF的環(huán)境里,并沒(méi)有客戶端/服務(wù)器的區(qū)別穷吮,這6臺(tái)機(jī)器都是平等的逻翁,從一個(gè)STAF端可以直接調(diào)用另一個(gè)STAF端提供的服務(wù)。
STAF Service
STAF是一個(gè)插件架構(gòu)捡鱼,這些插件就是Service八回,STAF的具體功能都是由各種service提供,STAFProc自帶了一些service(稱為內(nèi)部service)驾诈,也有很多外部service缠诅,用戶還可以開(kāi)發(fā)自己的service,外部Service可以用C++或Java開(kāi)發(fā)乍迄,STAF可以加載DLL文件或JAR文件里的Service管引。
內(nèi)部Service和STAFProc在一起,這表示內(nèi)部Service是永遠(yuǎn)可用的就乓,名字也是固定的汉匙,下面是幾個(gè)常見(jiàn)的內(nèi)部Service(非完整列表):
- DIAG - diagnostics, 用于調(diào)試
- DELAY - 延遲等待一段時(shí)間
- FS - file system, 用于文件操作
- PING - 檢查本地或遠(yuǎn)程服務(wù)是否可用
- PROCESS - 可以啟動(dòng)拱烁、停止或者查詢進(jìn)程
- SHUTDOWN - 用于shutdown STAFProc
外部service一般需要到STAF官網(wǎng)去下載服務(wù)組件包,一般服務(wù)組件包下完后還需要一些配置生蚁,下面是一些常用的外部服務(wù):
- STAX - 一個(gè)基于XML的執(zhí)行引擎,在XML中定義測(cè)試工作流戏自,可以實(shí)現(xiàn)并行執(zhí)行邦投、嵌套測(cè)試用例、控制運(yùn)行時(shí)間等擅笔,STAX支持Java 和 Python 模塊
- CRON - 定義定時(shí)任務(wù)志衣,使用Jenkins的話,也可以在Jenkins里定義定時(shí)任務(wù)
- EMAIL - 發(fā)送郵件
- HTTP - 發(fā)送HTTP請(qǐng)求
- ZIP - 提供壓縮與解壓
STAF Requests
STAF實(shí)現(xiàn)了跨機(jī)器的通訊猛们,用戶程序通過(guò)發(fā)送請(qǐng)求來(lái)調(diào)用各個(gè)服務(wù)的功能念脯,每個(gè)請(qǐng)求都以字符串的形式發(fā)送,這樣可以保證 STAF 能夠跨平臺(tái)的運(yùn)行弯淘。每個(gè)請(qǐng)求都有三個(gè)參數(shù)绿店,以“系統(tǒng)-服務(wù)-參數(shù)”的形式出現(xiàn),第一個(gè)參數(shù)表示此請(qǐng)求需要被發(fā)送到的哪個(gè)機(jī)器庐橙,第二個(gè)參數(shù)表示要調(diào)用哪個(gè)Service假勿,第三個(gè)參數(shù)傳給被調(diào)用的Service使用。舉例态鳖,"STAF local ECHO hello"表示調(diào)用本機(jī)的ECHO Service转培,“STAF 1.2.3.4 PING PING”表示調(diào)用機(jī)器1.2.3.4上的PING服務(wù)。
STAF的通訊層基于CORBA浆竭,http://www.51testing.com/html/36/n-73836.html詳細(xì)介紹了STAF的由來(lái)和設(shè)計(jì)細(xì)節(jié)浸须。
Windows GUI測(cè)試 - MSAA與AutoIt
MSAA全稱為Microsoft Active Accessibility惨寿,基于COM技術(shù),核心接口是IAccessible删窒,MSAA的下一代產(chǎn)品是UI Automation (UIA)缤沦,核心接口為IAccessibleEx和IRawElementProviderSimple,從 Windows7以來(lái)易稠,微軟在努力把它的accessibility technologies放進(jìn)一個(gè)framework里面缸废,稱之為Windows Automation API。詳情參考博客
Windows GUI的自動(dòng)化測(cè)試一般都是基于MSAA技術(shù)驶社,被測(cè)程序需要支持MSAA/UIA企量,實(shí)現(xiàn)對(duì)應(yīng)的COM接口,然后測(cè)試程序就可以通過(guò)MSAA接口讀取UI元素亡电。
另一個(gè)測(cè)試windows UI的常用工具是AutoIt届巩,AutoIt基于類(lèi)似Spy++的窗口技術(shù),可以識(shí)別標(biāo)準(zhǔn)的window控件份乒,使用類(lèi)似basic的自有語(yǔ)言來(lái)寫(xiě)test case恕汇,AutoIt不僅用于Windows GUI測(cè)試,也常用來(lái)開(kāi)發(fā)windows平臺(tái)工具軟件來(lái)自動(dòng)執(zhí)行常見(jiàn)的任務(wù)或辖,還常用來(lái)開(kāi)發(fā)計(jì)算機(jī)游戲機(jī)器人瘾英,用來(lái)自動(dòng)執(zhí)行游戲中的任務(wù)等。
更多閱讀: http://en.wikipedia.org/wiki/List_of_GUI_testing_tools
Web UI測(cè)試 - Selenium WebDriver
Selenium是由ThoughtWorks公司開(kāi)發(fā)的開(kāi)源的web自動(dòng)化測(cè)試工具颂暇,用于自動(dòng)化瀏覽器缺谴。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣耳鸯。支持所有主流瀏覽器湿蛔,也支持多種語(yǔ)言來(lái)編寫(xiě)測(cè)試代碼,是應(yīng)用最廣泛的web程序自動(dòng)化測(cè)試工具.
Selenium 2.0(又名 Selenium WebDriver)的主要新功能是集成了 WebDriver县爬。WebDriver 曾經(jīng)是 Selenium 1(又名 Selenium Remote Control, 簡(jiǎn)寫(xiě)為Selenium RC)的競(jìng)爭(zhēng)對(duì)手阳啥。Selenium RC 在瀏覽器中運(yùn)行 JavaScript 應(yīng)用,而 WebDriver 通過(guò)原生瀏覽器支持或者瀏覽器擴(kuò)展直接控制瀏覽器财喳。
Selenium 1.0 + WebDriver = Selenium 2.0
Selenium 1 是一款流行和完善的測(cè)試框架察迟,支持眾多瀏覽器(因其 JavaScript 實(shí)現(xiàn)),允許用戶通過(guò)許多編程語(yǔ)言(從 Java/C# 到 PHP纲缓、Erlang...)編寫(xiě)測(cè)試腳本卷拘,而 WebDriver 則彌補(bǔ)了 Selenium 1 的缺點(diǎn),跳出了 JavaScript 的沙箱祝高,提供快速栗弟、輕量級(jí)的瀏覽器模擬器。之所以合并工闺,原因如下:
- WebDriver 解決了 Selenium 存在的缺點(diǎn)(比如乍赫,繞過(guò) JS 沙箱)
- Selenium 解決了 WebDriver 存在的問(wèn)題(例如支持廣泛的瀏覽器)
WebDriver 針對(duì)各個(gè)瀏覽器而開(kāi)發(fā)瓣蛀,使用各個(gè)瀏覽器提供的native support操縱瀏覽器,取代了 Selenium RC 中嵌入到被測(cè) Web 應(yīng)用中的 JavaScript雷厂,與瀏覽器的緊密集成可以支持創(chuàng)建更高級(jí)的測(cè)試惋增,且避免了 JavaScript 安全模型導(dǎo)致的限制。除了來(lái)自瀏覽器廠商的支持改鲫,WebDriver 還利用操作系統(tǒng)級(jí)的調(diào)用模擬用戶輸入诈皿。
WebDriver 支持 Firefox (FirefoxDriver)、IE (InternetExplorerDriver)像棘、Opera (OperaDriver) 和 Chrome (ChromeDriver)稽亏。它還支持 Android (AndroidDriver) 和 iPhone (IPhoneDriver) 的移動(dòng)應(yīng)用測(cè)試。此外缕题,還包括一個(gè)基于 HtmlUnit 的無(wú)界面實(shí)現(xiàn)截歉,即 HtmlUnitDriver。WebDriver API 可以通過(guò) Python烟零、Ruby瘪松、Java 和 C# 訪問(wèn),支持開(kāi)發(fā)人員使用他們偏愛(ài)的編程語(yǔ)言來(lái)創(chuàng)建測(cè)試锨阿。
Selenium 2.0包含如下幾個(gè)工具:
- Selenium IDE - 一個(gè)Firefox插件宵睦,錄制回放用戶的基本操作,生成測(cè)試用例
- Selenium WebDriver - 前身為Selenium RC, 包括一組browser driver和不同語(yǔ)言對(duì)應(yīng)的language bindings, 支持多種平臺(tái)(Windows群井,Linux状飞,Mac等)和多種瀏覽器(IE毫胜,F(xiàn)irefox书斜,Opera,Safari酵使,Chrome等)荐吉,可以用多種語(yǔ)言(Java,Ruby口渔,Python样屠,Perl,PHP缺脉,C#等)編寫(xiě)測(cè)試用例
- Selenium Server - 單機(jī)運(yùn)行測(cè)試腳本時(shí)無(wú)需這個(gè)工具痪欲,使用Selenium Grid分發(fā)到遠(yuǎn)程機(jī)器上運(yùn)行Webdriver測(cè)試腳本時(shí)需要
假設(shè)在Mac機(jī)器上用Java寫(xiě)測(cè)試腳本在Chrome里測(cè)試,配置Selenium開(kāi)發(fā)環(huán)境可能需要如下幾個(gè)工具:
- Selenium Chrome Driver, 用于驅(qū)動(dòng)Chrome瀏覽器
- Selenium Client Drivers - Java, 用于支持Java測(cè)試腳本
- Selenium Server, 用于遠(yuǎn)程機(jī)器測(cè)試攻礼,單機(jī)時(shí)不需要
另一個(gè)簡(jiǎn)單的方法是使用Maven來(lái)配置Java環(huán)境的Selenium開(kāi)發(fā)環(huán)境业踢,參考官網(wǎng)可以了解更多配置文檔.
更多閱讀:
- 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測(cè)試 - Robotium
Robotium用于Android平臺(tái)上進(jìn)行黑盒自動(dòng)化測(cè)試,作用類(lèi)似于web平臺(tái)的selenium礁扮,提供了模擬各種手勢(shì)操作(點(diǎn)擊知举、長(zhǎng)按瞬沦、滑動(dòng)等)、查找和斷言機(jī)制的API雇锡,能夠?qū)Ω鞣N控件進(jìn)行操作逛钻,適用于測(cè)試android native app and hybrid app。
Robotium是 android 自帶類(lèi) Instrumentation 的一個(gè)封裝锰提,方便測(cè)試人員直接調(diào)用封裝好的接口曙痘,也就是說(shuō),實(shí)際上我們直接使用Instrumentation 也能夠進(jìn)行自動(dòng)化測(cè)試立肘,但robotium可以簡(jiǎn)化我們的測(cè)試步驟屡江,我們只需要調(diào)用某個(gè)robotium的API,傳幾個(gè)參數(shù)赛不,就等于我們?cè)谡{(diào)用一部分的Instrumentation幫我們實(shí)現(xiàn)測(cè)試惩嘉。
Java代碼測(cè)試 - TestNG
TestNG是類(lèi)似JUnit/NUnit的測(cè)試工具,能夠?qū)崿F(xiàn)unit test, functional test, end-to-end test, integration test等各種測(cè)試.
TestNG和JUnit是針對(duì)Java語(yǔ)言的兩個(gè)比較常用的測(cè)試框架踢故,兩者的相同點(diǎn):
- 使用annotation文黎,且大部分annotation相同。
- 都可以進(jìn)行單元測(cè)試(Unit test)殿较。
- 都是針對(duì)Java測(cè)試的工具耸峭。
TestNG與JUnit的不同點(diǎn):
- JUnit只能進(jìn)行單元測(cè)試,TestNG可以進(jìn)行單元測(cè)試淋纲,功能測(cè)試劳闹,端到端測(cè)試,集成測(cè)試等
- TestNG需要一個(gè)額外的xml配置文件洽瞬,配置測(cè)試的class本涕、method甚至package
- TestNG的運(yùn)行方式更加靈活:命令行、ant和IDE伙窃,JUnit只能使用IDE
- TestNG的annotation更加豐富菩颖,比如@ExpectedExceptions、@DataProvider等
其他工具
自動(dòng)化測(cè)試一般是持續(xù)集成的一部分为障,為了做好持續(xù)集成晦闰,通常會(huì)需要:
- Jenkins - CI工具
test case fail時(shí),可能會(huì)需要自動(dòng)創(chuàng)建bug跟蹤鳍怨,因此可能需要集成下面的bug管理工具:
- Jira/Bugzilla - Bug管理工具
為了提高代碼質(zhì)量呻右,可能會(huì)用到下面一些工具:
- 代碼靜態(tài)掃描 -
- 內(nèi)存泄漏分析 - valgrind on linux, appverifier on windows
- 性能分析
為了驗(yàn)證測(cè)試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入門(mén)
- http://blog.csdn.net/windone0109/article/details/15814653 - c++ code coverage tools
- http://www.csdn.net/article/2010-09-09/279253 - 代碼覆蓋率:80%鞋喇,不能少