python單鏈路性能測試實踐

    目錄

    引言

    在經歷過一些嘗試之后,覺得在當下得項目中運用鏈路壓測得能力,不等著其他人了。

    鏈路這個詞其實不如路徑通俗易懂,跟產品溝通這個比較有效率。具體得操作路徑,產品會給一份出來,但是這都是基于UI和產品思維得文檔,跟接口測試區別還是很大得,只能提供參考依據。

    需要端上測試協作,有些業務細節還得端上測試同學幫忙補充一下。還需要運維同事幫忙理一下各個接口得請求量比例,這次得比例我是依據靈光一現寫出來,然后大家一起調整得。

    本次由于比較初級,所以這塊文檔就不寫出來了,放一個圖來表達一下這個鏈路做了些什么,PS:我現在很喜歡用圖而不是文字,溝通效率太高了。推薦工具draw.io,感興趣得可以參考文末得熱文中兩張架構圖中得介紹。

    資源庫1.4鏈路壓測方案

    這次把登錄剔除了,因為太慢了,對測試結果影響比較大。

    場景思路

    場景

    場景就是老師登錄,首先會請求一個知識點列表,然后通過知識點屬性篩選推薦課程列表,在對課程列表中得數據進行收藏和取消收藏,在獲取自己當前知識點下得課程列表(包含原創和收藏)。

    思路

    本次依然采取固定線程得壓測模型,本人預估線程200左右,測試用戶600備用,列表頁保證2頁數據。

    每個線程綁定一個用戶,然后用戶開始循環鏈路執行步驟,執行一次當做一次Q。單次Q包含9HTTP接口請求(放棄了Socket接口,以后有需求再添加Socket接口到鏈路中),其中3次修改操作,6次查詢操作。

    具體得邏輯通過內部靜態類實現,然后多一個K類,用來存儲每次獲取得知識點屬性,方便調用。由于接口請求方法都是用基礎數據類型和String作為參數,所以調用時候會顯得有點啰嗦。但無傷大雅,寫出來,本來就是用完就扔到倉庫里面,改天再用再優化。

    Demo實現

    package?com.okayqa.composer.performance.resource1_4import?com.alibaba.fastjson.JSONimport?com.alibaba.fastjson.JSONObjectimport?com.funtester.base.bean.AbstractBeanimport?com.funtester.base.constaint.ThreadLimitTimesCountimport?com.funtester.frame.execute.Concurrentimport?com.funtester.httpclient.ClientManageimport?com.funtester.utils.ArgsUtilimport?com.okayqa.composer.base.OkayBaseimport?com.okayqa.composer.function.Mirroimport?com.okayqa.composer.function.OKClassclass?Login_collect_uncollect?extends?OkayBase?{????public?static?void?main(String[]?args)?{????????ClientManage.init(10,?5,?0,?"",?0)????????def?util?=?new?ArgsUtil(args)????????def?thread?=?util.getIntOrdefault(0,?30)????????def?times?=?util.getIntOrdefault(1,?40)????????def?tasks?=?[]????????thread.times?{????????????tasks?&lt;&lt;?new?FunTester(it,?times)????????}????????new?Concurrent(tasks,?"資源庫1.4登錄&gt;查詢&gt;收藏&gt;取消收藏鏈路壓測").start()????????allOver()????}????private?static?class?FunTester?extends?ThreadLimitTimesCount&lt;Integer&gt;?{????????OkayBase?base????????def?mirro????????def?clazz????????FunTester(Integer?integer,?int?times)?{????????????super(integer,?times,?null)????????}????????@Override????????void?before()?{????????????super.before()????????????base?=?getBase(t)????????????mirro?=?new?Mirro(base)????????????clazz?=?new?OKClass(base)????????}????????@Override????????protected?void?doing()?throws?Exception?{????????????????????def?klist?=?mirro.getKList()</code><code>????????????mirro.getKList()????????????def?karray?=?klist.getJSONArray("data")????????????K?ks????????????karray.each?{????????????????JSONObject?parse?=?JSON.parse(JSON.toJSONString(it))????????????????if?(ks?==?null)?{????????????????????def?level?=?parse.getIntValue("node_level")????????????????????def?type?=?parse.getIntValue("ktype")????????????????????def?id?=?parse.getIntValue("id")????????????????????ks?=?new?K(id,?type,?level)????????????????}????????????}????????????JSONObject?response?=?clazz.recommend(ks.id,?ks.type,?ks.level)</code><code>????????????clazz.recommend(ks.id,?ks.type,?ks.level)????????????clazz.recommend(ks.id,?ks.type,?ks.level)????????????def?minis?=?[]????????????int?i?=?0????????????response.getJSONArray("data").each?{????????????????if?(i++?&lt;?2)?{????????????????????JSONObject?parse?=?JSON.parse(JSON.toJSONString(it))????????????????????int?value?=?parse.getIntValue("minicourse_id")????????????????????minis?&lt;&lt;?value????????????????}????????????}????????????clazz.unCollect(random(minis))????????????mirro.getMiniCourseListV3(ks.id,?ks.type,?0,?ks.level)????????????mirro.getMiniCourseListV3(ks.id,?ks.type,?0,?ks.level)????????}????}????private?static?class?K?extends?AbstractBean?{????????int?id????????int?type????????int?level????????K(int?id,?int?type,?int?level)?{????????????this.id?=?id????????????this.type?=?type????????????this.level?=?level????????}????}}

    其中AbstractBean類是一個抽象類,用于一些bean得方法封裝,就是為了省事兒。

    package?com.funtester.base.beanimport?com.alibaba.fastjson.JSONimport?com.alibaba.fastjson.JSONObjectimport?com.funtester.frame.Saveimport?com.funtester.frame.SourceCodeimport?org.slf4j.Loggerimport?org.slf4j.LoggerFactoryimport?org.springframework.beans.BeanUtils/**?*?bean得基類?*/abstract?class?AbstractBean?{????static?final?Logger?logger?=?LoggerFactory.getLogger(AbstractBean.class)????/**?????*?將bean轉化為json,為了進行數據處理和打印?????*?????*?@return?????*/????JSONObject?toJson()?{????????JSONObject.parseObject(JSONObject.toJSONString(this))????}????/**?????*?文本形式保存?????*/????def?save()?{????????Save.saveJson(this.toJson(),?this.getClass().toString()?+?SourceCode.getMark());????}????/**?????*?控制臺打印,使用WARN記錄,以便查看?????*/????def?print()?{????????logger.warn(this.getClass().toString()?+?":"?+?this.toString());????}????def?initFrom(String?str)?{????????JSONObject.parseObject(str,?this.getClass())????}????def?initFrom(Object?str)?{????????initFrom(JSON.toJSONString(str))????}????def?copyFrom(AbstractBean?source)?{????????BeanUtils.copyProperties(source,?this)????}????def?copyTo(AbstractBean?target)?{????????BeanUtils.copyProperties(this,?target)????}????/**?????*?這里bean得屬性必需是可以訪問得,不然會返回空json串?????*?@return?????*/????@Override????String?toString()?{????????JSONObject.toJSONString(this)????}????@Override????protected?Object?clone()?{????????initFrom(this)????}}

    控制臺輸出

    ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~
    >  {
    >  ① . "rt":1665,
    >  ① . "total":1188,
    >  ① . "qps":18.018,
    >  ① . "failRate":0.0,
    >  ① . "threads":30,
    >  ① . "startTime":"2021-02-24 16:57:23",
    >  ① . "endTime":"2021-02-24 16:58:34",
    >  ① . "errorRate":1.01,
    >  ① . "executeTotal":1188,
    >  ① . "mark":"資源庫1.4登錄>查詢>收藏>取消收藏鏈路壓測241657",
    >  ① . "table":"eJzj5VLAD15sbXm2a8LTXZMN9Uyez9z9dO9Uu2fzl75Yv8ju2ZRtL6b32z3tn/ZsWweE83Lyvhfb1z/t6362tZvT2EChJKMoNaWYgA0KvFy8+F0RlFpckJ9XnKoQkpmbaqVQoVucWpSZmKOQV5qro1Cpm5uakpmYR8gOQq5QyM3MU4AYZWVhYqmQW6yTm1hhZWxoaQxkE9RNjA2UgEfTOoBo1JZRW2hmRSsQ0ccmsBW0tgnVQzS1DatVtLMRn3W0sPXRtCYgAlLtQITXWura/mhaMxCRYC+VXUGyv2nhmkfTGoGI0rCgrsseTWsBImLSIZ1dCA8sOjmMXNfCU9ZAupNYV8MdC4106qdA2vkAniAGq6OJ8AlVi6GB99FgSvTU8BU8egaBg6jsO3iWHwSuoZUPB4EzRn046sNRHw68M0Z9OOrDEe5DABkr1eo="
    >  }
    ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~

    以上就是python單鏈路性能測試實踐得詳細內容,更多關于python單鏈路性能測試得資料請關注之家其它相關內容!

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論1 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 国产精品成人一区二区| 麻豆果冻传媒2021精品传媒一区下载 | 久久久国产精品无码一区二区三区| 伊人久久大香线蕉AV一区二区| 51视频国产精品一区二区| 无码人妻av一区二区三区蜜臀 | 国产一区二区三区不卡AV| 亚洲色偷精品一区二区三区| 国产成人无码一区二区三区在线 | 久久久久一区二区三区| 国产成人久久精品麻豆一区| 亚洲国产成人久久综合一区77| 波多野结衣精品一区二区三区| 男人的天堂亚洲一区二区三区 | 91一区二区三区| 亚洲午夜电影一区二区三区| 韩国女主播一区二区| 在线欧美精品一区二区三区| 亚洲丶国产丶欧美一区二区三区| 亚洲色偷精品一区二区三区| 波多野结衣高清一区二区三区| 日韩精品中文字幕视频一区| 精品一区高潮喷吹在线播放| 无码av免费一区二区三区试看 | 精品久久一区二区| 国产日韩精品一区二区三区在线| 亚洲一区无码精品色| 香蕉视频一区二区三区| 国产精品亚洲一区二区三区在线| 中日韩一区二区三区| 国产AV一区二区三区传媒| 亚洲一区中文字幕在线电影网 | 国产精品无码一区二区三级| 亚洲国产成人一区二区三区| 99久久无码一区人妻a黑| 国产日韩综合一区二区性色AV| 国产熟女一区二区三区四区五区| 久久久国产精品一区二区18禁| 国产精品无码亚洲一区二区三区| 国产在线一区二区杨幂| 国产色综合一区二区三区|