使用Nightwatch進行端到端測試
Nightwatch是一套新近問世的基于Node.js的驗收測試框架,使用Selenium WebDriver API以將Web應用測試自動化。它提供了簡單的語法,支持使用JavaScript和CSS選擇器,來編寫運行在Selenium服務器上的端到端測試。
不同于行為驅動測試(BDD)和單元測試獨立運行并使用模擬/存根,端到端測試將試著盡可能從用戶的視角,對真實系統的訪問行為進行仿真。對Web應用來說,這意味著需要打開瀏覽器、加載頁面、運行JavaScript,以及進行與DOM交互等操作。Nightwatch嘗試著使用語法糖(syntax sugar)來實現這一目標:
this.demoTestGoogle = function (browser) { browser .url(“http://www.google.com”) .waitForElementVisible('body', 1000) .setValue('input[type=text]', 'nightwatch') .waitForElementVisible('button[name=btnG]', 1000) .click('button[name=btnG]') .pause(1000) .assert.containsText('#main', 'The Night Watch') .end(); };
除簡化了編寫自動化測試的過程外,Nightwatch還能夠與持續集成的流水作業結合,從而對開發中的系統進行完整的診斷:
我們可以從Nightwatch網站找到當前提供特性的列表:
- 簡單但強大的語法。只需要使用JavaScript和CSS選擇器,開發者就能夠非常迅捷地撰寫測試。開發者也不必初始化其他對象和類,只需要編寫測試規范即可。
- 內建命令行測試運行器,允許開發者同時運行全部測試——分組或單個運行。
- 自動管理Selenium服務器;如果Selenium運行在另一臺機器上,那么也可以禁用此特性。
- 支持持續集成:內建JUnit XML報表,因此開發者可以在構建過程中,將自己的測試與系統(例如Hudson 或Teamcity等)集成。
- 使用CSS選擇器或Xpath,定位并驗證頁面中的元素或是執行命令。
- 易于擴展,便于開發者根據需要,實現與自己應用相關的命令。 </ul>
目前,Selenium是JavaScript的世界里驗收測試方面最流行的工具之一,類似的還有PhantomJS。二者都有其獨到的方法:Selenium使用其WebDriver API,而PhantomJS使用無界面的WebKit瀏覽器。它們都是非常成熟的工具,都具有強大的社區支持。它們與Nightwatch之間最大的不同,主要是在于語法的簡易度以及對持續集成的支持。與Nightwatch相比,Selenium和PhantomJS都擁有更加冗長的語法,這會讓編碼變得更龐大,而且不支持從命令行中進行開箱即用的持續集成(JUnit XML或其他標準輸出)。
盡管如此,Nightwatch還處于不斷演進的道路上,以成為更加成熟工具的。在Google Groups中,WD.js(另一個基于Node.js的驗收測試框架)的作者Sebastian Vincent針對處理回調所選擇的實現給出了一些批評意見:
當涉及異步調用時,基于鏈式的隊列是個糟糕的模式。如果開發者想要做一些復雜的事情,或是組合一些東西,最終將不得不手動停止隊列以插入任務(但也許Nightwatch會證明我的看法是錯的)。
Vincent還針對Nightwatch和Selenium服務器之間使用的底層通信協議,指出了其中存在的不足之處:
Nightwatch離成熟還遠,看看HTTP協議,GET和DETLETE中沒有重試、沒有超時設置,也沒有內容/長度+內容類型。在非直接情況下(例如Sauce-connect或排隊),它很快就會出現問題。
然而,哪怕有這些批評的聲音,Nightwatch還是入選了GitHub本月最熱門代碼倉庫。另外該團隊運營著一個推ter賬號,聽取來自社區的反饋并與開發者互動。
查看英文原文:Testing End-to-End with Nightwatch
來自:http://www.infoq.com/cn/news/2014/02/nightwatch