51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1081|回复: 1
打印 上一主题 下一主题

[原创] 获取loadrunner压测数据的方法

[复制链接]
  • TA的每日心情
    慵懒
    2021-3-13 18:26
  • 签到天数: 129 天

    连续签到: 1 天

    [LV.7]测试师长

    跳转到指定楼层
    1#
    发表于 2022-9-6 16:38:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近在做性能测试的经常是好几个场景需要压测,而且每次监控的服务器都有好几台,所以在编写性能测试报告的时候经常统计得头晕眼花的,于是我就想着要怎么去自动生成相应的统计数据。使用nmon工具还好说,官方自己有工具去生成统计好的文件,我们可以通过代码自己去读取文件来统计即可,但由于压测使用的工具loadrunner(以下简称lr),其生成的报告没法直接导出数据,要么就是一个图表一个图表的导,这样更为麻烦。
    为了解决这个问题,我花了很长的时间去网上查找资料,但因为这个工具在国内的资料太少,即使国外的网站也很难得到相关的内容,所以查来查去也没得到什么收获。于是乎,我开始自己去找到相关的数据文件。还别说,这还真让我找到相关的数据文件,其是一个Access数据库文件,而且还是一个不加密数据库文件(还算有点良心···),可通过相应的读取工具,即可读取其中的内容。
    下面我将说明下该文件的读取,需要声明的是,读取文件仅仅只是我的一种思路,如各位大神有更好的方法,还请勿喷。
    1 数据表查看
    首先我们需要进入lr导出的测试报告文件夹中,例如,我导出了一个叫“基准测试”的lr性能测试报告,打开报告文件夹,我们就可以找到以文件夹名称命名的“.mdb”文件
    通过网上查找该后缀的资料便可知道,这是Access数据库的数据文件,我们可通过相应的数据库工具将其打开,这里我使用DBeaver工具。打开数据库后,我们翻看表结构,可以看出,其数据库是由一些以固定英文命名的表还有一些以“T”开头和结尾,中间为随机数字的表,不过不用担心,因为你猜得没错,我们要的数据就在这些随机数字命名的表中^_^
    这个库里面固定命名的表我都翻了个遍,除了压测时间可能会用到外,可能真的就没什么有用的信息了···估计这也是lr官方想做封闭报告的一种手段吧,起初我以为报告里面的某些文件记录相关的表读取的配置文件,但直到我翻遍的所有的文件以后,我才发现,是我想多了···无奈,还是得从表下手(也可能就是我找不到)。
    当然,我既然敢写,自然是有读取的方法的。首先根据数字去推断表中的内容,我个人认为不太现实,反正我是没找到其中的规律,由于缺少资料和实验对象(关键是我也懒得将所有的报告一个个翻出来,对比生成的表顺序是不是固定的),所以只能从表中的内容下手。以获取时间为例,通过翻看每一个表,我找到了目标表
    我也将该表与其他的表进行了对比,发现该表的特征还是比较明显的,只要包含“Response_Time”字段的,就可以确定该表存放的数据是响应时间数据了。
    有了这个前提条件,那么读取就方便了,即使我不知道表是怎么命名的,但只要我认准了“Response_Time”字段,那么该表就是响应时间表。下面,就可以到最后的写代码分析的环节了。
    ⚠️需要注意一点,在数据库中,同样数据的表可能不止一张,例如响应时间的表,我在翻看所有表的时候就发现三、四张,数据都是一样的,所以我们只要读取到其中一张表即可
    2 代码读取压测内容
    这里我使用的java语言,其他语言请自行查找对应的读取方式。由于需要读取的是Access数据,故需要在pom文件中添加如下依赖:
    <dependency>
      <groupId>net.sf.ucanaccess</groupId>
      <artifactId>ucanaccess</artifactId>
      <version>5.0.1</version>
    </dependency>
    XML

    有了读取工具后,我们便可以编写相应JDBC代码了,当然,这里我使用的是我自己编写的“autest”工具,有需要的也可导入下面依赖:
    <dependency>
      <groupId>com.gitee.pyqone</groupId>
      <artifactId>autest</artifactId>
      <version>3.6.0</version>
    </dependency>
    XML

    工具一直在更新,欢迎大家来使用,也欢迎各位有兴趣的小伙伴一起来探讨~咳咳咳,扯远了,我为了简化代码,所以就使用了自己写的工具,使用JDBC原装的代码,同样是能实现相同的效果。
    同样以响应时间表举例,根据在第一节中我们的思路,只要包含“Response_Time”字段的,我们就可以认为是响应时间表,那么我们首先要做的,就是获取库中的所有以“T”开头和结尾的表:
    // 连接数据库,假设数据库在“D:\\基准测试\\基准测试.mdb”下
    SqlAction sql = newSqlAction(DataBaseType.ACCESS, "", "", "D:\\基准测试\\基准测试.mdb", "");
    // 获取数据库中的所有表,并筛选出正则为“T.+T”的表,即以T开头和结尾的表
    List<String> tableNameList = sql.getAllTableName().stream().filter(name ->name.matches("T.+T"))
            .collect(Collectors.toList());
    Java

    获取到所有的表后,我们再对表进行一次筛选,找到包含“Response_Time”字段的目标表
    StringresponseTimeTableName= "";
    // 遍历表名集合
    for (String tableName : tableNameList) {
        // 获取当前表中的所有字段
        List<String> fieldNameList = sql.getTableAllFieldName(tableName);
        // 若字段集合包含“Response_Time”则结束遍历
        if(fieldNameList.contains("Response_Time")){
            responseTimeTableName = tableName;
            break;
        }
    }
    Java

    通过以上代码,我们便得到响应时间的表名,之后我们在通过“select Response_Time from 表名”,执行该段sql语句,便可得到相应的响应时间数据了
    StringsqlText = "select %s from %s";
    List<Double> reponseTimeList = sql.run(String.format(sqlText, "Response_Time",responseTimeTableName))
          .getAllResult().getFirstColumn().stream().map(Optional::get).map(Double::valueOf)
          .collect(Collectors.toList());
    Java

    在得到数据集合后,我们便可通过代码自己算出最大、最小与平均值,并自行生成相应的文件,这样便可达到让电脑帮我们读取和分析数据的效果。
    3 结语
    以上便是我对获取lr数据的一些思路,可能我的方法不是完美的,但这个方法至少可行。我主要也是想告诉大家lr生成的报告数据并非封闭的,我们是可以自己去读取的,无论方法的好坏,只要能达到自己想要的结果即可,至少这样我们可以批量处理测试报告,而不是自己一个个打开,这样不仅效率低,还容易出错。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 03:08 , Processed in 0.066422 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表