引言
前几天在某个软件测试群里看到有网友提问“如何在Jmeter中生成合法的身份证号”,当时出于热心,提供了大体的实现思路,但后来仔细想了想,回复地可能不是特别具体,于是决定自己实践一次。
在使用Jmeter进行自动化测试或性能测试过程中,生成身份证号的方法有多种,需要结合具体的接口校验规则来综合选择:
1、接口对身份证号参数无重复性校验、无合法性校验时
- 可以使用函数助手,生成一个18位长度的字符串
2、接口对身份证号参数无重复性校验、但有合法性校验时
- 可以使用CSV Data Set Config:提前将在其他地方找到的合法的身份证号数据复制到CSV文件中,并添加CSV Data Set Config元件,设置变量名id_card,在需要引用的地方使用${id_card}来引用
3、接口对身份证号参数有重复性校验、且有合法性校验时
很显然,以上两种实现方式无法满足需求,因为第一种方式生成的18位数字无法通过合法性校验,第2种通过读取CSV数据文件的方式,虽然能通过合法性校验,但每次都会重复从头开始读取,当多次运行Jmeter脚本时,传参就会重复,因此需要每运行一次Jmeter脚本就可以生成一个合法的、且随机的身份证号,总体实现思路如下:
- ① python里有现成的第三方库faker库可以生成身份证号,编写一个python文件,引用faker库,定义一个生成身份证号的函数
- ② 然后在jmeter中添加一个beanshell取样器,在取样器中调用cmd执行python文件,定义一个变量来接收函数返回值,也就是身份证号
- python文件create_ssn.py文件内容如下:
# coding:utf-8fromfakerimportFakerfake=Faker(locale="zh_CN") defcreate_ssn(): ssn=fake.ssn() print(ssn) returnssnif__name__=='__main__': create_ssn()
- Beanshell脚本内容如下
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());
注意事项:
1.第一行中的cmd /c 可以省略,如果是Windows可以加,如果是Mac或Linux系统,一定不能加
2.py文件路径不能带有空格,路径分隔要用双斜杠
- 运行后,在调试取样器中可以看到变量ssn的值
总结
以上就是利用python的faker库+Beanshell取样器生成身份证号的整体实现过程,此外还可以借助这种方式生成姓名、手机号、银行卡号、省市区地址等多种数据。当然,生成测试数据的方式有很多种,主要看个人选择。