电话咨询
19922193247
性能测试的脚本开发阶段,需要模拟用户输入,获取用户发送的请求,然后模拟用户发送数据。这种测试方式往往与系统的安全防御策略相冲突。一般性能测试中,通过删除验证码、万能验证码、使用已登录cookie等方式,绕过对验证码的限制,但是某些已上线系统或全链路测试中需要模拟用户真实操作,所以需要一些折中的办法实现。
下图为一个典型的登录界面,因为有验证码校验,所以自动化测试会遇到一些阻碍。
市面上有很多已经封装好的识别工具,本次使用ddddocr进行识别,识别效果也是非常不错,对一些常规的数字、字母验证码识别有奇效。因为是性能测试,需要模拟大量用户并发请求,所以需要在请求识别图片的时候需要增加身份标识,比如这里被测系统将cookie与登录用户绑定,所以需要在urllib.request请求的http头中增加cookie内容。
# -*- coding: utf-8 -*-
import ddddocr
import urllib.request
import argparse
def ocrrun(imgurl,ocrcookie):
ocr = ddddocr.DdddOcr(show_ad=False,use_gpu=True)
img_src = imgurl
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.90 Safari/537.36 2345Explorer/9.5.2.18321',
'cookie':ocrcookie
}
request = urllib.request.Request(url=img_src, headers=header)
resp = urllib.request.urlopen(request)
img_bytes = bytearray(resp.read())
res = ocr.classification(img_bytes)
print(res)
parser = argparse.ArgumentParser(description='ocr img')
parser.add_argument('--url', '-u', help='url of http img',required=True)
parser.add_argument('--cookie', '-c', help='cookie of login',required=True)
args = parser.parse_args()
if __name__=='__main__':
try:
ocrrun(args.url,args.cookie)
except Exception as e:
print(e)
处理验证码请求可以通过“后置处理器”或“函数助手”实现,本次使用函数助手实现,相对简单,新建工程,引入ApacheJMeter_core.jar,新建类继承AbstractFunction,重写getReferenceKey这样在函数助手中就能找到自定义的函数,在getArgumentDesc中设置输入,在execute中实现函数主体逻辑,通过命令执行的方式调用ddddocr识别验证码,这里注意输入参数中除了识别码url还需要设置对应的cookie。
public class ocr_function extends AbstractFunction {
private CompoundVariable imgurl,ocrcookie;
@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
String img_url = imgurl.execute().trim();//获取填写数据
String ocr_cookie = ocrcookie.execute().trim();
StringBuilder str_cmd = new StringBuilder("python ");
str_cmd.append(System.getProperty("user.dir"));
str_cmd.append(File.separator);
str_cmd.append("pyocr");
str_cmd.append(File.separator);
str_cmd.append("ocr_image.py -u ");
str_cmd.append(img_url);
str_cmd.append(" -c ");
str_cmd.append(ocr_cookie);
String img_code = RuntimeUtil.execForStr(str_cmd.toString());
return img_code.replaceAll("\r|\n", "");
}
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
checkParameterCount(parameters, 2, 2);//填写数据规则,是否可以不填
Object[] values = parameters.toArray();
imgurl = (CompoundVariable) values[0];//获取数据
ocrcookie = (CompoundVariable) values[1];
}
private static final String KEY = "ocr_img"; //函数名
@Override
public String getReferenceKey() {
return KEY;
}
private static final List<String> desc = new LinkedList<>();
static {
desc.add("验证码url"); //函数助手中的名称
desc.add("用户身份cookie");
}
@Override
public List<String> getArgumentDesc() {
return desc;
}
}
将代码编译为jar包,放到jmeter目录下的lib/ext中,重新启动jmeter,能够在函数助手中找到自定义的函数
在登录页面请求中获取cookie,并将cookie参数化后传入ocr函数中
在实际测试中,识别成功率在80%左右,所以实际测试中还需要对脚本断言的判断进行优化
温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!