測試平臺系列(37) 運用裝飾器給用例加上執行日誌
測試平臺系列(37) 運用裝飾器給用例加上執行日誌
大家好,這裡是
米洛
,一個想和大家一起分享測試開發相關的技術,面試經驗和成長經歷的博主!
歡迎大家關注我的公眾號: 測試開發坑貨
。
回顧
上一節成功把全域性變數運用到了用例之中,後續我們的目標就是要完善執行用例的過程
,暫時我們還是單介面+簡單斷言的經驗寶寶,後面我們慢慢成長。
一點想法
其實React挺多觀眾還是不太熟悉的,後續如果我給同事培訓的話,可能會分享一些學習React的資料。後續這個教程就不太講前端部分了,應該大部分人都沒啥興趣
。不過我會大概展示一下最新的頁面效果。
前端優化展示
把基礎部分,headers,body拆出來分3個tab展示。
有用到全域性變數的地方,會拉取出全域性變數,並能看到對應的值。這個選項也可以收起來。
開始本節旅程
看標題就可以知道我們本節要做啥子了。關於用例執行的日誌,想起我在上家單位是類似這樣的做法:
self.logger.append("正在替換全域性變數: {}".format(xxx))
在一個用例的執行過程中,可以看到非常多
這樣的語句。那我們有沒有更好的辦法呢?
答案是有的。我們可以用裝飾器
去完成這個操作,在方法執行之前記錄日誌,執行之後繼續記錄日誌,最終彙總到測試報告
中。
初步設想
編寫一個case_log的裝飾器,給安排到Executor的每個方法上面,並在每個方法執行之前輸出日誌就好了。
實際操作
首先,我們回憶一下之前的Executor類。
當時是把Executor中的方法都設定為了staticmethod
,也就是說裡面的方法/變數都是通過類
來訪問的。
那這樣就導致了一個很麻煩的問題,我們的日誌資料,存到哪裡呢?因為是類方法,所以要知道裝飾器接受的引數是不帶有self或者cls的
。
有的同學會輕蔑一笑: "你在Executor類裡面加一個logger的變數,存放日誌不就好了?"
那樣是不行的,因為Executor是面向所有使用者的,一旦有多個使用者在執行用例,那你的logger不就錯亂了?簡單的說就是這個方法不支援併發
。
我們在實際開發的時候一定要考慮到,你不是一個人在用這個系統。那我們改造其實很簡單,把方法都設為例項方法
著手改造Executor
- 新增__init__()方法
這個_logger是專門存放日誌資料的。
- 改造Executor下的方法
就像這樣,去掉@staticmethod的裝飾器,把Executor.xxx都換成self.xxx。
這樣就解決了併發的問題,因為我每個執行緒擁有的例項是獨立的,並不像class一樣是共享的。
編寫case_log裝飾器
我們通過args[0]就能獲取到self了(至於為什麼,大家可以思考一下
),通過self就能獲取到logger變量了。(我這裡寫的cls,沒啥關係,能理解它是self就行)
接著就是對引數的獲取,日誌話術的整理。
需要注意的是,我這裡對每個方法都獲取了一下__doc__,也就是方法的註釋,如果沒有的話就會取方法的名字。
對於一些類引數,我們直接輸出它的話會比較難以閱讀,那我們需要重寫它的__str__方法,就可以達到話術友好的目的。
我們去看看TestCase類的改動:
我們標記了他是用例,並且給出了用例名字和id,因為顯示用例全部資訊不太現實(主要是佔位置)。
改造執行方法
把日誌給join一下並返回即可。
看看print的效果:
雖然效果不如直接用self.logger.append自由度高,但是也足夠使用了。
進階
其實很多時候日誌需要高亮,我們其實可以輸出html
格式的日誌,方便展示關鍵資訊。
今天的後端內容就到這兒了,博主繼續去寫前端部分了。
線上演示地址: http://test.pity.fun/
前端程式碼倉庫: https://github.com/wuranxu/pityWeb
後端程式碼倉庫: https://github.com/wuranxu/pity