目前,不少網站在用戶登錄、用戶提交信息等登錄和輸入的頁面上使用了驗證碼技術。驗證碼技術可以有效防止惡意用戶對網站的濫用,使得網站可以有效避免用戶信息失竊、廣告SPAM等問題。但與此同時,驗證碼技術的使用卻使得WEB自動化測試面臨了較大的困難——由于驗證碼的存在,傳統的“錄制”-“回放”工具由于不能識別驗證碼而失效。在各大軟件測試的論壇中,經常能看到測試工程師在焦急地發問:“自動化測試時如何處理頁面上的驗證碼?”,可見,該問題確實是一個對相當多的測試工程師造成嚴重困擾的問題。其實,驗證碼并不像它表面上看起來那么神秘,也并不像一些測試工程師認為的那樣堅不可摧,通過一些技術和非技術性的手段,測試工程師完全可以把這個阻礙測試的絆腳石踢開。
下面,本文就從驗證碼的實現手段說起,向各位飽受驗證碼困擾的測試工程師說明,如何通過我們的聰明才智,成功地解決驗證碼帶來的自動化測試方面的問題。
1 驗證碼及其為自動化測試帶來的困擾
驗證碼一般應用在WEB系統涉及登錄和輸入的頁面上,其實現的一般方法是在頁面上顯示一幅圖片,要求用戶肉眼識別圖片中的信息并將該信息作為輸入的一部分進行提交。頁面上顯示的這幅圖片一般是一串隨機產生的數字或符號,并且被添加了用于防止識別的背景。驗證碼的主要目的是為了防止惡意用戶利用自動工具(機器人)對用戶口令進行暴力破解、惡意注冊用戶,或是向網站發布令人厭煩的廣告信息等。
驗證碼具有隨機性和不易被自動工具識別的特點,當用戶訪問某個使用驗證碼的頁面時,每次對該相同頁面的訪問都會得到一個隨機產生的不同的驗證碼,并且,這些驗證碼具有能夠被人工識別,但很難被自動工具識別的特點,這樣,自動工具就很難適應使用驗證碼的頁面,從而達到保護網站不被惡意使用的目的。
當然,不同網站使用的驗證碼在表現形式上會有所不同。例如,常用的一些論壇程序、小型網站等使用相對較簡單的數字驗證碼;而Hotmail和Gmail等則使用較為復雜的數字、字符等混排的驗證碼,并通過變形等手段對驗證碼圖片進行處理;還有一些網站使用動物圖片作為驗證碼。
圖1給出了幾個典型網站的驗證碼表現。
|
|
ITPub的驗證碼 | Gmail的驗證碼 |
|
|
Hotmail的驗證碼 |
圖1 幾個典型網站的驗證碼
辨證唯物主義告訴我們,任何事務都可以從正反兩個方面來看待,驗證碼也不例外。驗證碼在保護網站不受到惡意注冊和垃圾信息困擾方面發揮了有效的作用,但對于需要使用自動化測試工具進行測試的自動化測試來說,驗證碼則帶來了相當的困擾。因為驗證碼在本質上是一種為了防止自動工具對網站進行操作的手段,而自動化測試工具也不幸屬于自動工具之列,因此,在軟件測試的過程中,驗證碼同樣成為了自動化測試的障礙。
自動化測試工具基本的原理是“錄制”-“回放”,也就是使用測試工具“錄制”用戶的操作形成腳本,并在后續測試過程中通過“回放”該腳本來重復用戶的操作。設想我們使用自動化測試工具對某個使用了驗證碼的網站進行測試,由于驗證碼的存在,錄制得到的腳本就不能直接回放成功。
在各大軟件測試論壇中,“如何處理WEB驗證碼”是一個被經常問到的問題,可見,該問題確實是一個對相當多的測試工程師造成嚴重困擾的問題。解決驗證碼的問題并不容易,但也并不是不能解決,本文擬從生成驗證碼的方法、測試的不同類型和階段提出針對WEB驗證碼的自動化測試解決方案,分析各種方案的優缺點,并結合具體的測試工具說明各種方法的應用。
驗證碼的主要實現方法
要解決驗證碼的問題,我們首先來看看在不同類型的網站上,驗證碼究竟是如何實現的。
從實現方式上來說,驗證碼分為“讀取式”和“生成式”兩種。
“讀取式”是指從服務器上指定的目錄下隨機讀取預先制作好的圖片文件,將圖片文件顯示在頁面上要求用戶識別。粗看起來,這種方式的安全性應該比較好,因為網站制作者可以通過精心制作非常難于自動識別的圖片,將自動工具自動識別的風險降到最低,但實際上,這種方式存在一個致命的缺點:容易在頁面文件中泄漏圖片文件的URL,而惡意用戶正好可以利用這一點,通過反復嘗試訪問使用驗證碼的頁面,獲得大部分預先制作好的圖片文件URL和需要輸入的驗證碼之間的關系,然后通過該對應關系跳過驗證碼的驗證,使驗證碼失效。
另外,由于該方法需要預先制作大量的圖片文件,前期的工作量比較大,因此,目前已經很少有網站完全采用該方式實現驗證碼技術。
“生成式”則是指在程序中通過代碼的方式,隨機生成一個串,并將該串用圖形的方式顯示在頁面上要求用戶識別。這種方式由于實現較為方便,因此目前主要的網站均采用該方法實現驗證碼。當然,“生成式”也有一定的缺點,例如,由于“生成式”一般利用某種網站開發語言提供的圖形函數生成圖形,每個字符生成的位圖是完全相同的,惡意用戶可以利用這一點,使用OCR的方式將位圖“翻譯”成對應的字符串內容。因此,“生成式”一般還會在生成的圖片上疊加背景噪音,增加識別的難度。Hotmail和Gmail等網站更是利用變形、改變顏色等方法讓驗證碼的自動識別變得幾乎不可能。
總體來說,“生成式”是依靠程序中的代碼在運行時動態生成起到驗證作用的圖片的,但從其具體實現上來看,這種實現方式依賴于具體的編程語言,以及生成圖片的格式。
原文轉自:http://www.anti-gravitydesign.com