我每天在思考如何提升测试效率,也许想法还不大成熟,但我也每天慢慢在成长,希望我的一点小分享能够给同在测试路上的小伙伴一点帮助~
一、产品需求
之前测试一个需求,需求内容是根据数据库里订单号和身份证号码关联到sftp的PDF文件,PDF是以订单和身份证命名的,并且在页面做展示。
根据产品需求提炼出来的测试需求:我需要准备订单数据以及跟订单数据相关联的PDF文件,并且需要做压测,验证PDF是否正确关联到对应的订单上面,接下来看我如何准备造好这些测试文件吧。
二、测试需求拆解
1、造订单数据:通过JMeter调接口,将数据推送到数据库
2、根据数据库里面订单号和身份证号生成PDF
3、将生成的PDF文件放到sftp里面
三、具体实现
1、第一步需要写一个生成PDF的方法,因为我需要验证关联是否正确,所以我将PDF的路径、项目编号和PDF文件名称(订单号和身份证)写入PDF文件。
代码语言:javascript复制//创建一个最基本的pdf
public static void fillTemplate(String outpath, String projectno, String name) throws IOException, DocumentException {
String filePath = outpath name ".pdf";
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 18, Font.NORMAL);
try {
//1 创建Document
Document document = new Document();
//2 获取PdfWriter
PdfWriter.getInstance(document, new FileOutputStream(filePath));
//3 打开
document.open();
//4 添加内容
document.add(new Paragraph("文件路径:" outpath,fontChinese));
document.add(new Paragraph("项目编号:" projectno,fontChinese));
document.add(new Paragraph("文件名称:" name,fontChinese));
//5 关闭
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2、第二步是连接数据库。
代码语言:javascript复制//连接数据库
public static Connection getConnection() {
String Driver = "com.mysql.jdbc.Driver";
String URL = "jdbc:mysql://172.16.xx.xx/demo?useSSL=false";
String Name = "demo";
String PassWrod = "demo";
Connection connection;
try {
//获取驱动
Class.forName(Driver);
return connection = DriverManager.getConnection(URL, Name, PassWrod);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3、第三步是将数据库的值捞出来,生成PDF,由于有一层目录是根据订单创建时间生成的,所以需要需要先捞出订单的创建时间,并生成对应的目录,然后根据捞出来的值生成PDF。
代码语言:javascript复制//获取数据库的值生成PDF
public static void DataWriteToPDF(String outPath, String projectNo){
Connection conn = WriteToPDF.getConnection();
try {
Statement stmt = conn.createStatement();
// String sql = "select * from t_order_info where project_no = ? limit 100";
String sql = "select * from t_order_info where project_no = ?";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, projectNo);
ResultSet rs = prepStmt.executeQuery();
while (rs.next()) {
WriteToPDF wp = new WriteToPDF();
if (runningOnWindows() == true){
String str = rs.getString(3) "_" rs.getString(12);
wp.fillTemplate(outPath,projectNo, str);
}else{
String createTime = new SimpleDateFormat("yyyyMMdd").format(rs.getDate(30));
String newPath = null;
String newPath1 = null;
switch(projectNo){
case "001" :
String str = rs.getString(3) "_" rs.getString(12);
newPath = demo_path createTime "/";
isChartPathExist(newPath);
System.out.println("新文件路径:" newPath);
wp.fillTemplate(newPath, projectNo, str);
break;
case "002" :
str = rs.getString(3) "_" rs.getString(12);
newPath = demo_path createTime "/";
isChartPathExist(newPath);
System.out.println("新文件路径:" newPath);
wp.fillTemplate(newPath, projectNo, str);
break;
default :
System.out.println("请输入正确的项目编号!");
}
}
System.out.println("订单创建时间:" rs.getString(30) " 项目编号:" projectNo " 订单号:" rs.getString(3) " 身份证号:" rs.getString(12));
}
4、调用生成PDF方法。因为我需要再本地windows调试,所以会有一个判断是windows还是Linux的逻辑。这里还需要将项目编号作为一个参数,作为后面调用jar包的时候传参。
代码语言:javascript复制public static void main(String[] args) throws Exception {
// fillTemplate("demo/src/main/java/utils/files/", "projectNo", "demo");
String outPath = "demo/src/main/java/utils/files/pls/";
if (runningOnWindows() == true){
String projectNo = "001";
DataWriteToPDF(outPath,projectNo);
}else{
String projectNo = System.getProperty("param");
DataWriteToPDF(outPath,projectNo);
}
}
5、将代码打成通过IDEA打成jar包,并将jar包放到Linux服务器上面,通过调用jar包并传参的方式生成PDF。在这里我还踩了个小坑,由于我们环境默认用jdk1.7版本的,但是执行这个jar包必须得是jdk1.8。
代码语言:javascript复制/usr/java/jdk1.8.0_271/bin/java -Dparam=aaa001 -cp /tmp/Learn-Java.jar utils.WriteToPDF;
四、总结
“超过重复次数3次的事情就要通过代码来解决”,哈哈哈,有没有很有道理。
测试造数是很考验一个测试工程师的基本功的,需要考虑各种场景,部分场景的重复性可能很高。
所以我们需要通过工具的思路,去解决这些重复性工作,提升测试效率。
以后我会经常分享一些我在测试工作中找到的一些提升效率的小工具或者思路,另外,这个小工具我已经上传到github上面了,但是因为整个项目比较简单,等到时机成熟了再分享出来吧,哈哈哈~