寫在前面
前段時間寫了一篇博文《Jmeter驗證碼注冊接口壓力測試實戰(zhàn)》,前兩天又登錄對應的網(wǎng)站看了一下灾常。發(fā)現(xiàn)原來滑動驗證的方式改成了圖片驗證碼的方式洼裤,防止用戶多次發(fā)送手機驗證碼蓬坡。
看到這里我本來不想再有太多想法了骏啰。
但是看到如下的注冊界面,將很“人性化”的將驗證碼圖片放在了第一行银舱。
我總感覺它在向我說:來呀瘪匿,你來呀!
我想了想寻馏,好吧......棋弥,那我試一下。
一诚欠、測試步驟
1顽染、使用tess4j編寫驗證碼圖片識別方法
2漾岳、編寫jmeter測試腳本:
包括獲取驗證碼接口、響應的驗證碼圖片保存粉寞、驗證碼圖片識別尼荆、獲取手機驗證碼請求接口等這幾個重要步驟的編寫
3、進行Jmeter驗證碼圖片識別唧垦,獲取手機驗證碼
4捅儒、接口壓力測試
二、使用tess4j實現(xiàn)驗證碼圖片識別
打開Eclipse振亮,新建一個java項目巧还,項目中添加tess4j的jar包,以及tessdata等文件坊秸。
代碼完成的功能為麸祷,輸入驗證碼圖片的路徑,輸出驗證碼圖片的識別結果妇斤,結果是一個字符串類型
具體代碼如下摇锋,注釋中已經(jīng)對每一行代碼進行了講解丹拯,主要是為了提高圖片字符識別的準確率站超。
大概的圖片識別處理步驟是:設置字符的識別方式是英文和數(shù)字,將圖片按區(qū)域識別每一個字符乖酬,把每一個字符截取下來死相,做灰度處理以及銳化,并且把這個字符對應區(qū)域的圖片放大咬像。最后識別這個經(jīng)過處理的圖片算撮。
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");
//設置識別的方式為英文和數(shù)字
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 {
// 讀取圖片字節(jié)數(shù)組
BufferedImage textImage = null;
try {
InputStream in = new FileInputStream(file);
BufferedImage image = ImageIO.read(in);
//包括左右的空白處,分為6個區(qū)域
int subWidth = image.getWidth() / 6;
//截取第i個字符的圖片县昂,并將圖片灰度化
textImage = ImageHelper.convertImageToGrayscale(ImageHelper
.getSubImage(image, subWidth * i, 0, subWidth+3,
image.getHeight())); // 對圖片進行處理
//圖片銳化
textImage = ImageHelper.convertImageToBinary(textImage);
//放大圖片肮柜,放大的倍數(shù)為5倍
textImage = ImageHelper.getScaledInstance(textImage,
textImage.getWidth() * 5, textImage.getHeight() * 5); // 將圖片擴大5倍
} catch (IOException e) {
e.printStackTrace();
}
//返回識別后的單個字符的值
return textImage;
}
}
編寫好以上代碼后,簡單測試一下接口是否可用倒彰。結果如下审洞,說明接口可用,將main函數(shù)注釋
然后將項目導出為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開發(fā)者工具,查看http請求的流程幢哨,可以得到兩個需要的相關接口
獲取驗證碼圖片的GET請求赡勘,請求參數(shù)“d”是一個以毫秒為單位的時間戳
http://www.qk365.com/security/captcha.do?d=1527660630370
還有一個接口是發(fā)送手機驗證碼的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的順序增長
這里先測試一下運行一次的情況,參數(shù)如下
運行結果凸丸,說明返回的驗證碼圖片進行了識別拷邢。后續(xù)只需要用這個識別的驗證碼進行獲取手機驗證碼的請求就可以了。
四屎慢、編寫獲取驗證碼請求腳本
獲取手機驗證碼時要帶上cookies和獲取圖片驗證碼返回的session值瞭稼,這樣才能成功。要問這一點我怎么知道的腻惠,是因為在編寫腳本時發(fā)現(xiàn)沒有帶這個值环肘,或者這個值是錯的會返回錯誤信息,然后根據(jù)經(jīng)驗集灌,看到的~
獲取手機驗證碼腳本如下悔雹,其中${vceode}是驗證碼圖片識別中得到的。
添加cookie請求頭把瀏覽器的值拷貝放入即可
使用正則表達式绝页,在獲取驗證碼圖片中添加后處理荠商,取出session,將取出的session放入獲取手機驗證碼的請求頭中
獲取session
session放入獲取手機驗證碼請求頭中
五续誉、執(zhí)行腳本
最后執(zhí)行腳本莱没,結果如下。后期可以自己配置線程組中的參數(shù)進行接口壓力測試酷鸦。
五饰躲、接口壓力測試
添加計數(shù)器牙咏,計算器的值就是圖片名稱
最后需要保證每次請求的手機號碼不同,和上篇博文一樣使用CSV的方式設置請求的電話號碼
六嘹裂、參考博文
這篇博文有很多相關的知識點都是通過網(wǎng)上查找的妄壶,真正的站在巨人的肩膀上。這里給出相關的博客鏈接
jmeter調用jar包
tess4j使用相關博文
圖片識別訓練相關的
Tesseract-OCR 字符識別---樣本訓練
Tesseract-OCR識別中文與訓練字庫實例
Windows環(huán)境安裝tesseract-ocr 4.00并配置環(huán)境變量
tesseract_ocr 字符識別基礎及訓練字庫寄狼、合并字庫
Tesseract-OCR的簡單使用與訓練
相關下載鏈接
寫在最后
目前的圖片失敗率還是有誤差的丁寄,也許經(jīng)過圖片訓練可以提高識別率。關于訓練這方面的知識泊愧,自己也只是了解一點點伊磺。還需要繼續(xù)學習吧。
這個網(wǎng)站的注冊模塊有三個問題:
一是:驗證圖片有點簡單删咱,一般的圖片識別工具就能完成對驗證碼的識別
二是:界面控件的擺放順序不夠合理屑埋,個人認為應該把手機號輸入框放在前面
以上,希望看到這里能對你有所收獲
appium的安裝和使用 | Jmeter驗證碼圖片識別注冊接口壓力測試實戰(zhàn) | 下一篇 |
---|