您好,登錄后才能下訂單哦!
這篇文章主要介紹“python單鏈路性能測試實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“python單鏈路性能測試實例分析”文章能幫助大家解決問題。
場景就是老師登錄,首先會請求一個知識點列表,然后通過知識點屬性篩選推薦課程列表,在對課程列表中的數據進行收藏和取消收藏,在獲取自己當前知識點下的課程列表(包含原創和收藏)。
本次依然采取固定線程的壓測模型,本人預估線程200左右,測試用戶600備用,列表頁保證2頁數據。
每個線程綁定一個用戶,然后用戶開始循環鏈路執行步驟,執行一次當做一次Q
。單次Q
包含9次HTTP
接口請求(放棄了Socket
接口,以后有需求再添加Socket
接口到鏈路中),其中3次修改操作,6次查詢操作。
具體的邏輯通過內部靜態類實現,然后多一個K
類,用來存儲每次獲取的知識點屬性,方便調用。由于接口請求方法都是用基礎數據類型和String
作為參數,所以調用時候會顯得有點啰嗦。但無傷大雅,腳本寫出來,本來就是用完就扔到倉庫里面,改天再用再優化。
package com.okayqa.composer.performance.resource1_4 import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSONObject import com.funtester.base.bean.AbstractBean import com.funtester.base.constaint.ThreadLimitTimesCount import com.funtester.frame.execute.Concurrent import com.funtester.httpclient.ClientManage import com.funtester.utils.ArgsUtil import com.okayqa.composer.base.OkayBase import com.okayqa.composer.function.Mirro import com.okayqa.composer.function.OKClass class 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 << new FunTester(it, times) } new Concurrent(tasks, "資源庫1.4登錄>查詢>收藏>取消收藏鏈路壓測").start() allOver() } private static class FunTester extends ThreadLimitTimesCount<Integer> { 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++ < 2) { JSONObject parse = JSON.parse(JSON.toJSONString(it)) int value = parse.getIntValue("minicourse_id") minis << 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.bean import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSONObject import com.funtester.frame.Save import com.funtester.frame.SourceCode import org.slf4j.Logger import org.slf4j.LoggerFactory import 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單鏈路性能測試實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。