热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LoadRunner中查找和替换字符串

使用Loadrunner做接口或者压力测试时,我们经常会碰到请求参数中部分是来自于前置接口的情况,且是动态变化的,这时候,我

 使用Loadrunner做接口或者压力测试时,我们经常会碰到请求参数中部分是来自于前置接口的情况,且是动态变化的,这时候,我们需要从前置接口响应中获取到需要的数据,然后替换到当前的接口请求参数的目标位置中,但是LR中并没有提供查找以及替换字符串的函数,前文

Loadrunner 拼接字符串(从响应中截取字段并添加新的字段作为下次请求参数)

中,我们使用字符串拼接的方式解决了这一问题,但是如果一个脚本中存在多次这种情况,现实情况也通常就是这样的,就会显得很麻烦和费力,那有没有其他的办法呢?

办法自然是有的,虽然LR中没有支持查找并替换字符串的函数,但可以自己封装一个替换字符串函数,之后需要替换时调用函数即可。

1、封装字符串替换函数lr_replace

// ----------------------------------------------------------------------------
// 参数:
// src (in) - 指向源字符串的指针
// from (in) - 指向搜索文本的指针
// to (in) - 指向替换文本的指针
//
// 返回:
// 返回一个指向包含字符串的动态分配内存的指针
// 'from' 指向的文本被替换为'to' 指向的文本。
// ----------------------------------------------------------------------------
char *strReplace(const char *src, const char *from, const char *to)
{
  char *value;
  char *dst;
  char *match;
  int size;
  int fromlen;
  int tolen;


  size = strlen(src) + 1;
  fromlen = strlen(from);
  tolen = strlen(to);


  value = (char *)malloc(size);


  dst = value;


  if ( value != NULL )
  {

    for ( ;; )
    {
      match = (char *) strstr(src, from);
      if ( match != NULL )
      {
        size_t count = match - src;


        char *temp;


        size += tolen - fromlen;


        temp = (char *)realloc(value, size);


        if ( temp == NULL )
        {
          free(value);
          return NULL;
        }


        dst = temp + (dst - value);
        value = temp;


        memmove(dst, src, count);
        src += count;
        dst += count;


        memmove(dst, to, tolen);
        src += fromlen;
        dst += tolen;
      }
      else
      {
        strcpy(dst, src);
        break;
      }
    } 
  }
  return value;
}


int lr_replace( const char *lrparam, char *findstr, char *replacestr )
{
  int res = 0;
  int size;
  char *lrp;
  char *result_str;

  size = strlen(lrparam) + 1;
  lrp=(char *)malloc(size);


  sprintf(lrp, "{%s}", lrparam);
  result_str = strReplace(lr_eval_string(lrp), findstr, replacestr);
  if (result_str != NULL)
  {
    lr_save_string(result_str, lrparam);
    free(result_str);
    res = 1;
  }
  return res;

2、截取用来替换的字符串purchOrderList

web_set_max_html_param_len("262144"); // 默认最大长度为256

// 从响应中截取用来替换的字符串

     web_reg_save_param_ex(
        "ParamName=purchOrderList", // 修改参数名,便于记忆
        "LB=\"data\":{", // 修改 token 值解析算法
        "RB=\"}}",
        SEARCH_FILTERS,
        "Scope=Body",
        "RequestUrl=*/api/customize/user/getSetting?tableKey=purchOrderList-com.slip.spd.entity.vo.purch.PurchOrderVO*",
        LAST);

    web_custom_request("getSetting", 
        "URL={URL}/api/customize/user/getSetting?tableKey=purchOrderList-com.slip.spd.entity.vo.purch.PurchOrderVO", 
        "Method=GET", 
        "Resource=0", 
        "RecContentType=application/json", 
        "Referer={URL}/", 
        // "Snapshot=t71.inf", 
        "Mode=HTML", 
        "EncType=application/json;charset=UTF-8", 
        LAST);

3、保存源字母串,即用来请求的参数new_setting

    // 红色head部门为需要被替换的字符串
    lr_save_string("{\"curPage\": 1,\"pageSize\": 20,\"customizeUserVO\": {head\"}}},\"queryMap\":{\"deptAuth\":{\"asTbName\":\"purch_order\",\"columnName\":\"dept_id\",\"queryType\":\"IN\",\"queryCategory\":\"AND\",\"value\":\"deptAuth\"},\"supplierAuth\":{\"asTbName\":\"purch_order\",\"columnName\":\"supplier_id\",\"queryType\":\"IN\",\"queryCategory\":\"AND\",\"value\":\"supplierAuth\"},\"orderNo\":{\"queryType\":\"ALL_LIKE\",\"value\":null},\"applicationNo\":{\"queryType\":\"ALL_LIKE\",\"value\":null},\"deptId\":{\"queryType\":\"IN\",\"value\":null},\"supplierId\":{\"queryType\":\"IN\",\"value\":null},\"createUser\":{\"queryType\":\"IN\",\"value\":null},\"createTime\":{\"queryType\":\"BETWEEN\",\"value\":null},\"updateUser\":{\"queryType\":\"IN\",\"value\":null},\"updateTime\":{\"queryType\":\"BETWEEN\",\"value\":null},\"status\":{\"queryType\":\"IN\",\"value\":null},\"remark\":{\"queryType\":\"ALL_LIKE\",\"value\":null},\"purchUser\":{\"queryType\":\"IN\",\"value\":null},\"purchTime\":{\"queryType\":\"BETWEEN\",\"value\":null},\"lastReceiveTime\":{\"queryType\":\"BETWEEN\",\"value\":null},\"lastStoreTime\":{\"queryType\":\"BETWEEN\",\"value\":null},\"beforeMergeStatus\":{\"queryType\":\"IN\",\"value\":null},\"mergeType\":{\"queryType\":\"IN\",\"value\":null},\"receiveContacts\":{\"queryType\":\"IN\",\"value\":null},\"receivePhone\":{\"queryType\":\"IN\",\"value\":null},\"receiveProvince\":{\"queryType\":\"IN\",\"value\":null},\"receiveProvinceValue\":{\"queryType\":\"IN\",\"value\":null},\"receiveCity\":{\"queryType\":\"IN\",\"value\":null},\"receiveCityValue\":{\"queryType\":\"IN\",\"value\":null},\"receiveCounty\":{\"queryType\":\"IN\",\"value\":null},\"receiveCountyValue\":{\"queryType\":\"IN\",\"value\":null},\"realAddress\":{\"queryType\":\"IN\",\"value\":null}},\"groupMap\":{},\"groups\":[],\"queryParams\":{}}",
                    "new_setting");
    

 4、查找并替换字符串

    // 输出查看源字符串和目标字符串
    lr_output_message("1_new_setting: %s",lr_eval_string("{new_setting}"));
    lr_output_message("purchOrderList: %s",lr_eval_string("{purchOrderList}"));

    //    用截取出的purchOrderList替换head
    lr_replace("new_setting", "head", lr_eval_string("{purchOrderList}"));

   // 输出替换后的字符串

    lr_output_message("2_new_setting: %s",lr_eval_string("{new_setting}"));

5、查看替换结果


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
author-avatar
罗文彬2502852027
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有