自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用CasperJS進行簡單的UI測試

開發(fā) 測試
這么多年來, 開發(fā)者開發(fā)了很多應用和技術來滿足這個需求. 當然, 它們運行的非常好. 但是我們總是尋找更新的, 更簡單的 (有時候是更'酷'的) 方式來做我們的工作. 所以最近我開始學習一種更有前途的新技術: PhantomJS.

摘要

無論你開發(fā)大或小的應用, 從安全來講測試是一個很重要的組成部分.

但是如何可靠持續(xù)的測試, 尤其是當你的人員不能有效的測試應用的每一次改變? 所以呢,把這個工作交給軟件是最合適的了.

這么多年來, 開發(fā)者開發(fā)了很多應用和技術來滿足這個需求. 當然, 它們運行的非常好. 但是我們總是尋找更新的, 更簡單的 (有時候是更'酷'的) 方式來做我們的工作. 所以最近我開始學習一種更有前途的新技術: PhantomJS.

PhantomJS是什么?
PhantomJS 是一個無界面的,包含了WebKit瀏覽器引擎和JavaScript API的腳本解釋器. 速度快并且支持各種web標準: DOM 操作, CSS 選擇器, JSON, Canvas 和SVG.

PhantomJS 的創(chuàng)建者是 Ariya Hidayat. 它是一個非常棒的技術,但是通過網(wǎng)站上的了解和所有的APIs文檔, 我遇到了 CasperJS.

CasperJS是什么?
Casper 是一個用JavaScript編寫的基于PhantomJS的導航腳本和測試工具.它充許我們像PHPUnit或 JUnit一樣測試我們的網(wǎng)站,測試我們的代碼.

它是一個非常棒的工具 – 一是它是非常簡單的,用JavaScript編寫,滿足各種各樣的測試需求,一是它可以方便的和我們的開發(fā)環(huán)境集成. 完美的組合前端和后端.

這本篇文章中,我將瀏覽一下CasperJS的基礎用法。我將扮演一個典型的用戶訪問New Relic(新的遺址)網(wǎng)站的一頁,特別是‘真實用戶監(jiān)控’部分。

我之所以選擇這一頁是因為它有大量方面對一個標準網(wǎng)站或應用極為常見,如圖像,表單,按鈕,鏈接和文本。它內容豐富并且有許多東西可供我們處理與測試?,F(xiàn)在,我確信New Relic的勤快的伙計已經(jīng)做過這些,但我也非常相信他們不會介意我為這個網(wǎng)站建立一個簡單的測試集和斷言。

特征

CasperJS具有一系列特征。 本文中,我會聚焦于 測試人員 API。它具有一些列功能與斷言,都是你期望一個好的測試API所具有的,包括:

* assertTextExists (文本存在斷言)
* assertTitle (標題斷言)
* assertHttpStatus (HTTP狀態(tài)斷言)
* assertDoesntExist (不存在斷言)
* assertUrlMatch (Url匹配斷言)

我將使用這些斷言來顯示CasperJS是如何工作的。它也包含一組其他特性,但我不會去深入探討——僅僅足夠做一個工作示例而已。不過,我鼓勵你研究一下精彩的在線API文檔。它閱讀起來令人愉悅,因為它相當清晰和簡潔。

準備
如果你沒有準備好,在我們繼續(xù)以前,先安裝 PhantomJSCasper 。 現(xiàn)在,讓我們馬上開始吧。

開始

當我第一次加載New Relic網(wǎng)站的'真實用戶監(jiān)控'頁面,看起來像下面圖片這樣(自撰寫本文以后它已經(jīng)變化了)。我突出了注冊表格的起點。

New-Relic-partial-form_ 

如果你點擊了這個表單里的任何元素,它其余的部分就會顯露出來,看起來就是下圖這樣。

nerd-in-tshirt-form 

測試將著眼于表單,但我們也要看看title標簽,表單左邊的圖片,及其上的文字。

#p#

代碼:

首先,為節(jié)省時間,我初始化了兩個變量:一個用來存儲URL,一個用來存儲網(wǎng)站名稱,因為我要在測試中的‘success’信息里顯示它們。

  1. var url = 'http://newrelic.com/product/real-user-monitoring';  
  2. var siteName = 'NewRelic'

Casper帶有4個內建記錄級別:

* debug
* info
* warning
* error

默認情況下,CasperJS會在‘error’級別過濾日志。所以如果你開始記錄日志后沒有看到任何東西,可能就是這個原因。為確保顯示日志輸出,我把它設置為‘debug’。而且我關閉了‘verbose’選項,如果它激活,我們會看到關于所有東西的信息,這會相當干擾。

  1. var casper = require('casper').create({  
  2.     verbose: false,  
  3.     logLevel: 'debug' 
  4. }); 

你可以在Casper API頁面上發(fā)現(xiàn)其它配置選項。comment函數(shù),如下面演示的,使我們能記錄輸出——在這種情況下是輸出到控制臺。我在這里使用一個簡單的消息說明測試開始了:

  1. casper.test.comment('Starting Testing'); 

函數(shù)‘casper.start’開始運行測試:

  1. casper.start(url, function() {  
  2.     this.test.assert(  
  3.         this.getCurrentUrl() === url, 'url is the one expected' 
  4.     );  
  5.    
  6.     this.test.assertHttpStatus(200, siteName + ' is up'); 

這是我所做的:我加載在‘url’中指定的URL,并假定我們可以載入想要的網(wǎng)址。在成功加載頁面之后,開始調用一些斷言來確認所載入的頁面上的內容是我們所期望的。

在這種情況下,我對返回的狀態(tài)碼進行了一個快速檢查,它應該是200,我得到的也是200。讓我們進行另一個斷言:

  1. this.test.assertTitle(  
  2.     'Real User Monitoring, End User Experience Monitoring : New Relic',  
  3.     siteName + ' has the correct title' 
  4. ); 

上面這個測試非常簡單。它斷言載入的頁面的標題應該是什么,并輸出一個含有該信息的消息。

在下面的代碼里,我首先檢查確認存在一個ID為‘nr-signup-form’的表單。如果這個表單不存在,那對表單內的元素進行檢查就沒有意義了,對吧?

  1. this.test.assertExists(  
  2.     'form[id="nr-signup-form"]',  
  3.     siteName + ' has a form with name "nr-signup-form"' 
  4. ); 

現(xiàn)在,在我繼續(xù)之前,我要提到的是,當我斷言元素存在或不存在于加載的頁面上時,我可以用兩種不同的方法:

* XPath
* CSS選擇器

如果你想要更多XPath的信息,請檢閱后面‘延伸閱讀’部分中的一些相關鏈接,或閱讀 我寫并發(fā)到maltblue的文章。CSS選擇器應該有很好的自我解釋性。但為以防萬一,我在“延伸閱讀”部分中同樣包含了關于它的鏈接。

現(xiàn)在讓我們用斷言來搜索輸入域控件:

  1. this.test.assertExists(  
  2.     {type: 'xpath', path: '//input[@id="FullName"]' },  
  3.     'the element exists' 
  4. );  
  5.    
  6. this.test.assertExists(  
  7.     {type: 'xpath', path: '//input[@id="Company"]' },  
  8.     'the element exists' 
  9. );  
  10.    
  11. this.test.assertExists(  
  12.     {type: 'xpath', path: '//input[@id="Email"]' },  
  13.                 'the element exists' 
  14. );  
  15.    
  16. this.test.assertExists(  
  17.     {type: 'xpath', path: '//input[@id="Password"]' },  
  18.     'the element exists' 
  19. );  
  20.    
  21. this.test.assertExists(  
  22.     {type: 'xpath', path: '//input[@id="PromoCode"]' },  
  23.     'the element exists' 
  24. ); 

在上面的五個斷言中,我查找了五個輸入域控件,它們的ID分別是‘FullName’, ‘Company’, ‘Email’, ‘Password’ 和‘PromoCode’。用XPath查找選擇列表控件元素同樣容易。

#p#

在下面的測試中,我假定有四個選擇列表控件,它們的ID分別是:‘country’, ‘group’, ‘company_size’ 和‘HostEstimate’。

  1. this.test.assertExists(  
  2.     {type: 'xpath', path: '//select[@id="country"]' },  
  3.     'the element exists' 
  4. );  
  5.    
  6. this.test.assertExists(  
  7.     {type: 'xpath', path: '//select[@id="group"]' },  
  8.     'the element exists' 
  9. );  
  10.    
  11. this.test.assertExists(  
  12.     {type: 'xpath', path: '//select[@id="company_size"]' },  
  13.     'the element exists' 
  14. );  
  15.    
  16. this.test.assertExists(  
  17.     {type: 'xpath', path: '//select[@id="HostEstimate"]' },  
  18.     'the element exists' 
  19. ); 

現(xiàn)在,這些測試還非常簡單。那么,讓我們來把它們變得復雜點。

  1. this.test.assertExists(  
  2.     {  
  3.         type: 'xpath',  
  4.         path: '//button[@id="sign-up-button"  
  5.                 and @class="small-button" 
  6.                 and @type="submit"]'  
  7.     }, 'the element exists' 
  8. ); 

在上面的測試中,我搜索‘Create Free Account’按鈕,它在頁面中的位置如下圖所示。

 

我在查詢中使用了一些條件運算符。我們要尋找一個具有下列條件的按鈕:

* ID 為 ‘sign-up-button’

* class 為‘small-button’

* type 為‘submit’

雖然看起來似乎我關注XPath比CasperJS更多,但為了更多的功能和配置,請耐心忍受我多說一點吧。

  1. var x = require('casper').selectXPath;  
  2. var checkboxXpath = "//input[@type='checkbox' and  
  3. @id='checkbox1']/parent::*/a/label[  
  4.     contains(., 'Java') or  
  5.     contains(., 'Python') or  
  6.     contains(., 'Ruby') or  
  7.     contains(., 'PHP') or  
  8.     contains(., '.NET') or  
  9.     contains(., 'Node.js')  
  10. ]";  
  11. this.test.assertExists(x(checkboxXpath), 'the element exists'); 

我在上面的測試中所做的,是通過把'x'初始化為‘selectXPath’助手來使XPath測試變得簡化一點。我要查找那一頁上所有選擇應用程序類型的復選框,所以XPath查詢查找復選框時用一個伴隨的label標簽來匹配所提供的應用程序語言的名稱。

為專門顯示我并非只會使用XPath(雖然它極其強大而且簡單),下面的兩個測試也使用CSS選擇器來檢查一個輸入域控件和列表項目也存在。

  1. this.test.assertVisible('input#Company');  
  2.    
  3. this.test.assertExists('li.nav-enterprise''the element exists'); 

搜索表單元素和列表項目很簡單,但若你的頁面有很多資源,對于圖片或Flash的載入又怎么檢測呢?這有一個例子:

  1. this.test.assertResourceExists(  
  2.     '/images/tshirt-dude-form.png''T-shirt Image exists' 
  3. ); 

對于上面的測試,我斷言穿著所展示T恤的男人的照片已載入。 最后一個測試斷言某些文本存在,在本情況中就是在穿著T恤的男人鏡頭上方的‘Sign up for free!’文本:

  1. this.test.assertTextExists(  
  2.     'Sign up for free!''page body contains "Sign up for free!"' 
  3. );  

然后我們這樣結束‘start’函數(shù):

  1. casper.test.comment('Ending Testing'); 

測試基本完成了,所以我輸出另一個日志記錄來讓用戶知道這一點:

  1. casper.run(function() {  
  2.     this.test.done(16);  
  3.     this.echo('So the whole suite ended.');  
  4.     require('utils').dump(casper.test.getFailures());  
  5.     require('utils').dump(casper.test.getPasses());  
  6.     this.exit();  
  7. }); 

我可以寫出我想要的所有測試,但若不調用“run”則什么都不會發(fā)生。所以“run”是揭開上述工作的序幕。我所做的是檢查腳本是否已經(jīng)運行了16個測試,并且在最后用‘this.echo()’輸出最后一行文字表示整個測試已結束。

當我們運行測試時,有時得到最后結果的總結會挺好。用‘getFailures()’ 和 ‘getPasses()’函數(shù),我們可以看到測試通過和失敗的總結。跟在這一切最后,我調用“this.exit()”來清盤。這個可以退出 CasperJS和PhantomJS,如果需要,可以指定一個退出編號。

把這個更進一步,這一次我調用‘casperjs’略有不同:我傳遞‘test’,如下所示,伴隨著“xunit”開關。 這個將測試結果輸出到一個 XUnit XML文件.

  1. $ casperjs test mytest.js --xunit=log.xml 

在CasperJS的下一個主要版本中,如果‘test’沒被傳遞到命令中,你將無法運行和呈現(xiàn)測試。提前知道這個很重要,可以避免你的腳本被意外打斷。

#p#

自動化測試

你是否想通過設置來自動化你的測試?我的意思是,我們可以手工進行一些測試,那很棒,但它令人乏味且很費時。令人高興的是,有一個擴展有助于你進行自動化測試。當我開始寫這個系列時沒有意識到這一點。我想給@casperjs_org一個巨大感謝,他使我意識到谷歌瀏覽器的擴展resurectio。

refugio-tweet-link 

克隆或下載一個拷貝并安裝它,然后重新打開我們之前用過的 New Relic頁,在擴展按鈕列表中點擊‘resurectio’。

refugio-screencap 

在你想構成一個自動測試的網(wǎng)頁上,單擊網(wǎng)頁地址欄里的“Go(轉入)”。從現(xiàn)在開始你所做的任何事情都將被包含成為生成的測試腳本的一部分。

我點遍每個表單元素,從“Email”到“Company Size”。然后再次點擊擴展按鈕以停止錄制,接著點擊'Export CasperJS”,這會在瀏覽器中打開另一個頁面來顯示所生成的腳本。

復制那些到一個腳本,運行它,你會看到和我們先前創(chuàng)造的腳本一樣,你會得到象下面的截圖中看到的輸出。

bash-php-script_ 

如你的見,它能很好地完成設置環(huán)境和建立所有測試斷言的工作,我們所做的就是運行它。這使得用CasperJS來讓測試準備就緒變得十分容易。

延伸閱讀

XPath

CSS選擇器參考

安裝CasperJS

PhantomJS

JUnit

PHPUNit

結論

我希望你喜歡這個對 CasperJS 的溫柔介紹,欣賞它給我們的威力和靈活性,通過phantomjs去設計深入的用戶接受測試套件。

我們看到我們能怎樣用最少的努力去測試New Relic網(wǎng)站的‘Real User Monitoring’頁面的內容,盡管要有一些手動的工作來確定所需的XPath表達式和CSS選擇器。

但對于一個免費的解決方案來說,它確實提供了很多的能力。我相信你會同意這個觀點。所以你覺得它怎么樣?你能預見到你或你的組織將它作為你的部署 和/或 持續(xù)集成解決方案的一部分嗎?

在下一部分,我將從測試中叉出來講casperjs的其它部分,包括:

* HTTP 身份認證

* 鼠標事件

* 表單提交

* 冒充用戶代理

* 制作AJAX請求

英文原文:Simpler UI Testing with CasperJS

譯文鏈接:http://www.oschina.net/translate/simpler-ui-testing-with-casperjs

責任編輯:林師授 來源: OSCHINA編譯
相關推薦

2020-07-28 15:20:43

PythonUI代碼

2016-02-26 15:28:45

CasperJSWeb爬蟲

2019-09-12 18:10:38

HTTPieAPI測試Python

2022-07-21 08:43:01

功能測試測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2025-01-27 11:52:23

2013-01-18 10:31:20

JMeterHTTP負載

2010-01-07 17:09:59

JSON 方法調用

2023-10-13 18:02:57

JUnitMockito關系

2022-04-08 11:25:58

數(shù)據(jù)庫操作AbilityData

2021-03-28 23:03:50

Python程序員編碼

2021-07-03 08:54:49

LinuxSysbench性能

2021-08-05 11:30:49

Linux滲透測試

2009-05-20 14:43:38

ibmdwEasyMock測試

2022-12-29 07:33:44

Strace故障排除

2020-11-05 18:30:32

接口測試

2010-12-27 09:19:23

2024-11-21 15:24:49

2021-11-29 22:59:34

Go Dockertest集成

2023-08-02 13:59:00

GoogleTestCTest單元測試
點贊
收藏

51CTO技術棧公眾號