1. 程式人生 > 其它 >測試平臺系列(37) 運用裝飾器給用例加上執行日誌

測試平臺系列(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例項的時候,初始化一個list()用來存放日誌資料。

著手改造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