2 回答
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 代码段要点 ** 非常感谢所有阅读这篇文章并尝试合作的人。
最好的祝福,
TA贡献1797条经验 获得超6个赞
当您的方法不起作用时,我可以考虑至少一个用例:JMeter 根本没有收到来自服务器的响应。
例如,如果您的服务器过载,那么 JMeter 可能永远不会得到响应,因此您的持续时间断言将不会被应用为后处理器,监听器和断言不会被触发,因为 SampleResult 为空。
因此,为了安全起见,我建议将连接和响应超时应用于您的 HTTP 请求采样器
HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
httpSampler.setConnectTimeout("3000");
httpSampler.setResponseTimeout("3000");
//etc.
如果您在测试计划中有 > 1 个 HTTP 请求采样器,那么使用HTTP 请求默认值而不是单独设置超时是有意义的。
添加回答
举报