最近项目待压测的服务端协议使用的是java的Netty框架开发,而传输的业务数据使用了google protobuf进行序列化,然后通过tcp数据流与客户端通讯。这一次的压测脚本决定使用LR的java脚本来写,一直以来LR中使用java写脚本使用的并不多,但现在公司项目主要使用的是java语言,所以也打算保持技术的一致性,测试相关的也尽量使用java了。

  找了些LR下写的java压测脚本的例子,然后自己使用基本的java io API实现了Demo,看起来貌似并不复杂,然而与服务端进行调试时并没有调试通,服务端解析客户端发送过的数据时失败,未识别客户端的数据。可以确定的是服务端的功能是正常的,并且服务端与android客户端是已经调试通过的,不过andriod客户端也使用了Netty框架来处理协议相关的,反复检查了使用基本的java io实现的客户端demo代码后确定是没有问题的,那么为啥就不通呢?

  首先想到的是了解下netty相关的原理,netty框架大概是如何实现的,使用的是什么底层API等?不过这都需要一点时间的,直接发代码给服务端开发人员询问下遇到的问题,开发人员虽然没有马上找出问题的原因,不过猜测可能是根tcp数据传输过程中的粘包/拆包有关,服务端netty会进行粘包处理。。。 大概知道了可能的原因后,花了些时间看了下netty相关的教程及博客对于粘包相关的,netty服务端对于protobuf数据使用了ProtobufVarint32FrameDecoder方式进行解码,也即是通过头部字段来获得整个传输业务数据的长度,然后接收对应字节的数据流进行解析,而且头部使用的是一种不同于java的int类型的一种特殊类型varint,具体相关的数据编解码可以查阅相关博客教程。因为相关的编解码处理都是有netty框架来完成的,业务代码只需要指定一种编解码方式即可,所以这里隐藏的编解码处理在一开始如果不熟悉netty框架的话是未知的,导致按常规的处理流程就导致错误了, 那么很显然遇到服务端解析失败的原因是因为客户端发送的数据没有进行相关的编码处理,而服务端正常进行了解码处理导致的问题。

  需要解决的问题即是按netty的ProtobufVarint32FrameDecoder编码方式对发送的数据做同样的处理,通过原理自己写编解码的方法固然是可以的,如果考虑其通用性应该也是稍有点麻烦的,有开发同事提供了更好的办法,那就是google protobuf的jar包中已经提供了相对的API来处理这种编解码,使用之调试便成功了。

  之后将协议相关的封装在java的jar中,提供给LR进行调用,其间还遇到一些LR和java包版本相关的问题,由于LR11只支持到java6,版本已经比较低了,建议以后写LR调用的java类时,java代码在LR相同的机器上使用相同版本的java进行编写调试打包,这样可以避免很多版本方面的问题。基于本次脚本开发调试过程中遇到的问题,总结一些注意事项:

  1)LR的java脚本中调用的jar包导入时:除了自定义类方法所在的jar包外,该jar包依赖的jar包也同样需要导入到LR中,如本次调用的jar用到了google protobuf,那google的protobuf-java-2.4.1.jar包也同样需要导入到LR中

  2)mac机器上写的java代码源文件拷贝到windows上后编译时会有编码问题 (导致java错误:需要为class interface或enum),原因是windows奇葩的BOM文本编码导致的。在windows上新建文件然后拷贝代码的方式可以解决。

  3)使用maven编译时竟然遇到由于机器开启了VPNFQ,有很多的需要下载的相关插件依赖包等下载过程中卡不一直不动了,关掉FQ的VPN才正常的。

  4)本次LR java压力测试脚本开发环境的配套版本:

    操作系统: windows8 X64
    loadrunner: LR11.00.0.0
    maven: 3.0.5
    java:1.6.0_45
    google protobuf: 2.4.1

LR之Java Vuser II的更多相关文章

  1. LR之Java Vuser

    虽然LR对C有较好的支持,但有时使用Java Vuser会更方便,以下描述通过LR来编写Java脚本以及调用jar包的基本步骤. 1.安装配置java环境  LR的java vuser脚本的执行依赖于 ...

  2. LR接口测试---Java Vuser之增删改查

    import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  3. LR接口测试---Java Vuser之jdbc查询(调试前)

    在eclipse下编写好的代码: import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import ...

  4. loadrunner之Java Vuser协议脚本编写

    步骤:1.根据自己使用的lr版面选择jdk 1)LR11   1.6   32位 2)LR12   1.7   32位 2.安装好jdk,并搭建java环境变量,安装好java代码编写工具 3.在sr ...

  5. loadrunner11中java vuser引用jar包

    1.创建工程,新建类,HelloWorld.java,代码如下: package com.liuke; public class HelloWorld { public String getHello ...

  6. 【原创】LoadRunner Java Vuser开发环境配置指南

    1 编写目的 本文主要介绍Java运行环境的配置,同时通过编写HelloWorld程序,讲解在LoadRunner下如何开发简单的Java Vuser脚本.关于Java语言的深入学习,大家可以参考其他 ...

  7. LR使用Java User协议环境报错Please add the <JDK>\bin to the path and try again

    看标题报错信息就知道,这是java编译及运行环境配置问题,运行LR脚本时,LR代理找不到java的JDK环境,当然,可能有人会遇到说,我在cmd窗口javac 环境是没问题的呀,是的,这就要看你的jd ...

  8. LoadRunner JAVA Vuser接口测试

    注:JDK只支持1.6 1.创建工程Test2.写个经典的HelloWorld类.3.Runas--->Java Application运行下4.将工程下的整个com包拷贝到loadrunner ...

  9. LoadRunner系列之—-03 用Java Vuser协议编写接口测试脚本

    待测试接口用java语言实现,且项目中调用该接口需要用专门的jar包.这种情况可以用Java Vuser协议实现接口调用脚本,类似java代码. 代码样例如下: /* * LoadRunner Jav ...

随机推荐

  1. 一个没有成就而即将退赛的OIer的告别书

    期末考试成绩出来了. 我也知道混在这个班的时间不长了. 尽管如此,我觉得父母的意见是正确的,我确实不适合OI.所以我会成为省三都没有的一个OIer. 我不后悔,因为曾经是我自己错了. 我感谢遇到了好的 ...

  2. 大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理

    实验:动态分区式存储管理 实验内容: 编写程序模拟完成动态分区存储管理方式的内存分配和回收.实验具体包括:首先确定内存空闲分配表:然后采用最佳适应算法完成内存空间的分配和回收:最后编写主函数对所做工作 ...

  3. ubuntu下tensorflow安装

    1,安装驱动,cuda,cudnn,参考本人上一篇博客http://www.cnblogs.com/zxg-DL/p/9023601.html 2,安装tensorflow   接下来是关于Tenso ...

  4. 20155220 实验一《Java开发环境的熟悉》实验报告

    实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JVM.JRE.JDK的安装位置与区 ...

  5. 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验一

    20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验一 此次实验我和黄月同学一起做了1.2.3.5项,第4项在实验课上做完了,但是没有按时提交. ...

  6. 20145209 2016-2017-2 《Java程序设计》课堂实践内容

    20145209 2016-2017-2 <Java程序设计>课堂实践内容 一.递归 题目详情: public class TestArgs{ public static void mai ...

  7. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用

    很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...

  8. mac php版本切换

    mac os 中自带php版本,但是很多扩展是不带的. 这个网站: http://php-osx.liip.ch/提供了几乎所有的php版本 通过输入 curl -s http://php-osx.l ...

  9. Elasticsearch5.x版本中对Text类型进行聚合时提示illegal_argument_exception

    Having this field in my mapping "answer": { "type": "text", "fiel ...

  10. docker error:/root/.docker/config.json: is a directory

    问题: 本地没有taskworker镜像,docker从远端拉取,但是拉取时需要读取config.json配置,解析配置时,发现config.json是个目录,错误信息如下: taskworker_1 ...