Jmeter验证码图片识别注册接口压力测试实战

写在前面

前段时间写了一篇博文《Jmeter验证码注册接口压力测试实战》,前两天又登录对应的网站看了一下。发现原来滑动验证的方式改成了图片验证码的方式,防止用户多次发送手机验证码。

看到这里我本来不想再有太多想法了。

但是看到如下的注册界面,将很“人性化”的将验证码图片放在了第一行。


修改后的登录界面

我总感觉它在向我说:来呀,你来呀!

我想了想,好吧......,那我试一下。


一、测试步骤

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添加进来。


添加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和察看结果树,以便观察运行结果。


测试java接口

运行脚本,察看运行结果。结果没有报错,并且输出了路径“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请求


获取http

返回如下消息表示请求接口编写成功


返回验证码
3、保存验证码图片并识别验证码

验证码图片会保存在路径“D:\code\vcode_src\”路径下,文件名会以1到n的顺序增长


保存验证码图片

这里先测试一下运行一次的情况,参数如下


脚本参数

运行结果,说明返回的验证码图片进行了识别。后续只需要用这个识别的验证码进行获取手机验证码的请求就可以了。


image.png
image.png
四、编写获取验证码请求脚本

获取手机验证码时要带上cookies和获取图片验证码返回的session值,这样才能成功。要问这一点我怎么知道的,是因为在编写脚本时发现没有带这个值,或者这个值是错的会返回错误信息,然后根据经验,看到的~

获取手机验证码脚本如下,其中${vceode}是验证码图片识别中得到的。


获取手机验证码请求

添加cookie请求头把浏览器的值拷贝放入即可


image.png

image.png

使用正则表达式,在获取验证码图片中添加后处理,取出session,将取出的session放入获取手机验证码的请求头中

获取session


获取session

session放入获取手机验证码请求头中


session放入获取手机验证码请求头中

五、执行脚本

最后执行脚本,结果如下。后期可以自己配置线程组中的参数进行接口压力测试。


执行结果

五、接口压力测试

添加计数器,计算器的值就是图片名称


添加计数器

最后需要保证每次请求的手机号码不同,和上篇博文一样使用CSV的方式设置请求的电话号码


六、参考博文

这篇博文有很多相关的知识点都是通过网上查找的,真正的站在巨人的肩膀上。这里给出相关的博客链接

jmeter调用jar包

使用jmeter实现对jar包调用

tess4j使用相关博文

Java验证码识别
Tess4J OCR简单使用教程

图片识别训练相关的

Tesseract-OCR 字符识别---样本训练
Tesseract-OCR识别中文与训练字库实例
Windows环境安装tesseract-ocr 4.00并配置环境变量
tesseract_ocr 字符识别基础及训练字库、合并字库
Tesseract-OCR的简单使用与训练

语言包


相关下载链接

tesseract
图片转换器


写在最后

目前的图片失败率还是有误差的,也许经过图片训练可以提高识别率。关于训练这方面的知识,自己也只是了解一点点。还需要继续学习吧。

这个网站的注册模块有三个问题:

一是:验证图片有点简单,一般的图片识别工具就能完成对验证码的识别

二是:界面控件的摆放顺序不够合理,个人认为应该把手机号输入框放在前面

以上,希望看到这里能对你有所收获

appium的安装和使用 Jmeter验证码图片识别注册接口压力测试实战 下一篇
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容