热门标签 | 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、查看替换结果


推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • HTML中span元素为何会脱离li元素对齐?
    在HTML布局中,有时会遇到span元素未能与li元素保持对齐的问题。本文将探讨这一现象的原因,并提供解决方案。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 如何在PHP中获取数组中特定元素的索引位置
    在PHP中获取数组中特定元素的索引位置有多种方法。首先,可以使用 `array_search()` 函数,其语法为 `array_search(目标值, $array)`,该函数将返回匹配元素的第一个键名(即下标)。其次,也可以利用 `array_keys()` 函数,通过 `array_keys($array, 目标值)` 语法来获取所有匹配元素的键名列表。这两种方法都能有效解决数组元素定位的问题,具体选择取决于实际需求和性能考虑。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
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社区 版权所有