为了将AWS Lambda Serverless API进行压力测试,我将JMeter用作代码(对于Java Maven项目,使用编程方法而不是GUI)。
我已经制定了一个测试计划,线程组,HTTPSamplerProxy等...
对API的调用可以完美执行,但并非如此,例如我已经添加到HTTP Sampler中的DurationAssertion。
我还为输出设置了一个CSV文件,执行后我看到一切正常(状态码200 ..),但是由于它超出了我配置的DurationAssertion,因此测试应该失败(除了其他断言测试元素)。
我认为也许我必须在DurationAssertion对象中设置“ enabled” = true,但没有任何效果。.此外,我尝试以这种方式访问JMeter Context:
JMeterContextService.getContext().getPreviousResult()
我希望上面的代码能够检索SampleResult(具有AssertionResult集合),但是SampleResult为null。
一个带有测试元素的测试计划(在这种情况下为DurationAssertion)没有对这些断言的结果进行各自的分析是没有道理的。我想在每次调用中看到超过特定阈值的失败消息。 d。使用JMeter GUI,我将添加一个ViewResultTree,该视图将显示一个Sampler Result视图,其中包含请求,响应和关联的测试断言的详细信息。而且除了断言结果(每个请求)之外,我还想查看请求有效负载,完整响应和标头。。但是在编程模式下(不使用GUI)。
因此,如果有人能通过代码给我一些有关如何实现此目标的提示,我将深表感谢。
更新1 :我与整个源代码共享一个github代码段,例如UBIK LOAD PACK用户向我建议:
https://gist.github.com/svillarreal/5eb90a66b8972633b95c249abb3566da
更新2 :Inspection of context object (evaluated after JMeter engine finished run) - All null inside
更新3
i)我最近找到了一个jmeter.properties文件,在其中配置了以下属性:
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.assertion_results=all
现在,以XML而不是CSV的输出至少显示了已发送的请求有效负载和响应数据,这对于分析错误情况非常有用。
ii)我在JMeterEngine执行内进行了JMeterContextService.getContext()的检查,而不是在运行完成之后进行了检查,然后我意识到每个线程组都有一个上下文,并且在其运行期间此对象已满,因此现在清楚为什么在 UPDATE 2 中所有属性都为空。.
最诚挚的问候和感谢!
答案 0 :(得分:0)
当您的方法无法使用时,我可以考虑至少一个用例:JMeter根本没有收到服务器的响应。
例如,如果您的服务器超载,则可能是JMeter永远都不会获得响应,因此如果SampleResult为null,则您的Duration Assertion将不会简单地用作PostProcessors, Listeners and Assertions are not fired。
因此,为了安全起见,我建议对您的HTTP请求采样器应用connect和response超时
HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
httpSampler.setConnectTimeout("3000");
httpSampler.setResponseTimeout("3000");
//etc.
如果“测试计划”中有1个以上的HTTP请求采样器,则可以使用HTTP Request Defaults而不是单独设置超时。
答案 1 :(得分:0)
最后我可以解决这个问题。问题是我错误地管理了传递给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片段的要点**非常感谢阅读本文并尝试进行协作的所有人。
最诚挚的问候,