JMeter:使用哪个:CSV,数组或数组列表?

时间:2016-03-09 19:40:54

标签: jmeter

首先让我以1)开头,我不是开发人员,2)我只使用JMeter不到1个月。

我正在对我们的数据库执行API的基本CRUD测试。由于表约束,被测试表中的每个记录必须具有唯一的typeId和groupId,其中typeId / groupId组合在其他地方预定义。

我需要在基本的Create:

上执行以下操作

路径:/.../.../.../crud/QualificationExpression 方法:POST

{
    "id": null,
    "displayName": "crudTest: ${__Random(1,10000000, randomNumber)}",
    "functionName": null,
    "displayableSourceExpression": "TRUE",
    "clobObjId": null,
    "typeId": xxx,
    "groupId": yyy,
    "typeCode": null
}

我试图找出最佳方法:

  • CSV文件
  • 阵列
  • 数组列表

搜索论坛和其他在线资源时,当人们使用CSV时,他们通常会使用它来存储随机登录的用户名密码。这导致他们使用参数而不是Post Body。

Array示例似乎都包含一个列数组,它们从数组中提取随机值。但是,我有一对:如果typeId = x,那么objectId必须= y。

然后我看到一个阵列列表示例,我很困惑:

ArrayList listOfPairs = new ArrayList();
    ArrayList pair1 = new ArrayList();
       pair1.add(203);
       pair1.add(303);
       listOfPairs.add(pair1);
    ArrayList pair2 = new ArrayList();
       pair2.add(204);
       pair2.add(304);
       listOfPairs.add(pair2);
    ArrayList pair3 = new ArrayList();
       pair3.add(205);
       pair3.add(305);
       listOfPairs.add(pair3);

    for (int i = 0; i < listOfPairs.size(); i++) {
        ArrayList pair = (ArrayList)listOfPairs.get(i);
        System.out.println("pair:" + pair.get(0) + " " + pair.get(1));
    }

我的愿望是没有CSV文件,最好让测试计划.jmx独立,而不依赖于&#34;有效载荷&#34;文件存在。

我希望那些拥有更多经验和知识的人能够提供一些指导和见解。

2 个答案:

答案 0 :(得分:2)

您的要求几乎与this post中的要求相同。

当您一次又一次地发送相同的HTTP请求时 - 只需更改不同的参数,在您的情况下输入id和group id - 绝对使用CSV data set config是一个非常好的选择,如果是JDBC Request则是CREATE DEFINER=`dev-user`@`%` PROCEDURE `geospacial`(IN _lat double, IN _lng double, IN _distance double, IN _limit int) BEGIN set @radius = _distance; set @lng_min = _lng - @radius / abs(cos(radians(_lat)) * 111); set @lng_max = _lng + @radius / abs(cos(radians(_lat)) * 111); set @lat_min = _lat - (@radius / 111); set @lat_max = _lat + (@radius / 111); SELECT DISTINCT `project_id` FROM ( SELECT `project_id`, ROUND((6371 * ACOS(COS(RADIANS(_lat)) * COS(RADIANS(`lat`)) * COS(RADIANS(`long`) - RADIANS(_lng)) + SIN(RADIANS(_lat)) * SIN(RADIANS(`lat`)))), 2) AS distance FROM geodata WHERE (`long` BETWEEN @lng_min AND @lng_max) AND (`lat` BETWEEN @lat_min and @lat_max) ORDER BY CAST(distance as DECIMAL(10,5)) ASC ) as _geo ;END 在DB中。我不明白为什么你不喜欢CSV文件的方法。如果我是你,我会尝试将数据完全远离测试脚本。将来很容易维护。

让我们说你正在使用arraylist(为什么选择arraylist?你的意思是Map?)!突然之间,如果您需要为一组新的1000类型ID和组ID运行测试,您是否会更新脚本以在Array或Map中添加这些ID?如果使用CSV数据集配置,只需将文件路径更改为指向新CSV。就是这样。你很好!

不要通过包含beanshell /其他采样器来创建测试数据等来增加测试计划的复杂性。保持测试计划非常简单。 JMeter的工作应该很简单 - 发送请求并获得响应。它不应该花时间来创建测试数据。

答案 1 :(得分:2)

转到Functions,从性能角度来看,最好尽可能使用内置组件。

如果你:

  • 需要预先定义(非随机)typeIdgroupId组合 - 您需要将这些对保留在某处
  • 不需要外部文件 - 您需要将这些文件存储在测试计划中,即User Defined Variables
  • 需要typeIdgroupId对是唯一的 - 最明显的解决方案是使用当前虚拟用户号作为前缀或后缀,如:

      用户定义变量中的
    • User Defined Variables

    • 请求正文中的
    • 使用__threadNum()__V()函数组合,如:

      "typeId": "${__V(typeId_${__threadNum})}",
      "groupId": "${__V(groupId_${__threadNum})}",
      
  • 计划为多次迭代运行测试 - 使用__counter()函数作为额外的后缀

有关上述和其他JMeter功能的全面信息,请参阅How to Use JMeter Functions文章系列。