Jmeter如何生成合法的身份证号?

2022-11-14 14:18:20 浏览数 (1)

写在前面

前几天五一放假期间,偶然在一个测试群里看到一位群友提问“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文件,同时定义一个变量来接收函数返回值,也就是身份证号
  1. python文件create_ssn.py文件内容如下
代码语言:javascript复制
# 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取样器生成身份证号的整体实现过程,此外还可以借助这种方式生成姓名、手机号、银行卡号、省市区地址等多种数据。当然,生成测试数据的方式有很多种,主要看个人选择,以上方法也并不一定是最佳方案。如果你有更好的方法,欢迎留言讨论!

0 人点赞