在接口測試、自動化測試工作中,你一定會遇到驗(yàn)證碼處理的問題,很多初入測試、甚至測試?yán)哮B的處理方式都比較粗暴,要么找開發(fā)設(shè)置為萬能驗(yàn)證碼或者直接測試環(huán)境取消驗(yàn)證碼,說實(shí)話這種方式也非常實(shí)用,畢竟驗(yàn)證碼不是我們項(xiàng)目核心,手工測試一下就可以了,何必自動化實(shí)現(xiàn)呢?
今天給大家介紹一種Jmeter接口測試時(shí)對驗(yàn)證碼自動識別的方式,先說在前頭,該方式對于背景干擾的圖片識別率還是有點(diǎn)低,但是對于純色底紋的識別率基本100%,請擇情使用。
主要思路步驟如下:
1、通過接口獲取驗(yàn)證碼
2、驗(yàn)證碼處理腳本
3、jmeter中配置驗(yàn)證碼處理腳本
4、識別驗(yàn)證碼
一、驗(yàn)證碼接口案例介紹
在我們項(xiàng)目的登錄模塊中就帶有驗(yàn)證碼,我們就以這個(gè)接口為例講解。
我們可以在jmeter中實(shí)現(xiàn)這個(gè)接口,步驟如下。
1、啟動jemter
2、創(chuàng)建線程組->http采樣器、debug采樣器,http采樣器設(shè)置如下
3、添加監(jiān)聽器->HTTP采樣器->保存結(jié)果到文件,配置如下,幾個(gè)選項(xiàng)都不勾選,默認(rèn)文件名為1.png
4、添加監(jiān)聽器->查看結(jié)果樹,保存、運(yùn)行腳本。
二、驗(yàn)證碼處理代碼
現(xiàn)在驗(yàn)證碼文件已經(jīng)保存在本地了,需要將其讀取為base64加密格式,然后才能進(jìn)行后續(xù)的驗(yàn)證碼識別。
下面我們將使用java,編寫圖片文件處理的文件,實(shí)現(xiàn)將base64加密的數(shù)據(jù)轉(zhuǎn)文圖片文件,也可以將圖片文件處理為base64加密文件,并將其導(dǎo)出為jar包備用。
1、eclipse創(chuàng)建java工程
2、導(dǎo)入sun.misc.BASE64Decoder.jar包,需自行下載
創(chuàng)建文件夾lib
復(fù)制sun.misc.BASE64Decoder.jar包到lib文件夾下
選擇sun.misc.BASE64Decoder.jar,右鍵build path->add build path
3、創(chuàng)建包、java文件,目錄結(jié)構(gòu)如下
4、java文件ToImage內(nèi)容如下,如果文件名或者類名不同,需要調(diào)試代碼,注意事項(xiàng)。
聲明類一定為public,否則jmeter調(diào)用會出現(xiàn)找不到類的問題
main方法為調(diào)試代碼,導(dǎo)出包之前可以注釋掉
package com.qf;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
public class ToImage {
public static void main(String[] args){
// String base64Str = "iVBORw0KGgoAAAANSUhEUgAAAKAAAAA8CAIAAABuCSZCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAOq0lEQ·········
// boolean b=false;
// try {
// b = GenerateImage(base64Str, "D:/gg.jpg");
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println(b);
String aa = GetImageStr("E:/3-Learning/Deep-Learning-master/imageVerydow/1.png");
System.out.println(aa);
}
/**
* 圖片轉(zhuǎn)化成base64字符串
* @param imgPath
* @return
*/
public static String GetImageStr(String imgPath) {// 將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對其進(jìn)行Base64編碼處理
String imgFile = imgPath;// 待處理的圖片
InputStream in = null;
byte[] data = null;
String encode = null; // 返回Base64編碼過的字節(jié)數(shù)組字符串
// 對字節(jié)數(shù)組Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
try {
// 讀取圖片字節(jié)數(shù)組
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
encode = encoder.encode(data);
//加密代碼后的字符串會自動化換行,通過該句取消掉換行
encode = encode.replaceAll("\r\n", "");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return encode;
}
/**
* base64字符串轉(zhuǎn)化成圖片
*
* @param imgData
* 圖片編碼
* @param imgFilePath,存放到本地路徑
* @return
* @throws IOException
*/
@SuppressWarnings("finally")
public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 對字節(jié)數(shù)組字符串進(jìn)行Base64解碼并生成圖片
if (imgData == null) // 圖像數(shù)據(jù)為空
return false;
BASE64Decoder decoder = new BASE64Decoder();
OutputStream out = null;
try {
out = new FileOutputStream(imgFilePath);
// Base64解碼
byte[] b = decoder.decodeBuffer(imgData);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 調(diào)整異常數(shù)據(jù)
b[i] += 256;
}
}
out.write(b);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
out.flush();
out.close();
return true;
}
}
}
5、導(dǎo)出jar包
代碼調(diào)試通過后,導(dǎo)出該工程jar包備用(jmeter中Beanshell處理器可以導(dǎo)入jar包并使用其功能)。
選中工程名->export->jar file->配置導(dǎo)出的jar選項(xiàng),如圖設(shè)置,點(diǎn)擊Finish完成導(dǎo)出。
至此,我們就擁有了一個(gè)ToImage.jar的文件,該文件提供兩個(gè)方法:
GetImageStr:圖片轉(zhuǎn)化成base64字符串
GenerateImage:base64字符串轉(zhuǎn)化成圖片
三、Jmeter實(shí)現(xiàn)驗(yàn)證碼識別
實(shí)現(xiàn)驗(yàn)證碼識別,需要借助OCR(Optical Character Recognition,光學(xué)字符識別)插件,我們可以通過gitee下載一個(gè),當(dāng)然可以自己實(shí)現(xiàn)識別代碼。
我們采用gitee上的開源的jmeter-captcha識別碼插件,可以下載其jar包直接使用,也可以下載源碼包二次開發(fā)。作者建議二次開發(fā),因?yàn)椴煌?yàn)證碼的底紋干擾不同,處理方式也不太一樣,如果是打包的jar包,識別率就會收到影響。
本文采用jar包直接演示,如需要可以直接找作者索要,源碼見gitee。
https://gitee.com/changpei12315/jmeter-captcha
1、下載jmeter-captcha,并配置到到{JMEMTER_HOME}/lib/ext/下
https://gitee.com/hyj-jmeter/jmeter-captcha/releases
2、下載tessdata語言包,為空默認(rèn)在{JMEMTER_HOME}/lib/tessdata下
https://gitee.com/changpei12315/tessdata_fast
將下載的tessdata_fast中的文件復(fù)制到tessdata中即可。
3、jmeter中測試計(jì)劃設(shè)置
添加ToImage.jar包
添加sun.misc.BASE64Decoder.jar包
定義一個(gè)變量code,用于中轉(zhuǎn)存儲驗(yàn)證碼數(shù)據(jù)
4、jmeter采樣器后置處理設(shè)置
線程組->后置處理器->Beanshell后置處理器,并設(shè)置如下:
import com.qf.ToImage;
//先將圖像文件讀入到此處,轉(zhuǎn)為base64
String aaa = ToImage.GetImageStr("E:/1.png");
System.out.println(aaa);
//使用put方法將加密的圖片數(shù)據(jù)輸出到code變量(測試計(jì)劃中定義)中
vars.put("code",aaa);
線程組->后置處理器->驗(yàn)證碼識別插件(完成前兩步才有),配置如下:
5、運(yùn)行查看結(jié)果
其實(shí)本案例中的驗(yàn)證碼的識別率很低,需要調(diào)整ocr對圖片的灰度、干擾線等代碼優(yōu)化。
四、其他簡單驗(yàn)證碼的識別
如果驗(yàn)證碼圖片比較簡單,沒有復(fù)雜底紋和干擾的話,識別率還是挺高的。
1、白底純數(shù)字的驗(yàn)證碼識別
驗(yàn)證碼識別插件設(shè)置語言為:eng
Beanshell后置處理器設(shè)置讀入文件為:E:/sz.png
3、白底純字母的驗(yàn)證碼識別
驗(yàn)證碼識別插件設(shè)置語言為:eng
Beanshell后置處理器設(shè)置讀入文件為:E:/zm.png
4、白底純漢字的驗(yàn)證碼識別
驗(yàn)證碼識別插件設(shè)置語言為:chi_sim
Beanshell后置處理器設(shè)置讀入文件為:E:/hz.png
五、總結(jié)
后續(xù)持續(xù)更新一篇對干擾優(yōu)化的文章,可以替換掉現(xiàn)有的jmeter-captcha.jar包。
以及一篇深度學(xué)習(xí)的文章,通過學(xué)習(xí)算法訓(xùn)練學(xué)習(xí),可以有效提升識別準(zhǔn)確率。歡迎大家的持續(xù)關(guān)注和點(diǎn)贊。
更多關(guān)于軟件測試培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項(xiàng)目實(shí)操的話可以點(diǎn)擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。