8.3 VU Java Vuser自开发SMTP程序
从上节的学习可知,VU可以使用SMTP Vuser来录制生成基于SMTP协议的脚本,这对于刚入门的测试工程师来说非常快捷和高效,但同时也为调试脚本带来一定困难,尤其是邮件中包含一些非英文字符,在dat文件中都是编码后的字节,难以维护和修改。在这种情况下,如果性能测试工程师具有一定的开发经验和技术,就可以考虑使用Java Vuser自主开发Java程序来达到相同的目的。
8.3.1 VU创建Java模板虚拟用户
我们首先需要创建Java Vuser,然后在Java Vuser环境下加载或开发Java程序。
启动VU,在“File”菜单下选择“New”,在弹出的Vuser列表中选择“Java Vuser”,如图8-16所示。
图8-16 在虚拟用户列表中选择“Java Vuser”
单击“OK”按钮,在VU脚本中我们看到生成如下模板脚本:
import lrapi.lr;
public class Actions
{
public int init() {
return 0;
}//end of init
public int action() {
return 0;
}//end of action
public int end() {
return 0;
}//end of end
}
由上可见,Java Vuser中的Int()、action()、end()函数和C Vuser中的vuser_init、action、vuser_end一样,迭代的设置只对action生效,而对init和end无效。我们的开发主要在action函数中完成。
8.3.2 设置Java环境
我们知道Java环境最主要的参数有两个:一个是Java虚拟机path,另一个是classpath。
打开Vuser的运行时设置(Run-time Settings)窗口,选择Java VM,如图8-17所示。
图8-17 运行时设置中的Java VM配置页面
这里如果Xbootclasspath没有特殊的参数设置,对此页面不要做任何修改。因为VU将自动从path中获得Java虚拟机的路径。
单击“Classpath”,显示如图8-18所示的配置页面。
对于SMTP协议,Java开源组织已经提供了很多相关package封装,我们可以在Internet上下载,比如在jakarta网站。
我们在这里添加3个mail的jar包,即mail.jar、poi.jar和jakarta-oro-2.0.8.jar。单击“OK”按钮,关闭“Run-time Settings”窗口。
图8-18 运行时设置中的Java Classpath配置页面
单击VU运行按钮,编译运行通过,验证我们的设置是正确的。
8.3.3 在Java Vuser中开发SMTP发送mail脚本
首先我们需要在Java文件头进行import声明,包含相关package。
import lrapi.lr;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import org.apache.poi.hssf.usermodel.*;
import com.sun.mail.smtp.*;
再次运行脚本,以验证import是否成功,否则Java会报错,显示package找不到。
在action函数中编写发送邮件的Java代码,如下:
public int action() {
boolean ssl = false;
//获得SMTP环境
Properties props = System.getProperties();
//设置SMTP主机地址
props.put("mail.smtp.host", "192.168.1.100");
//设置SMTP端口号
props.put("mail.smtp.port","25");
//设置SMTP用户名
props.put("mail.smtp.user","test1");
Session session=Session.getInstance(System.getProperties(),null);
//设置邮件header字段
String mailer = "send from VU java SMTP";
//设置收件人
String sendTo = "test1@cesoo.com";
//设置抄送人
String sendCC = "test1@cesoo.com";
//设置发件人
String sendFrom = "test1@cesoo.com";
try{
//获得发送实体
SMTPTransport t = (SMTPTransport)session.getTransport(ssl ? "smtps" : "smtp");
//与SMTP主机相连
t.connect("192.168.1.100","test1","123456");
MimeMessage msg = new MimeMessage(session);
//设置邮件各个字段
String subject = "testing mail subject";
String personalName = "LR JAVA Vuser";
String body = "testing mail body";
String charset = "utf-8";
InternetAddress[] to = new InternetAddress[1];
InternetAddress from = new
InternetAddress(sendFrom,personalName,charset);
to[0] =new InternetAddress(sendTo,personalName,charset);
msg.setFrom(from);
msg.setRecipients(Message.RecipientType.TO,to);
msg.setSubject(subject,charset);
msg.setText(body,charset);
msg.setSentDate(new Date());
//发送邮件
t.sendMessage(msg, msg.getAllRecipients());
}
catch (Exception e){
e.printStackTrace();
}
return 0;
}//end of action
以上代码运行成功后,Outlook即可收到一封邮件,如图8-19所示。
图8-19 Java Vuser成功回放脚本并发送邮件
8.3.4 参数化增强脚本
以上脚本中的配置信息和邮件字段信息可使用参数化方法,转移到参数表中存储。参数化后,代码有如下变化:
public int action() {
boolean ssl = false;
//获得SMTP环境
Properties props = System.getProperties();
//设置SMTP主机地址
props.put("mail.smtp.host", "<SMTPHost>");
//设置SMTP端口号
props.put("mail.smtp.port","<SMTPPort>");
//设置SMTP用户名
props.put("mail.smtp.user","<UserName>");
Session session=Session.getInstance(System.getProperties(),null);
//设置邮件header字段
String mailer = "<MailHeadere>";
//设置收件人
String sendTo = "<SendTo>";
//设置抄送人
String sendCC = "<sendCC>";
//设置发件人
String sendFrom = "<sendFrom>";
try{
//获得发送实体
SMTPTransport t = (SMTPTransport)session.getTransport(ssl ? "smtps" : "smtp");
//与SMTP主机相连
t.connect("<SMTPHost>","<UserName>","<Passwd>");
MimeMessage msg = new MimeMessage(session);
//设置邮件各个字段
String subject = "<mailSubject>";
String personalName = "<PersonalName>";
String body = "<mailBody>";
String charset = "utf-8";
InternetAddress[] to = new InternetAddress[1];
InternetAddress from = new
InternetAddress(sendFrom,personalName,charset);
to[0] =new InternetAddress(sendTo,personalName,charset);
msg.setFrom(from);
msg.setRecipients(Message.RecipientType.TO,to);
msg.setSubject(subject,charset);
msg.setText(body,charset);
msg.setSentDate(new Date());
//发送邮件
t.sendMessage(msg, msg.getAllRecipients());
}
catch (Exception e){
e.printStackTrace();
}
return 0;
}//end of action
参数化后,验证脚本,能够通过。
我们就可以在参数表中更改测试数据,发送不同字符的邮件了!
中文邮件:如图8-20所示。
图8-20 Java Vuser参数化后成功发送中文邮件
日文邮件:如图8-21所示。
由此可见,通过Java Vuser的自开发程序代码,脚本的灵活性大大增强。这是录制脚本无法比拟的优势。
录制和开发是VU生成脚本的两种方式,我们应该根据项目需求、时间、资源等综合因素考虑选择最合适的方式。
图8-21 Java Vuser参数化后成功发送日文邮件