JMeter 作为代码断言未在测试结果中考虑

我使用 JMeter 作为代码(使用 Java Maven 项目的编程方法而不是 GUI),以便对 AWS Lambda Serverless API 进行压力测试。


我已经制定了测试计划、线程组、HTTPSamplerProxy 等等...


对 API 调用的执行工作完美,但情况并非如此,例如我添加到 HTTP 采样器的 DurationAssertion ..


我还为输出设置了一个 CSV 文件,执行后我看到一切正常(状态代码 200 ..),但测试应该失败,因为它超过了我配置的 DurationAssertion(除了其他断言测试元素) )。


我想也许我必须在 DurationAssertion 对象中设置“启用”= true,但没有效果。此外,我尝试以这种方式访问 JMeter 上下文:


JMeterContextService.getContext().getPreviousResult()

我希望上面的代码检索一个 SampleResult(它有一个 AssertionResult 集合),但 SampleResult 为空..


带有测试元素(在本例中为 DurationAssertion)的测试计划没有对这些断言的结果进行相应的分析是没有意义的。在 JMeter GUI 中,我将添加一个 ViewResultTree,它显示一个 Sampler Result 视图,其中包含请求、响应和相关测试断言的详细信息。除了断言结果(每个请求)之外,我还想查看请求有效负载、完整响应、标头……但在编程模式下(不使用 GUI)。


因此,如果有人能给我一些关于如何通过代码实现这一目标的提示,我将不胜感激。


更新 1:我与整个源代码共享一个 github 片段,例如 UBIK LOAD PACK 用户建议我:


https://gist.github.com/svillarreal/5eb90a66b8972633b95c249abb3566da


更新 2:检查上下文对象(在 JMeter 引擎完成运行后评估) - 内部全部为 null


更新 3


i) 我最近发现了一个 jmeter.properties 文件,我在其中配置了以下属性:


    jmeter.save.saveservice.output_format=xml

    jmeter.save.saveservice.assertion_results=all

现在输出为 XML 而不是 CSV 至少显示了发送的请求有效负载和响应数据,这对于分析错误情况非常有用。


ii) 我在 JMeterEngine 执行中检查了 JMeterContextService.getContext(),而不是在它完成运行之后,然后我可以意识到每个线程组有一个上下文,并且在其运行期间这个对象已满,所以现在很清楚为什么更新 2所有属性都为空..


最好的问候和感谢!


青春有我
浏览 178回答 2
2回答

哔哔one

最后我可以解决这个问题。问题是我错误地管理了传递给 StandardJMeterEngine 的树。在 JMeter 中,一切都基于此树,就像在 GUI 中一样,我们应该注意元素在其层次结构中的定位方式。对库进行深入分析和调试,我对 JMeter 的工作原理有了更深入的了解,并且我了解到一切都是从 HashTree 开始管理的。因此,解决方案是将 DurationAssertion 和 ResponseAssertion 添加为 HTTPSamplerProxy 节点的子节点,而不是将它们作为 HTTPSamplerProxy 的测试元素。特别是,在执行后填充断言以检查的方法如下(这让我知道如何管理哈希树):&nbsp; &nbsp; // org.apache.jmeter.threads.TestCompiler&nbsp;&nbsp; &nbsp; private void saveSamplerConfigs(Sampler sam) {&nbsp; &nbsp; &nbsp; &nbsp; List<ConfigTestElement> configs = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; List<Controller> controllers = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; List<SampleListener> listeners = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; List<Timer> timers = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; List<Assertion> assertions = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; LinkedList<PostProcessor> posts = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; LinkedList<PreProcessor> pres = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; for (int i = stack.size(); i > 0; i--) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addDirectParentControllers(controllers, stack.get(i - 1));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<PreProcessor>&nbsp; tempPre = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<PostProcessor> tempPost = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<Assertion> tempAssertions = new LinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Object item : testTree.list(stack.subList(0, i))) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof ConfigTestElement) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; configs.add((ConfigTestElement) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof SampleListener) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeners.add((SampleListener) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof Timer) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timers.add((Timer) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof Assertion) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempAssertions.add((Assertion) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof PostProcessor) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempPost.add((PostProcessor) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item instanceof PreProcessor) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempPre.add((PreProcessor) item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertions.addAll(0, tempAssertions);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pres.addAll(0, tempPre);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posts.addAll(0, tempPost);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; SamplePackage pack = new SamplePackage(configs, listeners, timers, assertions,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posts, pres, controllers);&nbsp; &nbsp; &nbsp; &nbsp; pack.setSampler(sam);&nbsp; &nbsp; &nbsp; &nbsp; pack.setRunningVersion(true);&nbsp; &nbsp; &nbsp; &nbsp; samplerConfigMap.put(sam, pack);&nbsp; &nbsp; }我还必须激活以下属性:jmeter.save.saveservice.assertion_results_failure_message=true因此,现在我有我的 CSV 文件报告,其中包含在专用列中的断言结果消息。嗯,问题解决了。** 我已经用最终解决方案更新了 github 代码段要点 ** 非常感谢所有阅读这篇文章并尝试合作的人。最好的祝福,

互换的青春

当您的方法不起作用时,我可以考虑至少一个用例:JMeter 根本没有收到来自服务器的响应。例如,如果您的服务器过载,那么 JMeter 可能永远不会得到响应,因此您的持续时间断言将不会被应用为后处理器,监听器和断言不会被触发,因为 SampleResult 为空。因此,为了安全起见,我建议将连接和响应超时应用于您的 HTTP 请求采样器HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();httpSampler.setConnectTimeout("3000");httpSampler.setResponseTimeout("3000");//etc.如果您在测试计划中有 > 1 个 HTTP 请求采样器,那么使用HTTP 请求默认值而不是单独设置超时是有意义的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java