【问题标题】:How to match a list of values from Database1 with a column in Database2 using JDBC Request in JMeter?如何使用 JMeter 中的 JDBC 请求将 Database1 中的值列表与 Database2 中的列进行匹配?
【发布时间】:2019-02-15 17:47:59
【问题描述】:

我对 JMeter 很陌生,所以我正在寻找最好的方法来做到这一点:我想从 Database1 中获取 messageID 的列表,然后检查这些 messageID 值是否会在 Database2 中找到,然后检查 ErrorMessage 列因为这些 ID 违背了我的预期。

我有用于从 Database1 中提取 messageID 列表的 JDBC 请求。 JMeter 将列表返回给我,但现在我被卡住了。我不确定如何处理 JDBC 请求中的变量名和结果变量名字段,并在下一个吞吐量控制器循环中为 Database2 的 JDBC 请求使用它。

我的 JDBC 请求如下所示(PostgreSQL):

 SELECT messageID FROM database1

 ORDER BY created DESC

 FETCH FIRST 20 ROWS ONLY

变量名:messageid 结果变量名:resultDB1

然后我使用 BeanShell 断言来查看与数据库的连接是否存在,或者响应是否为空。

但是现在,我必须连接到不同的数据库,所以我需要创建一个新的吞吐量控制器,其中包含新的 JDBC 配置、请求等,但我不知道如何将 messageid 列表传递给这个新要求。

我的想法是将 Database1 中的结果列表写入一个文件,然后从该文件中读取 Database2 的值,但这对我来说似乎不必要地复杂,就像 JMeter 中应该已经有一个解决方案一样。另外,我正在远程 linux 服务器上运行我的 JMeter 测试,所以我不想通过制作新文件并将它们保存在某个地方来使其变得更加复杂。

【问题讨论】:

  • 我认为您在这里将“数据库”与“表”混淆了。 from 后面不能有数据库名,只能有表名

标签: postgresql jdbc jmeter


【解决方案1】:

您可以将 resultDB1 转换为 JMeter 属性,例如:

props.put("resultDB1", vars.getObject("resultDB1"));

根据JMeter Documentation

属性与变量不同。变量是线程本地的;属性对所有线程都是通用的

所以基本上 JMeter 属性是 Java Properties 的一个子集,它们对于整个 JVM 来说都是全局的

完成后,您将能够访问其他 Thread Groups 中的值,例如:

ArrayList resultDB1 = (ArrayList)props.get("resultDB1");
ArrayList resultDB2 = (ArrayList)vars.getObject("resultDB2");
//your code to compare 2 result sets here

还要注意since JMeter 3.1 you should be using JSR223 Test Elements and Groovy language for scripting,因此请考虑在下次有机会时迁移到JSR223 Assertion

【讨论】:

  • 感谢您的回答!我尝试使用您建议的代码将 JSR223 PostProcessor 放在第一个吞吐量控制器中,然后在第二个吞吐量控制器循环中使用它来检查下一个数据库。但是,运行脚本后,现在 PSQL 请求如下所示: [Select Statement] select * from database1.table where messageid like '[{messageid=1234567}]';虽然它应该只是 1234567 而前面没有'messageid ='。我将结果作为对象存储在 JDBC 请求中。如果我将它存储为字符串,它也不起作用。我做错了什么?
猜你喜欢
  • 2011-09-14
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多