[閒聊] Selenium RC 簡介 (WEB 自動測試)

看板Web_Design作者 (沉默是金。)時間13年前 (2011/02/06 05:03), 編輯推噓5(5037)
留言42則, 6人參與, 最新討論串1/2 (看更多)
這是續上篇的回應,因為有人對自動化測試的部份有興趣, 所以提出來說明。 我記得這裡以前應該沒討論過幾次這個主題, 基本上寫在本文之前是 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

02/06 15:22, , 1F
tony大你也有接觸到這一塊嗎?不知selenium有沒有教學?
02/06 15:22, 1F

02/06 15:23, , 2F
或是例子解說,目前屬於自行摸索階段,是否有個方向?
02/06 15:23, 2F

02/06 16:50, , 3F
春節不補眠? XD
02/06 16:50, 3F

02/06 21:32, , 4F
能把他變成 blog 文嗎? 這樣比較方便轉載.
02/06 21:32, 4F

02/07 01:14, , 5F
感謝 T 大 :D
02/07 01:14, 5F

02/07 01:17, , 6F
@ateclean 我這裡時差跟台灣差14個小時 XD
02/07 01:17, 6F

02/07 01:18, , 7F
@thitbbeb 文章中有寫官方的Guide
02/07 01:18, 7F


02/07 01:35, , 9F
02/07 01:35, 9F

02/07 02:13, , 10F
還有我的春節得等我回台灣才有得過...XD
02/07 02:13, 10F

02/07 10:45, , 11F
我想知道測試流程、文件長怎樣?具體來說,分析階段該怎麼
02/07 10:45, 11F

02/07 10:46, , 12F
決定那些功能要被測試?難道要測過所有功能、窮舉所有可能?
02/07 10:46, 12F

02/07 10:50, , 13F
以及怎麼報告結果?用表格列出一堆結果,要進一步解釋結果?
02/07 10:50, 13F

02/07 10:52, , 14F
也就是怎麼跟別人說:結果顯示這產品符合XX、很好用XD
02/07 10:52, 14F

02/07 10:52, , 15F
1.一般來講是用functionality 來切分,盡可能的窮舉。
02/07 10:52, 15F

02/07 10:53, , 16F
2.結果只有兩種 過跟不過。 理論上再做這種testing時,沒有
02/07 10:53, 16F

02/07 10:53, , 17F
全過就是產品或者測試案例有問題。
02/07 10:53, 17F

02/07 10:53, , 18F
另外這不是為了跟別人解釋,而是為了確保你的產品具有基本
02/07 10:53, 18F

02/07 10:54, , 19F
的品質。事實上,就算有了自動化測試。我們還是需要使用者
02/07 10:54, 19F

02/07 10:54, , 20F
測試。而使用者測試則是為了測試可靠度跟人的接受度,分成
02/07 10:54, 20F

02/07 10:55, , 21F
很多方向。總之,這類測試其實是讓修bug或者寫功能的人安心
02/07 10:55, 21F

02/07 10:55, , 22F
就算因為加了新功能或者修了舊bug,也可以確保功能健全。
02/07 10:55, 22F

02/07 10:56, , 23F
還有,如果不用測試工具,人工開多個瀏覽器測,是不是也行?
02/07 10:56, 23F

02/07 10:57, , 24F
當然可以。不過人力貴,而且人不好找。:-)
02/07 10:57, 24F

02/07 10:57, , 25F
比如:我預期按按鈕會有alert,我就真的去按,看有沒有出現
02/07 10:57, 25F

02/07 11:02, , 26F
要全過啊!那一開始開的條件就不能太理想,以免不符合實際..
02/07 11:02, 26F

02/07 11:09, , 27F
單元測試的前提應該是每個單元都要夠細、獨立,不然到處呼叫
02/07 11:09, 27F

02/07 11:10, , 28F
來呼叫去,出事也不知問題出在那裡。
02/07 11:10, 28F

02/07 11:12, , 29F
唔,單元獨立跟我們說的這些東西並不牴觸啊。
02/07 11:12, 29F

02/07 11:13, , 30F
單就這樣看我不太了解你的描述跟你想表達的問題在哪耶。XD
02/07 11:13, 30F

02/07 11:14, , 31F
你要不要舉個情境,以你說的按按鈕會有alert,那用這篇
02/07 11:14, 31F

02/07 11:14, , 32F
說的工具是很簡單的可以作到按鈕、測alert的呀。
02/07 11:14, 32F

02/07 11:14, , 33F
不過我剛吃完晚餐 現在超飽的 XD 明天再來看好了....
02/07 11:14, 33F

02/07 11:15, , 34F
回文可能可以討論的更多,這種討論不用省文章數。XDDD
02/07 11:15, 34F

02/07 11:22, , 35F
我只是說感想。若是問題的話,大概是程式怎麼切割、模組化?
02/07 11:22, 35F

02/07 11:23, , 36F
有點類似db正規化,若切太細可能會拖慢開發速度、不方便,
02/07 11:23, 36F

02/07 11:24, , 37F
不過不夠細的話,一個function很長,好像會不好做單元測試?
02/07 11:24, 37F

02/07 11:31, , 38F
以測試的立場當然是越細越好。不過實務上就看有多少資源了
02/07 11:31, 38F

02/08 23:40, , 39F
T大再請問你一下,雖然是盡量窮舉所有的可能情況,
02/08 23:40, 39F

02/08 23:42, , 40F
不過應該有一些最基本的準則或是目標要完成,
02/08 23:42, 40F

02/08 23:42, , 41F
不知道有沒有一個可供參考的方向呢?
02/08 23:42, 41F

02/09 08:15, , 42F
這是測試的人要想的 XD 要看你要測什麼東西才知道啊...
02/09 08:15, 42F
文章代碼(AID): #1DJRiBZh (Web_Design)
文章代碼(AID): #1DJRiBZh (Web_Design)