写在前面
前几天五一放假期间,偶然在一个测试群里看到一位群友提问“Jmeter如何生成合法的身份证号”。我们都知道,如果是Python或Java语言,借助第三方库,很容易就能够模拟出合法的身份证号。在此之前,我也遇到过使用Jmeter生成身份证号的场景,但那时候我们的接口没有身份证号的合法校验。为了方便起见,在传参时都是用函数助手生成18位长度的随机数字字符串传递。于是,出于好奇和热心,在经过自己一番实践过后,解答了他的问题。因此,本篇也是一次解答群友问题的实践记录。
Jmeter生成身份证号的三种方法
方法一:通过RandomString函数
熟悉Jmeter的人都知道,Jmeter提供了函数助手的功能,通过函数助手中的RandomString函数可以生成指定长度的、随机的数字字符串,但这种方法生成的身份证号只符合了身份证号的长度规则,它并不合法。因此,这种方法的好处是简单快捷,缺点是不适用于后端接口存在合法性校验的情况。
方法二:通过CSV文件助手
① 模拟生成身份证号
我们可以提前将在其他地方,比如下图网站中模拟生成好一些合法的身份证号数据,并复制到CSV文件中。
http://www.chineseidcard.com/
② 在Jmeter中引用CSV文件
添加CSV Data Set Config元件,设置变量名id_card,在需要引用的地方使用${id_card}来引用即可。这种方法的好处是读取到的CSV文件中的身份证号是合法的,缺点是不适用于后端接口存在身份证号重复性校验的情况,因为脚本多次运行时,每次都会从头开始读取数据。
方法三:通过BeanShell取样器读取Python文件
很显然,当我们需要每运行一次Jmeter脚本就可以生成一个合法的、且不重复的身份证号时,以上两种实现方式就无法满足需求。这也引出了本次文章重点介绍的第三种方法,总体实现思路如下:
- python里有现成的第三方库faker库可以生成身份证号,可以编写一个python文件,引用faker库,定义一个生成身份证号的函数
- 然后在jmeter中添加一个beanshell取样器,在取样器中调用系统命令行执行python文件,同时定义一个变量来接收函数返回值,也就是身份证号
- python文件create_ssn.py文件内容如下
# coding:utf-8
from faker import Faker
fake = Faker(locale="zh_CN")
def create_ssn():
ssn = fake.ssn()
print(ssn)
return ssn
if __name__ == '__main__':
create_ssn()
2.Beanshell脚本内容如下:
代码语言:javascript复制String command = "cmd /c python C:\create_ssn.py";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
pr.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = "";
StringBuilder response = new StringBuilder();
while ((line = b.readLine()) != null) {
response.append(line);
}
String response_data = response.toString();
System.out.println("身份证号:" response_data);
b.close();
vars.put("ssn",response.toString());
注意事项:
- 第一行中的cmd /c 可以省略,如果是Windows可以加,如果是Mac或Linux系统,一定不能加;
- py文件路径不能带有空格,路径分隔要用双斜杠;
3.运行后,在调试取样器中可以看到变量ssn的值。此时,即可使用${ssn}在接口中进行传参。
小结:
以上就是利用python的faker库 Beanshell取样器生成身份证号的整体实现过程,此外还可以借助这种方式生成姓名、手机号、银行卡号、省市区地址等多种数据。当然,生成测试数据的方式有很多种,主要看个人选择,以上方法也并不一定是最佳方案。如果你有更好的方法,欢迎留言讨论!