通過(guò)Loadrunner讀取excel表數(shù)據(jù)并批量更新到Oracle中

本文以Loadrunner的Java_Vuser腳本為例衩椒,來(lái)做一個(gè)簡(jiǎn)化版的自動(dòng)化測(cè)試框架(以excel作為數(shù)據(jù)驅(qū)動(dòng))懊亡,實(shí)現(xiàn)批量更新Oracle業(yè)務(wù)數(shù)據(jù)庫(kù)的目的椎组,通過(guò)本文例子我們還可以實(shí)現(xiàn)將Loadrunner由性能測(cè)試工具丹拯,轉(zhuǎn)換成一個(gè)接口自動(dòng)化測(cè)試工具(Loadrunner的多用戶和循環(huán)action腳本模式祈争,是多么類似單元測(cè)試工具的Test Case調(diào)用斤程,既@Test模式)。

1菩混、在loadrunner中新建腳本(本文以LoadRunner11為例)忿墅,要求選擇協(xié)議類型為Java->Java Vuser

2、在Run-time Settings設(shè)置JDK路徑沮峡,由于LoadRunner11不支持jdk1.8疚脐,本次測(cè)試是拷貝了一份低版本的JDK1.6,所以路徑選擇固定路徑模式邢疙,如下所示:

3棍弄、上網(wǎng)下載一份Oracle的JAR包和jxl的JAR包(官網(wǎng)和網(wǎng)上都能搜到),我已經(jīng)把兩包加上mysql的驅(qū)動(dòng)包都放一起疟游,有興趣的可以直接下載:http://download.csdn.net/detail/smooth00/9875368呼畸,將JAR包放到Loadrunner的include目錄下或其它指定目錄下,并在Run-time Settings中配置Classpath

4颁虐、建立excel文件(要求另存為Excel97-2003的文件格式蛮原,保存的路徑是在LR腳本目錄下新建一個(gè)目錄DataSource,將excel放到這個(gè)目錄下)聪廉,并按以下數(shù)據(jù)格式創(chuàng)建參數(shù)表(每個(gè)Sheet以真實(shí)表命名瞬痘,colName是表的字段表故慈,colValue是要更新的字段值):

5、在Loadrunner中以Java Vuser協(xié)議創(chuàng)建腳本框全,腳本樣例如下:

/*

* 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

{

? ? //設(shè)定數(shù)據(jù)庫(kù)驅(qū)動(dòng)察绷,數(shù)據(jù)庫(kù)連接地址、端口津辩、名稱拆撼,用戶名,密碼?

? ? ? ? String driverName="oracle.jdbc.OracleDriver";?

? ? ? ? String url="jdbc:oracle:thin:@172.16.1.65:1521:orcl";? //orcl為數(shù)據(jù)庫(kù)名稱喘沿,1521為連接數(shù)據(jù)庫(kù)的默認(rèn)端口?

? ? ? ? String user="test";? //用戶名?

? ? ? ? String password="123456";? //密碼?

? ? ? ? PreparedStatement pstmt = null;?

? ? ? ? ResultSet rs = null;

? ? ? ? //數(shù)據(jù)庫(kù)連接對(duì)象?

? ? ? ? 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數(shù)據(jù)庫(kù)

? ? try {

//反射Oracle數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類?

Class.forName(driverName);?


//獲取數(shù)據(jù)庫(kù)連接?

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


//輸出數(shù)據(jù)庫(kù)連接?

System.out.println(conn);

? ? } catch (ClassNotFoundException e) {?

e.printStackTrace();?

? ? } catch (SQLException e) {?

e.printStackTrace();?

? ? }

}

public void deconnection(){//斷開(kāi)數(shù)據(jù)庫(kù)連接

? ? try{?

? ? if(rs != null){?

rs.close();?

? ? }?

? ? if(pstmt != null){?

pstmt.close();?

? ? }?

? ? if(conn != null){?

conn.close();?

? ? }?

} catch (SQLException e) {?

? ? e.printStackTrace();?

}? ?

}

? ? /**

? ? * 以HashMap獲得excel表中的數(shù)據(jù)

? ? * @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[][],定義一個(gè)多行單列的二維數(shù)組

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

? ? ? ? // 對(duì)數(shù)組中所有元素hashmap進(jìn)行初始化

? ? ? ? if (rows > 1) {

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

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

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? System.out.println("excel中沒(méi)有數(shù)據(jù)");

? ? ? ? }

? ? ? ? // 獲得首行的列名闸度,作為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表中的數(shù)據(jù)

? ? * @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中每個(gè)Sheet是一張表,Sheet名與表名同名蚜印,第一列ID序號(hào)莺禁,第二列字段名,第三列是需要更新的字段值)

? * @TableName Excel的Sheet名(設(shè)置成與數(shù)據(jù)表同名)

? * @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 + "】");

? ? //創(chuàng)建該連接下的PreparedStatement對(duì)象?

? ? pstmt = conn.prepareStatement(update_sql);

? ? //循環(huán)獲取ResultSet對(duì)象中信息

? ? ? ? rs = pstmt.executeQuery();? ? ? ? ? ?

? ? } catch (Exception e) {?

e.printStackTrace();?

? ? }

}

/**

? * 批量修改指定Sheet(指定表名)中的字段哟冬,按照表中第一條記錄更新第一個(gè)字段,第二條記錄更新第二個(gè)字段忆绰,以此類推

? * @TableName Excel的Sheet名(設(shè)置成與數(shù)據(jù)表同名)

? * @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;? //將數(shù)據(jù)集定義PreparedStatement放到for循環(huán)內(nèi)浩峡,效率不高,但為了避免游標(biāo)數(shù)超限错敢,只能這么做

? ? 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 + "】");

? ? //創(chuàng)建該連接下的PreparedStatement對(duì)象?

? ? pstmt2 = conn.prepareStatement(update_sql);

? ? //循環(huán)獲取ResultSet對(duì)象中信息

? ? rs2 = pstmt2.executeQuery();

? ? if(rs2 != null){?

rs2.close();?

? ? }?

? ? if(pstmt2 != null){?

pstmt2.close();?

? ? }

}


? } catch (Exception e) {?

e.printStackTrace();?

? }

}

/**

? * 循環(huán)調(diào)用整個(gè)excel中的不同Sheet參數(shù)表翰灾,并按上一函數(shù)的要求更新數(shù)據(jù)

? * @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){//循環(huán)到以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");//修改不同的字段-每條記錄只改一個(gè)字段(指定表名)

? ? updateData("DataTable");//修改excel所有表的不同字段-每條記錄只改一個(gè)字段

? ? //--------------------------------------------------------------------------


return 0;

}//end of action

public int end() throws Throwable {

? ? deconnection();

return 0;

}//end of end

}

以上腳本僅供參考,主要目的是為了表達(dá)Loadrunner所提供的Java和.Net調(diào)用接口稚茅,可以實(shí)現(xiàn)用數(shù)據(jù)驅(qū)動(dòng)的方式對(duì)Java和.Net進(jìn)行自動(dòng)化測(cè)試纸淮,而且可以適當(dāng)擴(kuò)展成單元測(cè)試工具,畢竟工具都是死的峰锁,人和思想才是活的萎馅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虹蒋,隨后出現(xiàn)的幾起案子糜芳,更是在濱河造成了極大的恐慌,老刑警劉巖魄衅,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峭竣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晃虫,警方通過(guò)查閱死者的電腦和手機(jī)皆撩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扛吞,你說(shuō)我怎么就攤上這事呻惕。” “怎么了滥比?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亚脆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盲泛,道長(zhǎng)濒持,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任寺滚,我火速辦了婚禮柑营,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘村视。我一直安慰自己官套,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蓖议。 她就那樣靜靜地躺著虏杰,像睡著了一般讥蟆。 火紅的嫁衣襯著肌膚如雪勒虾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天瘸彤,我揣著相機(jī)與錄音修然,去河邊找鬼。 笑死质况,一個(gè)胖子當(dāng)著我的面吹牛愕宋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播结榄,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼中贝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了臼朗?” 一聲冷哼從身側(cè)響起邻寿,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎视哑,沒(méi)想到半個(gè)月后绣否,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挡毅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蒜撮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跪呈。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡段磨,死狀恐怖取逾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苹支,我是刑警寧澤菌赖,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站沐序,受9級(jí)特大地震影響琉用,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜策幼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一邑时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧特姐,春花似錦晶丘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捷枯,卻和暖如春滚秩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淮捆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工郁油, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攀痊。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓桐腌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苟径。 傳聞我的和親對(duì)象是個(gè)殘疾皇子案站,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容