qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 修文县| 民县| 遵义市| 长沙市| 剑河县| 交城县| 湖口县| 长子县| 定安县| 元江| 菏泽市| 抚远县| 临澧县| 贡山| 调兵山市| 湘乡市| 林州市| 保山市| 西安市| 堆龙德庆县| 惠安县| 资溪县| 怀仁县| 会泽县| 遵义县| 罗田县| 石屏县| 东源县| 凤冈县| 辽源市| 渝北区| 梅河口市| 二手房| 西丰县| 阳泉市| 忻州市| 八宿县| 祁阳县| 岳池县| 青龙| 紫云|