51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1768|回复: 8
打印 上一主题 下一主题

求助使用LR测试ORACLE存储过程的方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-2-16 09:43:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们要对ORACLE数据库的存储过程进行性能测试,不知道如何直接录制脚本,所以改用JAVA代码调用存储过程,不知到各位还有没有更好的方法,我们的存储过程主要完成查询,更新,删除操作,其中查询占据了大多数。
我们在LR中写的代码如下,其余的测试脚本于此类似。
/*
* LoadRunner Java script. (Build: 609)
*
* Script Description:
*                     
*/

import lrapi.lr;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.CallableStatement;

import oracle.jdbc.driver.OracleTypes;
import oracle.sql.ARRAY;


public class Actions
{
        ResultSet rs=null;
    CallableStatement cs;
    Connection con;
    private String[] anArrayIn;
        public int init() {

        String prcname = "p_get_account_list";//修改为对应存储过程名

      final   String sql = "{call " + prcname + " (?,?,?,?,?,?,?,?,?,?,?,?)}";
        //String[] anArrayIn = new String[]{"CID156","01","156"};//修改为对应数组参数
      
                   cs = null;
       try{
                        Class.forName("oracle.jdbc.driver.OracleDriver");

                        con=DriverManager.getConnection("jdbcracle:thinlocalhost:1521:ADMIN","abc","abc");
                        //System.out.println(con);
                        System.out.println("连接已打开");
            //oracle.sql.ArrayDescriptor anArrayDescriptor = new oracle.sql.ArrayDescriptor("ANESTEDTABLETYPE",con);
                        //oracle.sql.ARRAY anARRAYin =  new ARRAY(anArrayDescriptor,con,anArrayIn);
                        cs = con.prepareCall(sql);

                        cs.setString(1,"001");
                        cs.setString(2,"0086");
                        cs.setString(3,"");
                        cs.setString(4,"");
                        cs.setString(5,"");
                        cs.setString(6,"");
                        cs.setString(7,"");
                        cs.setString(8,"");
                        cs.setString(9,"");
                        cs.setString(10,"");
                               

            cs.registerOutParameter(11,OracleTypes.CURSOR);
            cs.registerOutParameter(12,OracleTypes.VARCHAR);

                       

            //System.out.println("注册失败!!!");
                }catch(ClassNotFoundException e){
                        System.out.println("注册失败!!!");
                }catch(SQLException e){
                        System.out.println("连接失败!!!");
                        e.printStackTrace();
                }
     
                return 0;
        }//end of init


        public int action() {
       
                try {
                       
                        cs.execute();
           rs=(ResultSet)cs.getObject(11);// 取得得數据結果集合
ResultSetMetaData rmeta = rs.getMetaData();//
int numColumns=rmeta.getColumnCount();// 确定數据集的字段個數
// 取得字段名
for(int i=1;i<=numColumns;i++)
{
if(i<numColumns)
System.out.print(rmeta.getColumnName(i)+" | ");
else
System.out.println(rmeta.getColumnName(i));
}

while(rs.next())
{
for(int i=1;i<=numColumns;i++)
{
if(i<numColumns)// a,b表中的字段不一定是字符類型,我在此沒有判斷並全部使用getString方法
System.out.print(rs.getString(i)+" | ");
else
System.out.println(rs.getString(i));
}
}

            
                       
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                return 0;
        }//end of action



        public int end() {

            if (cs != null){
                                try {
                                        cs.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                        }
                        if (con != null){
                                try {
                                        con.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                        }
        System.out.println("关闭成功!!!");
                return 0;
        }//end of end
/**
        public static void main(String [] args){
           Actions actions = new Actions();
           actions.init();
           actions.action();
           System.out.println("查询ACCOUNT_LIST存储过程调用结束!!!");
           actions.end();
        }
**/
}

期盼各位大侠的回复,谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2006-6-1 18:43:01 | 只看该作者
我是小菜菜
你用的是javascript vuser协议的吗
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2006-6-2 10:54:18 | 只看该作者
我把上面的代码写在脚本中,点run后vgen就会死掉,这是为什么呀,应该怎么操作呢
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-6-2 15:47:22 | 只看该作者
我也不知道
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2006-6-2 16:22:32 | 只看该作者
你单独的测试SP可以通过sql plus
SQL>set timing on ;
SQL>exec  p_get_account_list 参数;
运行过后将直接返回运行时间
也可以把SP当到JAVA代码中去,通过实现的功能来测试SP的效率

[ 本帖最后由 snowflake 于 2006-6-7 16:23 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2006-6-2 16:33:25 | 只看该作者
那我想通过并发的形式来测试存储过程呢.那应该是在lr中写调用存储过程的代码吧?
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2006-6-2 16:48:41 | 只看该作者
没有必要那么做,如果是通过并发测试的话采用后面那种方法才测试.也就是通过SP实现的功能来测试它的性能,通过响应时间来查看效率

[ 本帖最后由 snowflake 于 2006-6-2 16:49 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2006-6-5 09:44:07 | 只看该作者
谢谢snowflake 的回复,
按你说的方法能实现并发调用存储过程吗?
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2006-6-7 16:29:28 | 只看该作者
可以的,因为SP其实是实现的一个功能,比如:查询用户表,你可以录制查询功能,然后用LR做并发测试......
同时打开sql plus:
SQL>SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece; 通过执行该语句来查看用户调用SP的情况!

[ 本帖最后由 snowflake 于 2006-6-7 16:30 编辑 ]
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-16 07:48 , Processed in 0.066883 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表