一、需求:实现导入课表数据功能,但excel的内容需要修改日期后,才能导入。
二、难点:Exceld的读写操作
在网上百度了一下,需要使用jxl.jar包才能实现,且该包只支持xls格式的读写,不支持xlsx。如果不是xls,则需要将表格另存为xls格式。
三、思路分析:
1、下载环境包:jxl.jar,并放到Jmeter安装目录的lib目录下,或者lib/ext(尝试过都可以),然后重启Jmeter就会生效了。
2、使用Beanshell取样器,用java脚本去操作excel,修改表格的内容
excel三要素:workbook、sheet、cell,即最终要定位到想要修改的单元格
(1)先获取excel的文件名:注意路径一定要写对
(2)获取表单名:即获取第几个sheet
(3)获取单元格的坐标:获取sheet的哪个单元格,从0开始数
(4)将内容写入到对应的单元格中去,并保存为变量(以便于断言)
(5)关闭读写的流
3、修改完成后,使用Beanshell断言,读取excel的内容,对比是否与写入的一致
(1)获取beanshell取样器里,保存的变量:写入的内容
(2)同上述步骤,定位到单元格
(3)读取单元格的内容
(4)比对写入和读取的内容是否一致,进行断言
四、操作步骤:
1、测试计划-线程组-取样器-添加Bean Shell取样器,如图
2、在beanshell取样器-脚本区域,编写脚本
import jxl.*;
import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import jxl.Workbook;
import jxl.write.WritableWorkbook;
import jxl.write.WritableSheet;
import jxl.Cell;
import jxl.write.WritableCell;
import jxl.write.Label;
import java.text.SimpleDateFormat;
import java.util.Calendar;
// 获取当前日期
String year_month_day= "yyyy-MM-dd";
SimpleDateFormat dft = new SimpleDateFormat(year_month_day);
Calendar date = Calendar.getInstance();
String today = dft.format(date.getTime());
// 获取课节
int startSeq = ${seq_1};
int endSeq = startSeq + ${seqNum};
String seqValue = startSeq +"-"+ endSeq;
vars.put("now_date",today);
vars.put("now_seq",seqValue);
//课表文件路径
//String courseFilePath = "F:/测试组共享文件/高校222/20 共用工具/11 盒子信息修改&同步&录制/公共列表/课表导入/教师课表导入模板1天.xls";
String courseFilePath = "${fileurl}" +"/教师课表导入模板1天.xls";
//打印日志
log.info("startSeq===="+startSeq);
log.info("endSeq===="+endSeq);
log.info("seqValue===="+seqValue);
log.info("today===="+today);
log.info("courseFilePath===="+courseFilePath);
try{
InputStream instream = new FileInputStream(new File(courseFilePath));
Workbook readwb = Workbook.getWorkbook(instream);
// 在原表格上追加操作
WritableWorkbook wbook = Workbook.createWorkbook(new File(courseFilePath), readwb);
WritableSheet sheet1 = wbook.getSheet(0);
// 修改单元格的内容:上课日期
Label l20 = new Label(9, 20, today);
Label l21 = new Label(9, 21, today);
Label l22 = new Label(9, 22, today);
Label l23 = new Label(9, 23, today);
Label l24 = new Label(9, 24, today);
sheet1.addCell(l20);
sheet1.addCell(l21);
sheet1.addCell(l22);
sheet1.addCell(l23);
sheet1.addCell(l24);
// 修改单元格内容:节次
Label l1 = new Label(10, 20, seqValue);
Label l2 = new Label(10, 21, seqValue);
Label l3 = new Label(10, 22, seqValue);
Label l4 = new Label(10, 23, seqValue);
Label l5 = new Label(10, 24, seqValue);
sheet1.addCell(l1);
sheet1.addCell(l2);
sheet1.addCell(l3);
sheet1.addCell(l4);
sheet1.addCell(l5);
wbook.write();
wbook.close();
readwb.close();
instream.close();
}catch(Exception e){
e.printStackTrace();
}
3、在Beanshell取样器下,添加Beanshell断言
import jxl.*;
import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import jxl.Workbook;
import jxl.Cell;
import jxl.Sheet;
// 获取当前日期
String now_date = vars.get("now_date");
// 获取课节
String now_seq = vars.get("now_seq");
//课表文件路径
//String courseFilePath = "F:/测试组共享文件/高校222/20 共用工具/11 盒子信息修改&同步&录制/公共列表/课表导入/教师课表导入模板1天.xls";
String courseFilePath = "${fileurl}" +"/教师课表导入模板1天.xls";
//打印日志
log.info("now_date===="+now_date);
log.info("now_seq===="+now_seq);
log.info("courseFilePath===="+courseFilePath);
String date = "";
String seq = "";
try{
InputStream instream = new FileInputStream(new File(courseFilePath));
Workbook readwb = Workbook.getWorkbook(instream);
Sheet sheet1 = readwb.getSheet(0);
Cell c20 = sheet1.getCell(9,20);
date = c20.getContents();
Cell c10 = sheet1.getCell(10,20);
seq = c10.getContents();
log.info("date---"+date);
log.info("seq---"+seq);
readwb.close();
instream.close();
}catch(Exception e){
e.printStackTrace();
Failure=false;
FailureMessage="读取表格失败";
}
// 断言日期是否写入正确
if (date.equals(now_date)){
if(seq.equals(now_seq)){
Failure=false;
log.info("日期和节次都正确");
}else{
Failure=true;
FailureMessage="节次不正确";
log.info("节次不正确");
}
}else{
Failure=true;
FailureMessage="上课日期不正确";
log.info("上课日期不正确");
}
备注:java代码,最好调试过再粘贴进去,直接用Jmeter运行调试的话,只能根据每次运行报错去排查错误点,比较耗费时间,最好打开jmeter.bat程序,在cmd窗口可以看到具体报错日志。
五、中途遇到的问题:
1、excel文件路径不正确,使用绝对路径正常,换成相对路径,不对了,报文件找不到异常;
2、导包导入不全,之前使用import jxl.*,改成了使用导入具体类名才行;
3、修改后,流没有关闭,导致第二次执行的时候会报错,提示文件已打开;
4、修改后,整个表格内容被清空了,没有在原来的基础上追加修改。