为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2021-12-10 16:59:06
我使用 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更新 3i) 我最近发现了一个 jmeter.properties 文件,我在其中配置了以下属性:    jmeter.save.saveservice.output_format=xml    jmeter.save.saveservice.assertion_results=all现在输出为 XML 而不是 CSV 至少显示了发送的请求有效负载和响应数据,这对于分析错误情况非常有用。ii) 我在 JMeterEngine 执行中检查了 JMeterContextService.getContext(),而不是在它完成运行之后,然后我可以意识到每个线程组有一个上下文,并且在其运行期间这个对象已满,所以现在很清楚为什么更新 2所有属性都为空..最好的问候和感谢!
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

最后我可以解决这个问题。问题是我错误地管理了传递给 StandardJMeterEngine 的树。


在 JMeter 中,一切都基于此树,就像在 GUI 中一样,我们应该注意元素在其层次结构中的定位方式。


对库进行深入分析和调试,我对 JMeter 的工作原理有了更深入的了解,并且我了解到一切都是从 HashTree 开始管理的。因此,解决方案是将 DurationAssertion 和 ResponseAssertion 添加为 HTTPSamplerProxy 节点的子节点,而不是将它们作为 HTTPSamplerProxy 的测试元素。


特别是,在执行后填充断言以检查的方法如下(这让我知道如何管理哈希树):


    // org.apache.jmeter.threads.TestCompiler 


    private void saveSamplerConfigs(Sampler sam) {

        List<ConfigTestElement> configs = new LinkedList<>();

        List<Controller> controllers = new LinkedList<>();

        List<SampleListener> listeners = new LinkedList<>();

        List<Timer> timers = new LinkedList<>();

        List<Assertion> assertions = new LinkedList<>();

        LinkedList<PostProcessor> posts = new LinkedList<>();

        LinkedList<PreProcessor> pres = new LinkedList<>();

        for (int i = stack.size(); i > 0; i--) {

            addDirectParentControllers(controllers, stack.get(i - 1));

            List<PreProcessor>  tempPre = new LinkedList<>();

            List<PostProcessor> tempPost = new LinkedList<>();

            List<Assertion> tempAssertions = new LinkedList<>();

            for (Object item : testTree.list(stack.subList(0, i))) {

                if (item instanceof ConfigTestElement) {

                    configs.add((ConfigTestElement) item);

                }

                if (item instanceof SampleListener) {

                    listeners.add((SampleListener) item);

                }

                if (item instanceof Timer) {

                    timers.add((Timer) item);

                }

                if (item instanceof Assertion) {

                    tempAssertions.add((Assertion) item);

                }

                if (item instanceof PostProcessor) {

                    tempPost.add((PostProcessor) item);

                }

                if (item instanceof PreProcessor) {

                    tempPre.add((PreProcessor) item);

                }

            }

            assertions.addAll(0, tempAssertions);

            pres.addAll(0, tempPre);

            posts.addAll(0, tempPost);

        }


        SamplePackage pack = new SamplePackage(configs, listeners, timers, assertions,

                posts, pres, controllers);

        pack.setSampler(sam);

        pack.setRunningVersion(true);

        samplerConfigMap.put(sam, pack);

    }

我还必须激活以下属性:


jmeter.save.saveservice.assertion_results_failure_message=true

因此,现在我有我的 CSV 文件报告,其中包含在专用列中的断言结果消息。


嗯,问题解决了。** 我已经用最终解决方案更新了 github 代码段要点 ** 非常感谢所有阅读这篇文章并尝试合作的人。


最好的祝福,


查看完整回答
反对 回复 2021-12-10
?
互换的青春

TA贡献1797条经验 获得超6个赞

当您的方法不起作用时,我可以考虑至少一个用例:JMeter 根本没有收到来自服务器的响应。


例如,如果您的服务器过载,那么 JMeter 可能永远不会得到响应,因此您的持续时间断言将不会被应用为后处理器,监听器和断言不会被触发,因为 SampleResult 为空。


因此,为了安全起见,我建议将连接和响应超时应用于您的 HTTP 请求采样器


HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();

httpSampler.setConnectTimeout("3000");

httpSampler.setResponseTimeout("3000");

//etc.

如果您在测试计划中有 > 1 个 HTTP 请求采样器,那么使用HTTP 请求默认值而不是单独设置超时是有意义的。


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信