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 = "[email protected]";
//設置抄送人
String sendCC = "[email protected]";
//設置發件人
String sendFrom = "[email protected]";
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參數化後成功發送日文郵件