ITPub博客

首页 > 数据库 > Oracle > LoadRunner 测试Oracle数据库及Siebel性能

LoadRunner 测试Oracle数据库及Siebel性能

Oracle 作者:下一站在哪 时间:2014-05-31 10:00:00 0 删除 编辑

  本次测试使用的loadrunner 版本为8.1,oracle数据库版本为10.2.0.1,各版本的测试方法基本是一样的。这里提供loadrunner 8.1,10000个web用户的license:

  AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

  还有golba-1000:AEACFSJI-YASEKJJKEAHJD-BCLBR

  1、 打开loadrunner界面,选择创建脚本

  2、 选择Oracle (2—tier)协议,

  3、 录制的程序选择sqlplus的路径,如:E:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe

  注意我们录制到的操作时Action

  4、我们输入用户和密码,郑州牛皮癣专科医院并向Test表中插入一条数据,然后提交以后输入quit退出。

  5、LoadRunner会自动的给我们生成脚本,这个脚本默认是采用c语言编写的,我们可以对代码根据自己的要求进行一些修改,比如我们希望每次执行的SQL语句都是不同的,或者我们需要让一个用户重复去执行N条记录以后才退出。

  6、下面我们对代码进行一下修改,让用户登录sqlplus之后重复执行20次insert操作之后commit;我们每次插入的值有循环次数决定,从1到20;部分脚本如下:

  Action()

  {

  int j=0;

  int i=0;

  char word[50];

  lrd_init(&InitInfo, DBTypeVersion);

  lrd_initialize_db(LRD_DBTYPE_ORACLE, 2, 0);

  lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);

  lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);

  lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);

  lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);

  lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes2, 0);

  lr_think_time(12);

  lrd_server_attach(OraSrv1, "", -1, 0, 0);

  lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);

  lrd_ora8_attr_set(OraSes1, USERNAME, "scott", -1, 0);

  lrd_ora8_attr_set(OraSes1, PASSWORD, lr_decrypt("4a8a04d62971759a946f"), -1, 0);

  lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);

  lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm1, 0);

  lrd_ora8_stmt(OraStm1, "SELECT USER FROM DUAL", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm1, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_ora8_bind_col(OraStm1, &OraDef1, 1, &USER_D1, 0, 0);

  lrd_ora8_fetch(OraStm1, -1, 1, &uliFetchedRows, PrintRow2, 2, 0, 0);

  GRID8(2);

  lrd_handle_free(&OraStm1, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm2, 0);

  lrd_ora8_stmt(OraStm2, "BEGIN DBMS_OUTPUT.DISABLE; END;", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm2, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_handle_free(&OraStm2, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm3, 0);

  lrd_ora8_stmt(OraStm3, "SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE FROM "

  "SYSTEM.PRODUCT_PRIVS WHERE (UPPER('SQL*Plus') LIKE UPPER"

  "(PRODUCT)) AND (UPPER(USER) LIKE USERID)", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm3, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_ora8_bind_col(OraStm3, &OraDef2, 1, &ATTRIBUTE_D2, 0, 0);

  lrd_ora8_bind_col(OraStm3, &OraDef3, 2, &SCOPE_D3, 0, 0);

  lrd_ora8_bind_col(OraStm3, &OraDef4, 3, &NUMERIC_VALUE_D4, 0, 0);

  lrd_ora8_bind_col(OraStm3, &OraDef5, 4, &CHAR_VALUE_D5, 0, 0);

  lrd_ora8_bind_col(OraStm3, &OraDef6, 5, &DATE_VALUE_D6, 0, 0);

  lrd_ora8_fetch(OraStm3, -0, 1, &uliFetchedRows, 0, 2, 0, 0);

  lrd_handle_free(&OraStm3, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm4, 0);

  lrd_ora8_stmt(OraStm4, "SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE (UPPER"

  "('SQL*Plus') LIKE UPPER(PRODUCT)) AND ((UPPER(USER) LIKE "

  "USERID) OR (USERID = 'PUBLIC')) AND (UPPER(ATTRIBUTE) = "

  "'ROLES')", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm4, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_ora8_bind_col(OraStm4, &OraDef7, 1, &CHAR_VALUE_D7, 0, 0);

  lrd_ora8_fetch(OraStm4, -0, 1, &uliFetchedRows, 0, 2, 0, 0);

  lrd_handle_free(&OraStm4, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm5, 0);

  lrd_ora8_stmt(OraStm5, "BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;", 1, 32, 0);

  lrd_assign(&P1D8, "SQL*Plus", 0, 0, 0);

  lrd_ora8_bind_placeholder(OraStm5, &OraBnd1, "1", &P1D8,

  LRD_BIND_BY_POS, 0, 0);

  lrd_ora8_exec(OraSvc1, OraStm5, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  GRID0(4);

  lrd_handle_free(&OraStm5, 0);

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm6, 0);

  lrd_ora8_stmt(OraStm6, "SELECT DECODE('A','A','1','2') FROM DUAL", 1, 32, 0);

  lrd_ora8_bind_col(OraStm6, &OraDef8, 1, &DECODE_A_A_1_2_D9, 0, 0);

  lrd_ora8_exec(OraSvc1, OraStm6, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_ora8_print(OraStm6, PrintRow6);

  GRID0(6);

  lrd_handle_free(&OraStm6, 0);

  lrd_ora8_commit(OraSvc1, 0, 0);

  lrd_ora8_commit(OraSvc1, 0, 0);

  lr_think_time(25);

  for(j=1;j<=20;j++)

  {

  i=j; //如果需要随机的插入数据的话使用i=rand();

  itoa(i, word, 10);

  lr_save_string (word ,"para");

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);

  //lrd_ora8_stmt(OraStm7, "insert into test values(12,'a')", 1, 32, 0);

  lrd_ora8_stmt(OraStm7, "insert into test values({para},'a')", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm7, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_handle_free(&OraStm7, 0);

  }

  lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm8, 0);

  lrd_ora8_stmt(OraStm8, "commit", 1, 32, 0);

  lrd_ora8_exec(OraSvc1, OraStm8, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,

  0);

  lrd_handle_free(&OraStm8, 0);

  lrd_session_end(OraSvc1, OraSes1, 0, 0);

  lrd_server_detach(OraSrv1, 0, 0);

  lrd_handle_free(&OraEnv1, 0);

  return 0;

  }

  其中的红色部分是修改或添加的部分,郑州牛皮癣医院最后可以执行一下,效果为:

  7、下面来运行负载

  添加我们录制的脚本

  8、我们测试100个用户登录到数据库,重复的向test表中插入一条由随机数组成的记录,并提交和退出。

  这是运行后的结果以及其他相关信息。

  然后到数据库里面查看一下,应该是插入的记录数为:100X20=2000

  9、然后在结果-分析结果里面分析相关数据。得出相关结论。

  10、下面说一下为什么我们loadrunner测试的时候需要插入随机数或者其他的不重复的数据。

  先来看一下数据库硬解析的数量。

  以sys登录,执行select * from v$sysstat where name ='parse count (hard)';查询

  此时的value为1746,然后我们执行重复200次的

  insert into test values(12,'a')

  然后再查询硬解析的结果为:

  现在是1749,没有多大的差别,其值本应该为1747,但可能由于oracle执行了其他的语句,这说明如果我们执行的是同一条SQL的话,在 测试中无法模拟真实环境的压力,因为真实环境中每个用户执行的SQL语句都可能不一样。

  (parse count (hard):在shared pool中解析调用的未命中次数。当sql语句执行并且该语句不在shared pool或虽然在shared pool但因为两者存在部分差异而不能被使用时产生硬解析。如果一条sql语句原文与当前存在的相同,但查询表不同则认为它们是两条不同语句,则硬解析即会发生。硬解析会带来cpu和资源使用的高昂开销,因为它需要oracle在shared pool中重新分配内存,然后再确定执行计划,最终语句才会被执行。)

  下面我们执行200条不同SQL,

  其最后的结果为1950,所以使用随机数来产生sql语句并执行的话应该可以比较良好的模拟真实环境。

  LoadRunner 测试Siebel性能

  1、本次需要测试的场景是登陆Siebel web应用,创建一个客户,然后退出。

  协议选择Siebel-Web,

  2、录制好脚本之后,我们需要对脚本进行一下改造,我现在需要每次创建的客户的名称是随机的,而且我在回放脚本的时候添加了部分代码,方便的查看到程序运行的时间。部分代码如下:(红色部分为我所修改的)

  int timex(int time_x,int re[])

  {

  re[0] = time_x/(1000*60*60*24);

  re[1] = time_x/(1000*60*60);

  re[2] = time_x/(1000*60);

  re[3] = time_x/1000;

  re[4] = time_x%1000;

  return 0;

  }

  Action()

  {

  int j;

  int i;

  char word[50];

  long a,b;

  int time_x;

  int ret[5];

  a = clock();

  for(j=1;j<2;j++)

  {

  i=rand();

  itoa(i, word, 10);

  lr_save_string (word ,"para");

  lr_output_message(word);

  web_set_max_html_param_len("1024");

  web_url("service_chs",

  "URL=http://10.195.35.234:7777/service_chs",

  "TargetFrame=",

  "Resource=0",

  "RecContentType=text/html",

  "Referer=",

  "Snapshot=t1.inf",

  "Mode=HTML",

  LAST);

  /* Registering parameter(s) from source task id 5

  // {Siebel_sn_cookie3} = "TZARmNMKjOTPxa1RoRtQSSMkGLOXvzkb4oIIlP6ETEHlGdHuse27xQ__"

  // */

  web_reg_save_param("Siebel_sn_cookie3",

  "LB/IC=_sn=",

  "RB/IC=;",

  "Ord=1",

  "Search=headers",

  "RelFrameId=1",

  LAST);

  web_url("start.swe",

  "URL=http://10.195.35.234:7777/service_chs/start.swe?SWECmd=Start&SWEHo=10.195.35.234",

  "TargetFrame=",

  "Resource=0",

  "RecContentType=text/html",

  "Referer=",

  "Snapshot=t2.inf",

  "Mode=HTML",

  LAST);

  ……………..

  由于篇幅,以下省略了,

  …………………………….

  ………………………………..

  ………………………..

  lr_think_time(23);

  web_submit_data("start.swe_19",

  "Action=http://10.195.35.234:7777/service_chs/start.swe",

  "Method=POST",

  "TargetFrame=",

  "RecContentType=text/html",

  "Referer=",

  "Snapshot=t21.inf",

  "Mode=HTML",

  ITEMDATA,

  "Name=s_1_1_37_0", "Value=", ENDITEM,

  "Name=SWEVI", "Value=", ENDITEM,

  "Name=SWERowId", "Value=1-{Siebel_row_id73}", ENDITEM,

  "Name=SWEC", "Value={Siebel_SWECount}", ENDITEM,

  "Name=SWEMethod", "Value=WriteRecord", ENDITEM,

  "Name=SWEReqRowId", "Value=1", ENDITEM,

  "Name=SWERPC", "Value=1", ENDITEM,

  "Name=s_1_1_70_0", "Value=", ENDITEM,

  "Name=s_1_1_71_0", "Value=??‰???", ENDITEM,

  "Name=s_1_1_61_0", "Value=", ENDITEM,

  "Name=SWEApplet", "Value=Account Entry Applet", ENDITEM,

  "Name=SWEActiveApplet", "Value=Account Entry Applet", ENDITEM,

  "Name=s_1_1_51_0", "Value=N", ENDITEM,

  "Name=s_1_1_62_0", "Value=", ENDITEM,

  "Name=SWEView", "Value=Account List View", ENDITEM,

  "Name=s_1_1_41_0", "Value=", ENDITEM,

  "Name=s_1_1_63_0", "Value=", ENDITEM,

  "Name=SWECmd", "Value=InvokeMethod", ENDITEM,

  "Name=s_1_1_65_0", "Value=??????", ENDITEM,

  "Name=SWETS", "Value={SiebelTimeStamp}", ENDITEM,

  "Name=SWEActiveView", "Value=Account List View", ENDITEM,

  //"Name=s_1_1_35_0", "Value=LoadRunner Test", ENDITEM,

  "Name=s_1_1_35_0", "Value={para}", ENDITEM,

  "Name=SWEP", "Value=", ENDITEM,

  "Name=s_1_1_69_0", "Value=", ENDITEM,

  "Name=SWERowIds", "Value=", ENDITEM,

  LAST);

  Siebel_SWECount_var += 1;

  lr_save_int(Siebel_SWECount_var, "Siebel_SWECount");

  lr_think_time(7);

  web_submit_data("start.swe_20",

  "Action=http://10.195.35.234:7777/service_chs/start.swe",

  "Method=POST",

  "TargetFrame=",

  "RecContentType=text/html",

  "Referer=",

  "Snapshot=t22.inf",

  "Mode=HTML",

  "EncodeAtSign=YES",

  ITEMDATA,

  "Name=SWEC", "Value={Siebel_SWECount}", ENDITEM,

  "Name=SWEMethod", "Value=BatchCanInvoke", ENDITEM,

  "Name=SWERPC", "Value=1", ENDITEM,

  "Name=SWEActiveApplet", "Value=Account Entry Applet", ENDITEM,

  "Name=SWECmd", "Value=InvokeMethod", ENDITEM,

  "Name=SWEIPS", "Value=@0*0*7*0*0*3*0*2*#40*2*#00*5*SWEJI5*false2*#10*6*SWEDIC4*true2*#20*2*#30*", ENDITEM,

  "Name=SWEActiveView", "Value=Account List View", ENDITEM,

  "Name=SWEService", "Value=SWE Command Manager", ENDITEM,

  LAST);

  web_save_timestamp_param("SiebelTimeStamp",

  LAST);

  web_url("start.swe_21",

  "URL=http://10.195.35.234:7777/service_chs/start.swe?SWECmd=Logoff&SWETS={SiebelTimeStamp}&SWEPreLd=1&SWEClearLC=1",

  "TargetFrame=",

  "Resource=0",

  "RecContentType=text/html",

  "Referer=",

  "Snapshot=t23.inf",

  "Mode=HTML",

  LAST);

  }

  b = clock();

  time_x = (int)(b-a);

  lr_message("间隔时间为:%d 毫秒",time_x);

  return 0;

  }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29661313/viewspace-1173379/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-05-16

  • 博文量
    24
  • 访问量
    43693