在做自動化測試或壓力測試時,驗證碼總是一個問題。在以往的壓力測試經歷中,測試一般在獨立的測試環境中進行,可以放心禁用驗證碼或使用萬能驗證碼,這個是最實用的。但是,這兩天我嘗試了一個使用第三方的圖形圖像識別工具來完成驗證碼識別並通過Jmeter完成登錄的過程,識別工具的識別成功率有限,因此本篇估計僅能在理論范圍內適用。
本篇內容大部分內容來自於該作者的文章:http://blog.csdn.net/xreztento/article/details/48682923
總體目的:給Jmeter寫一個后置處理器,用來將上一個請求響應返回的驗證碼圖片識別成文字,並將識別內容保存為Jmeter的一個參數,這個參數供登錄post請求進行登錄驗證,從而完成登錄的自動化過程。
工具
(1)第三方圖形圖像識別工具:tesseract-ocr 下載地址:http://code.google.com/p/tesseract-ocr/downloads/list 基本無法下載,已上傳到我的百度網盤
安裝后,可以在cmd下試一試是否安裝成功:
在cmd下輸入命令:tesseract d:\123.jpg result -l eng 意思是將D盤下的123.jpg 識別后放在result.txt下
(2)需要用到的jar包:
Jmeter插件開發相關的jar包: ApacheJmeter_core.jar jorphon.jar logkit-2.0.jar 這些在Jmeter的lib中都有 直接導入工程項目即可
圖形處理相關的jar包:jai-imageio-1.1.jar swingx-1.6.1.jar 從網上下的,已上傳到百度雲盤 jar 文件夾下

插件開發
用java IDE新建一個工程項目,實現兩個部分,一個是識別圖片,一個是Jmeter插件的UI部分。工程項目完成目錄為:

ImageIOHelper.java
OCR.java
TestOCR.java
VodeExtractor.java
VcodeExtractorGUI.java
插件生成
插件開發完成后,在Eclipse中 export-Runnable jar file ,將必要的依賴庫加進去,最后會生成一個 .jar 文件
注意:圖形相關的jar包 直接使用時會報錯(Jmeter會報一個錯:java.lang.IllegalArgumentException: vendorName == null) 最終在網上找到了解決方案
生成jar包后,用解壓工具打開,將 /META-INF 目錄下的 MANIFEST.MF 文件用編輯器(我用的是sublime)打開,拷貝進去下面一段代碼,保存壓縮包:
Specification-Title: Java Advanced Imaging Image I/O Tools
Specification-Version: 1.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.1
Implementation-Vendor: Sun Microsystems, Inc.
插件插入Jmeter
將 .jar 文件放入Jmeter 安裝路徑下 lib/ext/ 目錄下,重啟Jmeter
可以看到,我們新開發的后置處理器 VcodeExtractor

再看下大致的登錄過程測試計划:

登錄的post請求參數中,可以使用Vcode,Vcode是我們開發的后置處理器 VcodeExtrator 返回的從圖片驗證碼中識別出來的字符串

插件效果驗證
把測試計划跑一次 根據察看結果樹 看下效果


登錄請求成功啦,但是圖片識別也不是百分百成功,部分失敗情況下,登錄請求肯定會失敗。Tesseract-OCR也有訓練識別的功能,但是不再繼續研究了。
關於Tesseract-OCR的延展性學習可參考:
(1)http://www.cnblogs.com/alex-blog/archive/2012/10/08/2714984.html
(2)http://blog.csdn.net/ycb1689/article/details/8520954
(3)http://www.52itstyle.com/thread-4803-1-1.html

