通过Loadrunner读取excel表数据并批量更新到Oracle中

本文以Loadrunner的Java_Vuser脚本为例,来做一个简化版的自动化测试框架(以excel作为数据驱动),实现批量更新Oracle业务数据库的目的,通过本文例子我们还可以实现将Loadrunner由性能测试工具,转换成一个接口自动化测试工具(Loadrunner的多用户和循环action脚本模式,是多么类似单元测试工具的Test Case调用,既@Test模式)。

1、在loadrunner中新建脚本(本文以LoadRunner11为例),要求选择协议类型为Java->Java Vuser

2、在Run-time Settings设置JDK路径,由于LoadRunner11不支持jdk1.8,本次测试是拷贝了一份低版本的JDK1.6,所以路径选择固定路径模式,如下所示:

3、上网下载一份Oracle的JAR包和jxl的JAR包(官网和网上都能搜到),我已经把两包加上mysql的驱动包都放一起,有兴趣的可以直接下载:http://download.csdn.net/detail/smooth00/9875368,将JAR包放到Loadrunner的include目录下或其它指定目录下,并在Run-time Settings中配置Classpath

4、建立excel文件(要求另存为Excel97-2003的文件格式,保存的路径是在LR脚本目录下新建一个目录DataSource,将excel放到这个目录下),并按以下数据格式创建参数表(每个Sheet以真实表命名,colName是表的字段表,colValue是要更新的字段值):

5、在Loadrunner中以Java Vuser协议创建脚本,脚本样例如下:

/*

* LoadRunner Java script. (Build: _build_number_)

* Script Description:         

*/

import java.io.File;

import java.io.IOException;

import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.HashMap;

import jxl.Cell;

import jxl.read.biff.BiffException;

import jxl.Sheet;

import jxl.Workbook;

import lrapi.lr;

public class Actions

{

    //设定数据库驱动,数据库连接地址、端口、名称,用户名,密码 

        String driverName="oracle.jdbc.OracleDriver"; 

        String url="jdbc:oracle:thin:@172.16.1.65:1521:orcl";  //orcl为数据库名称,1521为连接数据库的默认端口 

        String user="test";  //用户名 

        String password="123456";  //密码 

        PreparedStatement pstmt = null; 

        ResultSet rs = null;

        //数据库连接对象 

        Connection conn = null;

    public Workbook workbook;

    public Sheet sheet;

    public Cell cell;

    int rows;

    int columns;

    //public String fileName;

    //public String caseName;

    public ArrayList arrkey = new ArrayList();

    static String sourceFile;

public void connection(){//连接Oracle数据库

    try {

//反射Oracle数据库驱动程序类 

Class.forName(driverName); 


//获取数据库连接 

conn = DriverManager.getConnection(url, user, password); 


//输出数据库连接 

System.out.println(conn);

    } catch (ClassNotFoundException e) { 

e.printStackTrace(); 

    } catch (SQLException e) { 

e.printStackTrace(); 

    }

}

public void deconnection(){//断开数据库连接

    try{ 

    if(rs != null){ 

rs.close(); 

    } 

    if(pstmt != null){ 

pstmt.close(); 

    } 

    if(conn != null){ 

conn.close(); 

    } 

} catch (SQLException e) { 

    e.printStackTrace(); 

}   

}

    /**

    * 以HashMap获得excel表中的数据

    * @caseName Excel的Sheet名

    * @fileName Excel的文件名

    */

    public Object[][] getExcelData(String caseName,String fileName) throws BiffException, IOException {

        workbook = Workbook.getWorkbook(new File(getPath(fileName)));

        sheet = workbook.getSheet(caseName);

        rows = sheet.getRows();

        columns = sheet.getColumns();

        // 为了返回值是Object[][],定义一个多行单列的二维数组

        HashMap[][] arrmap = new HashMap[rows - 1][1];

        // 对数组中所有元素hashmap进行初始化

        if (rows > 1) {

            for (int i = 0; i < rows - 1; i++) {

                arrmap[i][0] = new HashMap();

            }

        } else {

            System.out.println("excel中没有数据");

        }

        // 获得首行的列名,作为hashmap的key值

        for (int c = 0; c < columns; c++) {

            String cellvalue = sheet.getCell(c, 0).getContents();

            arrkey.add(cellvalue);

        }

        // 遍历所有的单元格的值添加到hashmap中

        for (int r = 1; r < rows; r++) {

            for (int c = 0; c < columns; c++) {

                String cellvalue = sheet.getCell(c, r).getContents();

                arrmap[r - 1][0].put(arrkey.get(c), cellvalue);

            }

        }

        return arrmap;

    }

    /**

    * 获得excel文件的路径

    * @return

    * @throws IOException

    */

    public String getPath(String fileName) throws IOException {

        File directory = new File(".");

        sourceFile = directory.getCanonicalPath() + "\\DataSource\\"

                + fileName + ".xls";

        return sourceFile;

    }

    /**

    * 以ArrayList格式获得excel表中的数据

    * @caseName Excel的Sheet名

    * @fileName Excel的文件名

    */

    public ArrayList GetExcelParameter(String caseName,String fileName){

ArrayList parameters = new ArrayList();

try {

Workbook workbook = Workbook.getWorkbook(new File(getPath(fileName)));

Sheet sheet = workbook.getSheet(caseName);

for (int i = 1; i < sheet.getRows(); i++) {//不包括第一行

    for (int j = 0; j < sheet.getColumns(); j++) {

        parameters.add(sheet.getCell(j, i).getContents()); 

System.out.println(parameters.get(j)+"  "); 

    }

}

} catch (BiffException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return parameters;

}

/**

  * 批量更新表中的指定字段(excel中每个Sheet是一张表,Sheet名与表名同名,第一列ID序号,第二列字段名,第三列是需要更新的字段值)

  * @TableName Excel的Sheet名(设置成与数据表同名)

  * @ColumnIDs 需要修改的字段名,用@分隔不同字段

  * @fileName Excel的文件名

  */

public void updateField(String TableName,String ColumnIDs,String fileName){

    try{

    Workbook workbook = Workbook.getWorkbook(new File(getPath(fileName)));

    Sheet sheet = workbook.getSheet(TableName);

    String[] ColumnID=ColumnIDs.split("@");

    String update_sql="update "+TableName+" Set ";

    for(int k=0;k

for (int i = 1; i < sheet.getRows(); i++) {//不包括第一行

    String ColumnName=sheet.getCell(1, i).getContents();

    String ColumnNameValue=sheet.getCell(2, i).getContents();

    //lr.output_message("The parameter1's value is "+ColumnName+" "+ColumnID[i]);

    if(ColumnName.equals(ColumnID[k])){

if(k==ColumnID.length-1)

  update_sql+=ColumnName+"='"+ColumnNameValue+"' WHERE ROWNUM<=10";//修改前10条

else

    update_sql+=ColumnName+"='"+ColumnNameValue+"',";

    //lr.output_message("The parameter1's value is "+ColumnName);

break;

    }   

}

    }

    System.out.println("【" + update_sql + "】");

    //创建该连接下的PreparedStatement对象 

    pstmt = conn.prepareStatement(update_sql);

    //循环获取ResultSet对象中信息

        rs = pstmt.executeQuery();           

    } catch (Exception e) { 

e.printStackTrace(); 

    }

}

/**

  * 批量修改指定Sheet(指定表名)中的字段,按照表中第一条记录更新第一个字段,第二条记录更新第二个字段,以此类推

  * @TableName Excel的Sheet名(设置成与数据表同名)

  * @fileName Excel的文件名

  */

public void updateData(String TableName,String fileName){

try{

Workbook workbook = Workbook.getWorkbook(new File(getPath(fileName)));

Sheet sheet = workbook.getSheet(TableName);

String update_sql=null;

for (int i = 1; i < sheet.getRows(); i++) {//不包括第一行

    PreparedStatement pstmt2 = null;  //将数据集定义PreparedStatement放到for循环内,效率不高,但为了避免游标数超限,只能这么做

    ResultSet rs2 = null;

    String ColumnName=sheet.getCell(1, i).getContents();

    String ColumnNameValue=sheet.getCell(2, i).getContents();

    update_sql="update "+TableName+" Set "+ColumnName+"='"+ColumnNameValue+"' where rowid in ( Select rid from (Select Rownum r_n,rowid rid,a.* from "+TableName+" a)where r_n="+i+")";//修改第i条

    System.out.println("【" + update_sql + "】");

    //创建该连接下的PreparedStatement对象 

    pstmt2 = conn.prepareStatement(update_sql);

    //循环获取ResultSet对象中信息

    rs2 = pstmt2.executeQuery();

    if(rs2 != null){ 

rs2.close(); 

    } 

    if(pstmt2 != null){ 

pstmt2.close(); 

    }

}


  } catch (Exception e) { 

e.printStackTrace(); 

  }

}

/**

  * 循环调用整个excel中的不同Sheet参数表,并按上一函数的要求更新数据

  * @fileName Excel的文件名

  */

public void updateData(String fileName){

    try{

Workbook workbook = Workbook.getWorkbook(new File(getPath(fileName)));

Sheet[] sheets = workbook.getSheets();// 获取所有的sheet

String sheetname = null;

for (int x = 0; x < sheets.length; x++) { 

  Sheet sheet = workbook.getSheet(x);// 获取sheet

  if(sheet.getName().toString().indexOf("Sheet")!=-1){//循环到以Sheet命名的附表则退出

    break;

  }else{

updateData(sheet.getName());

  }

}     

    } catch (Exception e) { 

e.printStackTrace(); 

    }

}

public int init() throws Throwable {

  connection();

return 0;

}//end of init

public int action() throws Throwable {

    //Object[][] getExcelOb=getExcelData("GTDJ_BGSX_LC","DataTable");

    //System.out.println("【" + getExcelOb + "】");

    //ArrayList gextExcelPa=GetExcelParameter("GTDJ_BGSX_LC","DataTable");

    //System.out.println("【" + gextExcelPa + "】");

    // -----------------------------------------------------------------------------

    //updateField("GTDJ_BGSX_LC","RECID@OPENO@PRIPID@ALTITEM","DataTable");//修改指定字段,用@分隔字段名

    //updateData("GTDJ_BGSX_LC","DataTable");//修改不同的字段-每条记录只改一个字段(指定表名)

    updateData("DataTable");//修改excel所有表的不同字段-每条记录只改一个字段

    //--------------------------------------------------------------------------


return 0;

}//end of action

public int end() throws Throwable {

    deconnection();

return 0;

}//end of end

}

以上脚本仅供参考,主要目的是为了表达Loadrunner所提供的Java和.Net调用接口,可以实现用数据驱动的方式对Java和.Net进行自动化测试,而且可以适当扩展成单元测试工具,毕竟工具都是死的,人和思想才是活的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容