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 請求默認值而不是單獨設置超時是有意義的。
添加回答
舉報