51Testing软件测试论坛

标题: 结合资料整理了loadrunner java vuser实现smtp邮件发送的脚本 [打印本页]

作者: gmyeti    时间: 2009-4-10 16:31
标题: 结合资料整理了loadrunner java vuser实现smtp邮件发送的脚本
这种方式是把loadrunner作为开发环境,使用java语言编写程序脚本,实现smtp协议的邮件收发。
这种方式是不基于录制的,直接测试邮件服务器的测试方式,不借助于outlook或foxmail这种客户端邮件工具,也不借助于通常邮件系统提供的web界面,直接使用
javamail包编写简易的客户端发邮件程序,利用loadrunner的多用户模拟,持续发送,参数化等特性,实现性能测试。
针对这个协议loadrunner的license必须使用global的,web的不能用。

下面重点介绍一下脚本。
包括几部分:
1、如何创建java vuser脚本
2、如何编写java vuser脚本实现smtp协议发邮件(就是java语言)
3、如何优化脚本实现测试目的。

1、如何创建java vuser脚本。
1)使用vugen工具,选择协议为java vuser。创建新的java vuser脚本。
全部脚本代码都在action中,如下:
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
}
其中的init()和end()两个方法相当于web协议脚本的init和end action部分,只有action()中的脚本是每次迭代都会执行的部分。所以我们编写的发邮件部分的脚本都在action()中。

2)设置环境变量:
脚本机器需要安装java环境 ,jdk版本限制。
runtime setting中,设置java jvm和 classpath
java jvm这里loadrunner会自动将系统环境变量的path中java_home加载进来,所以只要设置好系统环境变量的java相关参数即可。(JAVA_HOME,PATH)
需要使用几个特殊的包,在loadrunner的runtime setting的java Environment Settings——classpath下增加包,需要下载以下jar包,并均在loadrunner中设置。在环境变量中设置也可以.
mail.jar
jakarta-oro-2.0.8.jar
poi-3.5-beta5-20090219.jar
activation.jar

2、如何编写java vuser脚本实现smtp协议发邮件
脚本分为几个部分:获取stmp邮件服务器地址,获取邮件内容等,发送邮件
各功能都可以在单独的方法中实现,最后在action()中调用即可。
1)定义变量(这些最后优化脚本时都可以使用loadrunner的参数池方式参数化)
        Properties props;                //系统属性
        MimeMessage msg;                //mime邮件对象
        MimeMultipart mp ;                // Multipart对象,邮件内容,标题,附件等内容均添加到其后再生成minmemessage对象
        Session session;                //邮件会话
        boolean needAuth=false;        //smtp是否需要认证

        String filename="";                //设置文件名
        String host="";                        //smtp地址
        String username="";                //smtp认证用户名
        String password="";                //smtp认证用户密码
        String subject="";                //邮件主题
        String personalname="";                //邮件发送人姓名
        String body="";                        //邮件正文
        String charset="";                //邮件字符集
        String mailhead="";                //邮件头
        String mailFrom="";                //发件人地址
        String mailTo="";                        //收件人地址
2)获取stmp邮件服务器地址,通过设定系统属性完成,主要使用的函数是getProperties()和setProperty(),或者put增加系统属性。脚本如下:
//获得smtp环境主机地址,端口host=mail.***.com,username为发件人姓名
                props=System.getProperties();
                props.setProperty("mail.smtp.host",host);
                props.setProperty("mail.smtp.port","25");
3)设置邮件内容
设置邮件正文:
addbody()
                mp= new MimeMultipart();
                BodyPart bp=new MimeBodyPart();
                bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+body, "text/html;charset=GB2312");
                mp.addBodyPart(bp);

设置邮件附件
addFileAffix       
                mp= new MimeMultipart();
                BodyPart bp=new MimeBodyPart();
                FileDataSource fileds=new FileDataSource(filename);
                bp.setDataHandler(new DataHandler(fileds));
                bp.setFileName(fileds.getName());
                mp.addBodyPart(bp);

设置邮件总体信息
mailContent()
                session=Session.getInstance(props,null);
                msg=new MimeMessage(session);
                mp= new MimeMultipart();
                addbody();
                addFileAffix(filename);               
                InternetAddress[] to = new InternetAddress[1];
                      InternetAddress from = new InternetAddress(mailFrom,personalname,charset);
                     to[0] =new InternetAddress(mailTo,personalname,charset);//可设置多个
                msg.setContent(mp);
                msg.setFrom(from);
                     msg.setRecipients(Message.RecipientType.TO,to);
                      msg.setSubject(subject,charset);
                     msg.setSentDate(new Date());
4)发送邮件
sendmail()
        SMTPTransport t = (SMTPTransport)session.getTransport(needAuth ? "smtps" : "smtp");
            t.connect(host,username,password);
            t.sendMessage(msg, msg.getAllRecipients());       
        t.close();       
5)在action中调用其他方法实现邮件发送
                SetMail();
                SetSmtpHost();
            try
        {       
                mailContent();
                sendMail();
            }
            catch (Exception e)
        {
                        e.printStackTrace();
            }
3、如何优化脚本实现测试目的。
1)参数化
将初始化部分使用loadrunner的parameter方式进行参数化。
如发件人,收件人,抄送人,邮件内容,附件等
2)设定事务
将发送邮件部分设定成事务,获取事务处理的时间值。
3)打出适当日志
打出适当日志能够获取当前的事务状态。
4)在场景中使用模拟多用户或多个附件等传送,以吞吐量确定系统处理能力。

4、存在缺点
参数化简单。
如果在场景中设置使用其它机器作为负载机时,则其它机器的java环境变量必须与runtime setting中一致,很容易出现错误无法定位问题。使用本机作为负载机情况下未出现什么问题。
作者: linnynsu    时间: 2009-4-16 16:50
不错,太好了
作者: iori    时间: 2009-4-16 17:06
不错不错。。。
作者: 云层    时间: 2009-4-16 23:38
怎么看上去像是性能测试从零开始里面的内容。。。其实smtp协议直接录制就行了,干嘛调用java啊,多麻烦。。。
作者: gmyeti    时间: 2009-4-17 10:16
标题: 回复 4# 的帖子
题目都写了是结合资料了,思路自然都是一样;再说都是javamail能有多少差别。
主要看你动不动手去实践。
直接录有直接录的好处,不同需求不同方法,如果不实验怎么知道哪种方法好。按需索取也没什么不好。
作者: ljonathan    时间: 2009-4-29 13:35
支持楼主,呵呵
这样比直接用协议录制灵活多了,如果再加上java的多线程,就可以不用loadrunner,实现比较简单的性能测试了
作者: Zee    时间: 2009-4-29 13:46

作者: lovelovelove    时间: 2009-4-29 15:16

作者: trapezia    时间: 2009-4-29 15:44
要的就是这样专业的东东!!!
作者: yixiong007    时间: 2010-4-14 16:13
恩很好,谢谢了
作者: pat33    时间: 2011-9-22 10:53
真怕自己把用户名密码忘记了呢,最近都在研究LR 基于java  Vuser的话题
作者: jcljvp    时间: 2014-10-13 15:28
给力,谢谢整理分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2