為什麼這篇selenium壓力測試鄉民發文收入到精華區:因為在selenium壓力測試這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者TonyQ (沉默是金。)看板Web_Design標題[閒聊] Selenium RC 簡介 (...
這是續上篇的回應,因為有人對自動化測試的部份有興趣,
所以提出來說明。
我記得這裡以前應該沒討論過幾次這個主題,
基本上寫在本文之前是 WEB 自動化門檻事件很高的事情,
除非你是在做產品,或者是像我們這樣做元件,有單元性的,
否則我個人是覺得這成本仍然是頗高。
(先說我對測試其實了解的不多,只是我平常就有寫 unit test的習慣,
加上之前我也接觸 selenium 快一整個月,基本上跟它算七八分熟。)
-----------------------------------
自動化測試本身絕對構得上是一個專業,
所以雖然我現在只打算簡介 selenium RC 的運作模式,
我還是得針對測試的背景帶一些論述。
1.測試在於你要測試的對像是什麼,會有不同方法。
舉例,在你要測 js function 的單元性(像jQuery這種產品),
你就會用 jsunit / jslint 之類的驗證工具。
在你要測 java 函式的邏輯,你會用 JUnit ,
各平台基本上都會有個 unit test framework ,因為這東西很重要。
2.你必須知道你要測的是什麼,通常會有一個使用者情境。
然後有輸入的行為,通常就會跟著有預期行為。
以測試使用者登入這件事情好了,
可能會有的情境如下
輸入行為 預期行為(Assertion)
* 點擊帳號 textbox 帳號 textbox 應該要focus
* 使用者打入帳號 aaa 帳號 textbox value必須是 aaa
* 點擊密碼 textbox 密碼 textbox 應該要focus
* 使用者輸入密碼 123 密碼 textbox value必須顯示***
內容是 123
* 點擊送出 button (假設密碼正確) 應該要進行跳頁
以上這些東西,如果你有寫過任何一種的 unit test,
你應該蠻能理解我在講什麼的。XD
所謂的單元測試就是測試預期行為跟實際行為是否有出入。
-----------------------------------
接下來我們要就前面兩個主題開始延伸論述在 WEB 上的自動測試,
在 web 上我們會有很多很多種不同的範圍需要測試。
首先,伺服器端的資料模型,controller 的行為是否正確,
比方說你撈資料的 sql 下的對不對,會不會有問題,
這部份可以仰賴伺服器端的 unit test。(JUnit/ phpunit ...etc)
前端 javascript 的部份前面題過了,有 jslint/jsunit 等工具。
以上都是純粹就比較上層的資料/行為邏輯層的驗證,
基本上以上說的比較接近是白箱測試,不是我們要討論的重點,
這個我相信你們應該都可以輕鬆 apply ,只要你們有資源的話。
-----------------------------------
再下面是比較貼近瀏覽器端的瀏覽器測試,
也就是已經確實有個網站活在那邊,想從外部進行黑箱測試的狀況。
而在這種黑箱測試,我們目前有幾個測試方案。
1.HP Loadrunner 其實這個應該是蠻流行的,因為常常有人問...
(根據我不專業的[聽說],歡迎指正。)
這傢伙的玩法是,我紀錄每個 request 跟 response,
並且以此驗證它給我的content 到底對不對。
優點是這樣很方便做壓力測試,而且環境簡單、單純。
需要的資源不多,而且跑起來很快。
缺點是它看不見瀏覽器相容性的問題,
像是 javascript error /css 不相容造成的影響,
在這種測試環境下是不容易被發現的。
2.從模擬不同 browser 下手。
(我們終於講到 selnium 在的位置了,放煙火!)XD
這一派的玩法就是體認到很多時候,browser才是重點,
很多時候我們會因為不同 browser 而出現問題,
所以這一派的玩法會呼叫不同的 browser 來進行測試。
最簡單的當然就是真的把 browser 叫起來跑,
你會真的看到一個 ie、firefox 視窗浮在你的畫面上,
還會看到他在畫面上點東點西的,這個就是 selenium RC 再作得事情。
而這其中還有其他種玩法,像是 selenium2 現在正在整合的 WebDriver,
他不開 browser ,但是他會模擬 browser 的反應。
-----------------------------------
以下開始就完全進入主題了,前面那堆鋪陳,
只是為了說明這只是眾多測試方法中的一種。
Selenium RC 這東西本身蠻複雜的,我盡量把它講得簡單一點。
首先 selenium RC test ,
本質上就是用程式開一個 browser 視窗,
點擊一些東西,並且從browser上拿一些數據回來做驗證,
然後結束之後再把視窗關掉的一種測試。
所以他的角色會有以下幾種
1.瀏覽器 (這裡我們通常叫 selenium instance ,它是一個瀏覽器的代理人。
http://goo.gl/bDf1u )
2.受測網站(反正就是一個活在線上的網站,測試時連到一個指定的url)
3.Test Case ,
負責進行取得 selenium instance / 進行測試流程 /結束的動作
-----------------------------------
基本上因為selenium 核心實作是 java,雖然他有支援別的語言,
但我不太清楚他在別的語言的用法,所以底下我都以 java 來進行說明,
基本上我記得我看過他的 ruby example,語法或觀念上應該是大同小易。
在我們說到現在,我們會有兩個問題需要討論。
1.它怎麼拿到瀏覽器
2.它怎麼寫 test case 跟怎麼驗證
我先把它怎麼拿到瀏覽器這件事情拖到最後,
因為我想先講它怎麼寫test case。
基本上在 Java 裡它就是走 Java 的 JUnit ,
我們可以看看官方文件這個 example
http://goo.gl/Nsj8S 來源網址
public class NewTest extends SeleneseTestCase {
// We create our Selenium test case
public void setUp() throws Exception {
setUp("http://www.google.com/", "*firefox");
// We instantiate and start the browser
//這裡你必須先跟它講你要用哪個瀏覽器跟你要測哪個host
//有 *safari *explorer ...etc
//另外safari 4.0.2 以後有雷,給 *safari會打不開,
//得用 *safariproxy 走另一種作法
}
public void testNew() throws Exception {
selenium.open("/");//等同開一個瀏覽器視窗 開www.google.com
//這裡的 q 是 element locator
// default 會對應到 dom id 或 name ,
// 也可以是 xpath 或 css selector
// 也可以是一個能拿到 dom 的 js statement
//詳情洽 官方文件 http://goo.gl/bbwC9 第一章
selenium.type("q", "selenium rc");
//這裡的 click 也是 element locator
selenium.click("btnG");
selenium.waitForPageToLoad("30000");//
//這裡是 call selenium 的 api去檢查畫面有沒有出現這些字
assertTrue(
selenium.isTextPresent("Results * for selenium rc"));
// These are the real test steps
}
}
-----------------------------------
看完這個 example ,你大概心理有底,
基本的 focus / click / keydown / keyup/
mousemove / mouseout / mousedown/ mouseup 這些瀏覽器行為都有。
連contextMenu 都有...XD
但下一個問題是,囧,我們要怎麼拿到我們要驗證的文字或畫面?
對...這是我覺得 selenium 實作中最麻煩的地方,
他有 getText /getValue 這類的事件可以用,所以你可以直接用這些函式,
去取得某些 html element 的 text/ value 。
不過我們取得資料的作法比較簡單一點,因為我們平台有整合 jQuery ,
所以我們是幫 jQuery 在 java side 也做了一個 warper 。
http://goo.gl/EtvsM
我們的 test case 寫起來會像是這樣
int i = 20;
for (JQuery $row : jq(".row")) {
verifyTrue($row.text().indexOf(""+i)!=-1);
++i;
}
當然,我們是有包了很多東西才能寫這樣的 code ,
這就是為什麼我不是直接拿我們家的東西來做說明,
已經跟原本的樣貌差很多了。XD
具體做法是這樣,你可以用 selenium.getEval() 去拿到js執行後的值,
所以如果你要測的網站有jQuery,你也可以丟 jQuery 的命令給它,
它就會幫你執行好結果再扔回來給你確認。
至於怎麼 setup selenium RC ,
可以先看看官方文件中的 Installation 章節。
http://seleniumhq.org/docs/05_selenium_rc.html
基本上 selenium RC server 是一隻service 代理人,
你必須在本地用 java 開一隻 server,
unit test 時他的 selenium 會來問這隻 server 要一個真正的instance,
然後你對這個 instance 的每個操作,他會送給service 叫他去call borwser。
所謂的7 browser 事實上指的是三隻 VM 掛三隻 selenium RC server ,
分別跑 ie6,ie7,ie8 ,再分別去 invoke selenium rc 的部份。
原理其實不難......就是寫起來很繁瑣。XD
另外 selenium 在 firefox 有plug-in可以幫忙錄動作叫 selenium IDE ,
不過我一直學不會,還是寫 java 的 unit test適合我。XD
大概簡單簡介一下.....現在下午三點又是美好的週六,我想睡覺了。 XD
有一些沒講得清楚的地方再另外問另外回吧。:P
其實應該是官方文件翻一翻應該就差不多了。
不過問題在於其中很多小雷,有些行為還是要做一些不同瀏覽器的判斷。
這個就沒辦法啦,寫 web 連 test 都逃不過這問題。XD
--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 67.139.36.200