主要學習的內容包括發送HTTP請求、HTTP信息頭管理器、HTTP cookies管理器、用戶定義的變量、響應斷言、CSV數據文件設置的使用。
一.測試相關網站及接口說明:
提供的測試網址為:http://www.qk365.com/security/register
使用Chrome瀏覽器,先將瀏覽器的cookies緩存清空。
清空后,打開待測試的網址,按F12鍵,輸入要注冊的手機號碼,如“18300987622”,點擊“發送驗證碼”,可以看到請求的接口為:http://www.qk365.com/security/smsCode.do,請求的參數為json格式的數據:{"mobile":"18300987622","func":"register","isValidate":"1","memKey":"register-18300987622","memValue":"7F4BEC3A-BE2F-48C7-91ED-33887E186C87"},在知道接口后,就可以開始我們的接口測試了。

二.jmeter進行http post請求接口測試
默認環境已經有的條件下,雙擊jmeter.bat。出現如下界面設置工具的顯示語言,Options→Chose Language→Chinese

完成上述步驟后,創建HTTP請求,包括:HTTP請求頭,HTTP請求體以及察看結果樹
1、在測試計划中添加線程組
2、在線程組中添加配置元件,HTTP信息頭管理器,將剛才注冊頁面的請求頭選中並且復制,在HTTP信息頭管理器中單擊“Add from Clipboard”完成請求頭的復制


3.在線程組中添加HTTP請求,請求的請求體為圖下內容


4、線程組添加察看樹,點擊啟動按鈕,查看請求結果

5、為響應結果添加斷言,只有響應結果中包含"msg":"短信發送成功"的響應數據,這個請求才算是成功

三.Jmeter請求接口參數化
模擬5個用戶執行以上的測試過程,我們發現只有第一次是成功的,其余的返回"msg":"短信驗證碼發送過於頻繁"


發現原來是每個請求的請求手機號是一樣的,導致失敗

這時候可以使用配置元件,CSV數據文件設置每次請求的手機號是不同的,在這里我准了一份手機號碼的excel文件,需要注意的是保存這個文件的時候要保存成.CSV格式的,這里我將這份文件放到jmeter的examples目錄下

在CSV數據文件配置中填寫如下信息,然后修改驗證碼接口中HTTP請求的請求體,最后再執行一次,發現每次請求使用的手機號是不同的,並且請求成功



四.Jmeter請求接口壓力測試
修改線程組參數,添加聚合報告等,對接口進行壓力測,這里可以把察看結果樹禁用了,因為在請求很多的情況下,會影響工具性能。最后等結果

需要注意的是啟動jmeter.bat提示的那段話,壓力測試要用非界面模式,界面模式用來生成腳本,調試沒有問題了,再進行非界面的壓力測試
May 22, 2018 9:42:40 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use NON GUI Mode:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
五.Jmeter報告生成
自行百度。
說明:這個平台可以頻繁的刷驗證碼接口,這本身就是一個bug。前端的滑動驗證功能就是形同虛設的。
現在網站的注冊界面,將驗證碼圖片放在了第一行。

1、使用tess4j編寫驗證碼圖片識別方法
2、編寫jmeter測試腳本:
包括獲取驗證碼接口、響應的驗證碼圖片保存、驗證碼圖片識別、獲取手機驗證碼請求接口等這幾個重要步驟的編寫
3、進行Jmeter驗證碼圖片識別,獲取手機驗證碼
4、接口壓力測試
二、使用tess4j實現驗證碼圖片識別
打開Eclipse,新建一個java項目,項目中添加tess4j的jar包,以及tessdata等文件。
代碼完成的功能為,輸入驗證碼圖片的路徑,輸出驗證碼圖片的識別結果,結果是一個字符串類型
具體代碼如下,注釋中已經對每一行代碼進行了講解,主要是為了提高圖片字符識別的准確率。
大概的圖片識別處理步驟是:設置字符的識別方式是英文和數字,將圖片按區域識別每一個字符,把每一個字符截取下來,做灰度處理以及銳化,並且把這個字符對應區域的圖片放大。最后識別這個經過處理的圖片。
package qingkeCode; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import net.sourceforge.tess4j.util.ImageHelper; import net.sourceforge.tess4j.util.LoadLibs; public class PicToData { /*public static void main(String []args){ for (Integer i=1; i<44; i++){ System.out.println(GetData(i.toString())); } }*/ public static String GetData(String picPath) { File file = new File(picPath); Tesseract instance = new Tesseract(); //設置tess配置的路徑 File testDataFolderFile = LoadLibs.extractTessResources("tessdata"); //設置識別的方式為英文和數字 instance.setLanguage("eng"); //加載配置 instance.setDatapath(testDataFolderFile.getAbsolutePath()); // 將驗證碼圖片的內容識別為字符串 String result = ""; //對每一個字符單獨識別 for (int i = 1; i < 5; i++) { String c = ""; try { c = instance.doOCR(change(file, i)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if (c.length()>0){ } if (c.length()>0){ result += c.substring(0, 1); } } return result; } public static BufferedImage change(File file, int i) throws Exception { // 讀取圖片字節數組 BufferedImage textImage = null; try { InputStream in = new FileInputStream(file); BufferedImage image = ImageIO.read(in); //包括左右的空白處,分為6個區域 int subWidth = image.getWidth() / 6; //截取第i個字符的圖片,並將圖片灰度化 textImage = ImageHelper.convertImageToGrayscale(ImageHelper .getSubImage(image, subWidth * i, 0, subWidth+3, image.getHeight())); // 對圖片進行處理 //圖片銳化 textImage = ImageHelper.convertImageToBinary(textImage); //放大圖片,放大的倍數為5倍 textImage = ImageHelper.getScaledInstance(textImage, textImage.getWidth() * 5, textImage.getHeight() * 5); // 將圖片擴大5倍 } catch (IOException e) { e.printStackTrace(); } //返回識別后的單個字符的值 return textImage; } }
編寫好以上代碼后,簡單測試一下接口是否可用。結果如下,說明接口可用,將main函數注釋

然后將項目導出為Jar

導出時設置以下選項,並且直接將jar包導出到Jmeter的ext路徑下

三、jmeter編寫測試腳本
1、Jmeter中測試java驗證碼識別接口可用
新建測試計划,在測試計划中將jar包qingkeCode.jar添加進來。

添加BeanShell Sample,編寫以下腳本,腳本的功能為導入jar包,並且識別路徑“D:\code\vcode_src\8.jpeg”中的圖片驗證碼的值。並且把值保存到了變量vcode中。
import qingkeCode.*; String code = "D:\\code\\vcode_src\\8.jpeg"; String d = PicToData.GetData(code); vars.put("vcode",d);
添加Debug Sample和察看結果樹,以便觀察運行結果。

運行腳本,察看運行結果。結果沒有報錯,並且輸出了路徑“D:\code\vcode\8.jpeg”中的圖片驗證碼的值,說明Java接口可以調用。

2、查看接口:使用F12開發者工具,查看http請求的流程,可以得到兩個需要的相關接口
獲取驗證碼圖片的GET請求,請求參數“d”是一個以毫秒為單位的時間戳
http://www.qk365.com/security/captcha.do?d=1527660630370
還有一個接口是發送手機驗證碼的POST請求接口,包括請求頭和請求體
// 請求頭
http://www.qk365.com/security/sendMobileCode.do
// 請求體,captcha為圖片驗證碼的值,func為請求接口,mobile為手機號
captcha=DYJE
func=register
mobile=18569845214
編寫獲取驗證碼的http請求

返回如下消息表示請求接口編寫成功

3、保存驗證碼圖片並識別驗證碼
驗證碼圖片會保存在路徑“D:\code\vcode_src\”路徑下,文件名會以1到n的順序增長

這里先測試一下運行一次的情況,參數如下

運行結果,說明返回的驗證碼圖片進行了識別。后續只需要用這個識別的驗證碼進行獲取手機驗證碼的請求就可以了。


四、編寫獲取驗證碼請求腳本
獲取手機驗證碼時要帶上cookies和獲取圖片驗證碼返回的session值,這樣才能成功。要問這一點我怎么知道的,是因為在編寫腳本時發現沒有帶這個值,或者這個值是錯的會返回錯誤信息,然后根據經驗,看到的~
獲取手機驗證碼腳本如下,其中${vceode}是驗證碼圖片識別中得到的。

添加cookie請求頭把瀏覽器的值拷貝放入即可


使用正則表達式,在獲取驗證碼圖片中添加后處理,取出session,將取出的session放入獲取手機驗證碼的請求頭中
獲取session

session放入獲取手機驗證碼請求頭中

五、執行腳本
最后執行腳本,結果如下。后期可以自己配置線程組中的參數進行接口壓力測試。

五、接口壓力測試
添加計數器,計算器的值就是圖片名稱

最后需要保證每次請求的手機號碼不同,和上篇博文一樣使用CSV的方式設置請求的電話號碼
六、參考博文
這篇博文有很多相關的知識點的博客鏈接
jmeter調用jar包
tess4j使用相關博文
圖片識別訓練相關的
Tesseract-OCR 字符識別---樣本訓練
Tesseract-OCR識別中文與訓練字庫實例
Windows環境安裝tesseract-ocr 4.00並配置環境變量
tesseract_ocr 字符識別基礎及訓練字庫、合並字庫
Tesseract-OCR的簡單使用與訓練
相關下載鏈接
寫在最后
目前的圖片失敗率還是有誤差的,也許經過圖片訓練可以提高識別率。關於訓練這方面的知識,自己也只是了解一點點。還需要繼續學習吧。
這個網站的注冊模塊有三個問題:
一是:驗證圖片有點簡單,一般的圖片識別工具就能完成對驗證碼的識別
二是:界面控件的擺放順序不夠合理,個人認為應該把手機號輸入框放在前面
文章轉載於https://www.jianshu.com/p/a4fd84ffbebd
Jmeter驗證碼圖片識別注冊接口壓力測試實戰 https://www.jianshu.com/p/51bb8d6be280