LoadRunner調用Oracle存儲過程
為了測試這個存儲過程,我遙了一圈去做這個事情,這里說一下我自己接受到任務和自己開始是怎么想的。
方法一:
一開始我想著可以使用C#直接去調用存儲過程,然后用Loadrunner調用C#的dll去測試,后來發現找不到LoadRunner怎樣直接調用C#寫的dll;可是dll存儲過程都已經寫好,不可能推倒重新用其他的方式去做,由于任務時間比較緊,就山寨的用C#寫了個 .exe 去調用 dll,完成后執行,印象是:數據庫跟本一點壓力都沒有,可是負載機都已經 100%了,并且這種做法得需要在每臺負載機都安裝一個oracle 客戶端,要不訪問不了,負載機有 30臺,每臺都去安裝一編,我倒!
方法二:
最后想到一種方法,寫一個WebService 去調用Dll,Loadrunner再去調用WebService去進行測試。(這種做法是不是很笨?有沒有其他更好的方法,請留言給我!)
下面就把整個過程詳細列一下,其實這個之前也都有做過,但由于沒有記錄到博客,全忘記了,重寫是多么的痛苦,血的教訓說明:寫博客還是有必需的!
Step1:編寫訪問存儲過程的dll
using System; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; using System.Linq; using System.Text; namespace PaysysInterfaceTest { public class PaysysBase { public OracleConnection conn = null; public OracleCommand cmd = null; /// <summary> /// 數據庫初始化 /// </summary> /// <param name="DataSource">數據庫源(Orlacle Client下的tnsnames.ora配置</param> /// <param name="DataUserId">數據庫登錄名</param> /// <param name="DataPassword">數據庫登錄密碼</param> /// <returns></returns> public int PaysysInit(string DataSource, string DataUserId, string DataPassword) { var mConn = string.Format("Data Source={0};User Id={1};Password={2};", DataSource, DataUserId, DataPassword); conn = new OracleConnection(mConn); try { conn.Open(); cmd = new OracleCommand(); cmd.Connection = conn; } catch (Exception ex) { return 0; } return 1; } /// <summary> /// 調用的存儲過程 /// </summary> /// <param name="interfaceName">存儲過程名稱</param> /// <returns></returns> public int CallInterface(string interfaceName) { var nResult = 0; var queryString = interfaceName; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = queryString; try { cmd.ExecuteNonQuery(); Console.WriteLine("Query Success!!"); nResult = Convert.ToInt32(cmd.Parameters["result"].Value); } catch (Exception ex) { Console.WriteLine("Query Error!!\r\n" + ex.Message); nResult = Convert.ToInt32(cmd.Parameters["result"].Value); ; } finally { cmd.Clone(); conn.Close(); Console.WriteLine("Close Db"); } return nResult; } } public class PlayerLogin : PaysysBase { public string s_account = ""; public string s_password = ""; /// <summary> /// 存儲過程初始化參數 /// </summary> /// <param name="account">用戶賬號</param> /// <param name="password">用戶密碼</param> public void LoginInit(string account, string password) { s_account = account; s_password = password; InitParam(); } /// <summary> /// 初始化信息 /// </summary> private void InitParam() { //反回值 cmd.Parameters.Add("result", OracleType.Float); cmd.Parameters["result"].Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add("s_account", OracleType.VarChar); cmd.Parameters["s_account"].Direction = ParameterDirection.Input; cmd.Parameters["s_account"].Value = s_account; cmd.Parameters.Add("s_password", OracleType.VarChar); cmd.Parameters["s_password"].Direction = ParameterDirection.Input; cmd.Parameters["s_password"].Value = s_password; //==================out================== cmd.Parameters.Add("d_login_time", OracleType.DateTime); cmd.Parameters["d_login_time"].Direction = ParameterDirection.Output; cmd.Parameters.Add("d_last_login_time", OracleType.DateTime); cmd.Parameters["d_last_login_time"].Direction = ParameterDirection.Output; cmd.Parameters.Add("d_last_logout_time", OracleType.DateTime); cmd.Parameters["d_last_logout_time"].Direction = ParameterDirection.Output; } |
// <summary> /// 調用執行存儲過程 /// </summary> /// <returns></returns> public int LoginInterface() { return CallInterface("player.login"); } } public class PlayerLogout : PaysysBase { public string s_account = ""; public void LogoutInit(string account) { s_account = account; InitParam(); } private void InitParam() { //反回值 cmd.Parameters.Add("result", OracleType.Float); cmd.Parameters["result"].Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add("s_account", OracleType.VarChar); cmd.Parameters["s_account"].Direction = ParameterDirection.Input; cmd.Parameters["s_account"].Value = s_account; } public int LogoutInterface() { return CallInterface("player.logout"); } } } |
遇到問題:
1、在編寫login的接口時,因為只初始化了Input的參數,還以為不需要Output的參數,所以導致調用的時候一直出現參數缺少的問題。入參和出參都需要填!
Setp2:WebServices調用dll
1、新建工程:
2、新建好工程后添加剛剛寫好的dll
3、WebService調用代碼
[WebMethod] public string PaysysLogin(string dbName, string dbAccount, string dbPassword, string account, string password) { var nResult = 0; try { PlayerLogin login = new PlayerLogin(); login.PaysysInit(dbName, dbAccount, dbPassword); login.LoginInit(account, password); nResult = login.LoginInterface(); } catch (Exception ex) { return ex.Message; } return nResult.ToString(); } [WebMethod] public string PaysysLogout(string dbName, string dbAccount, string dbPassword, string account) { var nResult = 0; try { PlayerLogout logout = new PlayerLogout(); logout.PaysysInit(dbName, dbAccount, dbPassword); logout.LogoutInit(account); nResult = logout.LogoutInterface(); } catch (Exception ex) { return ex.Message; } return nResult.ToString(); } |
之后就可以調試一下了!
Setp3:部署到IIS(可以查看我之前的一編博客,是一樣的)
http://www.cnblogs.com/Martin_Q/archive/2010/12/06/1897614.html
調試結果
遇到問題:
這里遇到一個很糟糕的問題,使用IIS在調用到:conn.Open() 的時候出現一個錯誤:system.data.oracleclient 需要 oracle 客戶端軟件 8.1.7 或更高版本。
這個問題一定要值得注意,開始我以為是iis沒有權限訪問oracle目錄,我為什么會這么認為呢?因為我為了查這個問題,我專門寫了一個.exe 去執行調用,exe應用程序執行成功,iis出錯!
原來問題是由于我安裝的oracle客戶端為簡易版本,很多很多的dll都沒有。可以網上找一下:10201_client_win32.zip 些版本client,當然還有其他的權限問題!這里沒遇到就不談了
Setp4:使用LoadRunner調用WebServices
1、Loadrunner新建WebService
2、點ManageServices 添加你的WebService地址
3、添加WebService 調用接口
搭建的地址為:http://10.20.87.62:81/Service.asmx 為什么后面需要手工加一個:?WSDL 呢?(知道的同學說一下!)
4、添加成功
5、添加對應的存儲過程
6、添加成功后Action代碼
Action() { lr_start_transaction("Login"); web_service_call( "StepName=PaysysLogin_101", "SOAPMethod=Service|ServiceSoap|PaysysLogin", "ResponseParam=response", "Service=Service", "ExpectedResponse=SoapResult", "Snapshot=t1386150115.inf", BEGIN_ARGUMENTS, // 參數傳入 "dbName=orcl_35", "dbAccount=root", "dbPassword=123456", "account={Account}", "password=a", END_ARGUMENTS, BEGIN_RESULT, // 獲取返回值 "PaysysLoginResult=LoginResult", END_RESULT, LAST); lr_message("All:%s\r\nLoginResult:%s\r\n",lr_eval_string("{response}"),lr_eval_string("{LoginResult}")); if(atoi(lr_eval_string("{LoginResult}")) == 1) { lr_end_sub_transaction("Login",LR_PASS); } else { lr_end_sub_transaction("Login",LR_FAIL); lr_error_message("Login Error:%s ---- %s",lr_eval_string("{LoginResult}"),lr_eval_string("{Account}")); } return 0; } |
輸出結果:
All:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><PaysysLoginResponse xmlns="http://tempuri.org/"><PaysysLoginResult>1</PaysysLoginResult></PaysysLoginResponse></soap:Body></soap:Envelope>
LoginResult:1
posted on 2014-09-30 10:22 順其自然EVO 閱讀(181) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄