亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號