天天看點

測試開發日記:python代碼調試神器,工作提效利器

作者:橙好測試開發

在程式開發過程中,代碼的運作往往會和我們預期的結果有所差别。于是,我們需要清楚代碼運作過程中到底發生了什麼?代碼哪些子產品運作了,哪些子產品沒有運作?輸出的局部變量是什麼樣的。我們一般會加一些調試語句,比如加一些print或者log。代碼少還好說,如果是大型項目,面對衆多 print 的輸出結果,可能不太好定位。下面推薦python的PySnooper包

測試開發日記:python代碼調試神器,工作提效利器

PySnooper 是個什麼東西?

PySnooper是一款成熟的調試器,與logging和iceream的作用類似,可以通過pip install PySnooper安裝

為什麼PySnooper能從其他智能調試工具中脫穎而出?

因為你可以在不需要進行任何設定的情況下将其用于糟糕的、龐大的企業代碼庫中。

PySnooper主要作用

1、重定向到日志

import pysnooper
@pysnooper.snoop(output='../debug.log')
def demo_func():
    dict_list = dict()
    dict_list["name"] = "dyf"
    dict_list["age"] = 18
    dict_list["gender"] = "female"
    return dict_list


demo_func()           

2、跟蹤非局部變量

跟蹤非局部變量值 PySnooper 是以函數為機關進行調試的,它預設隻會跟蹤函數體内的局部變量,若想跟蹤全局變量,可以給 pysnooper.snoop() 加上 watch 參數

import pysnooper


out = {"foo": "bar"}
@pysnooper.snoop(watch='out["foo"]')
def demo_func():
    dict_list = dict()
    dict_list["name"] = "dyf"
    dict_list["age"] = 18
    dict_list["gender"] = "female"
    return dict_list
demo_func()

           

和watch 相對的,pysnooper.snoop() 還可以接收一個函數 watch_explode,表示除了這幾個參數外的其他所有全局變量都監控。

@pysnooper.snoop(watch_explode=('foo', 'bar'))
def demo_func():
    dict_list = dict()
    dict_list["name"] = "dyf"
    dict_list["age"] = 18
    dict_list["gender"] = "female"
    return dict_list
demo_func()           

3、設定跟蹤函數的深度

#當你使用 PySnooper 調試某個函數時,若該函數中還調用了其他函數,PySnooper 是不會傻傻的跟蹤進去的。如果你想繼續跟蹤該函數中調用的其他函數,可以通過指定 depth 參數來,設定跟蹤深度(不指定的話預設為 1)

# 跟蹤函數中調用其他函數的執行過程
@pysnooper.snoop(depth=2)  
def demo_func_new():
    return '我是一個函數'


@pysnooper.snoop(depth=2)
def demo_func():
    demo = demo_func_new()
    print(demo)
    dict_list = dict()
    dict_list["name"] = "dyf"
    dict_list["age"] = 18
    dict_list["gender"] = "female"
    return dict_list
demo_func()           

4、設定調試日志的字首

#當你在使用 PySnooper 跟蹤多個函數時,調試的日志會顯得雜亂無章,不友善檢視。在這種情況下,PySnooper 提供了一個參數,友善你為不同的函數設定不同的标志,友善檢視日志時進行區分

#4、設定調試日志的字首
@pysnooper.snoop(output="../debug.log", prefix="demo_func: ")           

5、設定最大的輸出長度

預設情況下,PySnooper 輸出的變量和異常資訊,如果超過 100 個字元,被會截斷為 100 個字元。當然你也可以通過指定參數 進行修改

@pysnooper.snoop(max_variable_length=200)             # 限制長度為200
@pysnooper.snoop(max_variable_length=None)            # 不限制長度           

6、支援多線程調試模式

PySnooper 同樣支援多線程的調試,通過設定參數 thread_info=True,它就會在日志中列印出是在哪個線程對變量進行的修改。

如果感覺文章對你有幫助的話可以點個關注,歡迎關注公衆号:橙好測試開發,可以免費獲得測試開發學習資料!