【Python】自动化测试系列之-Python 4种Debug方法

Python中Debug有很多种方式,比如直接用ide去 pydebug,或者命令行去debug。这里介绍Python调试代码的4种方法:print、log、pdb、PyCharm的debug,分别有什么优缺点。

一.使用ide debug

使用ide的方式比较简单,基本就是Shift + F9、F7、F8、F9、等几个常用的按键就可以。

PyCharm提供的debug功能,也提供了单步调试代码的功能。

优点:提供图形化界面,很直观;功能强大;不需要修改代码
缺点:依赖ide

 

二.命令行debug 

debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程。

Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观。

下面记录一下另外一种方式,直接以命令行的方式debug:

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

优点:功能强大,使用简单

缺点:需要入侵代码,也就是要修改代码;使用更复杂。

 

Python命令行方式debug有两种方式:  1.直接在命令行中运行, 2.在脚本当中运行。两种方式都需要使用pdb模块。

方式一:在命令行中运行

$ python -m pdb my_script.py

 方式二:脚本中运行


在需要设置断点的地方,插入方法 pdb.set_trace()

复制代码
复制代码
import pdb

def make_bread():
    pdb.set_trace()
    return "I don't have time"

print(make_bread())
复制代码
复制代码

 

命令: 在进入调试状态之后,就可以输入命令进行调试了。

c: (continue)继续执行
w:(words)显示当前行的上下文信息
a:(arguments)打印当前函数的参数列表
s:(stop)执行当前行,并在顶一个可能的时机停止
n:(next)继续执行直到当前函数的下一行或者函数返回值

 通过h可以看到更多的命令,根据需要使用就好了

复制代码
-> import sys
(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pp       run      unt
a      c          continue  exit    l     q        s        until
alias  cl         d         h       list  quit     step     up
args   clear      debug     help    n     r        tbreak   w
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

(Pdb)
复制代码

 关于pdb的一些常用命令:

复制代码
常用的调试命令

h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:“h l” — 查看list命令 
l(ist),可以列出当前将要运行的代码块 
(Pdb) l

b(reak), 设置断点,例如 “b 77″,就是在当前脚本的77行打上断点,还能输入函数名作为参数,断点就打到具体的函数入口,如果只敲b,会显示现有的全部断点 

condition bpnumber [condition],设置条件断点,下面语句就是对第4个断点加上条件“a==3” 
(Pdb) condition 4 a==3
(Pdb) b
Num Type Disp Enb Where
4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504
stop only if a==3

cl(ear),如果后面带有参数,就是清除指定的断点;如果不带参数就是清除所有的断点 
(Pdb) cl
Clear all breaks? y

disable/enable,禁用/激活断点 
(Pdb) disable 3
(Pdb) b
Num Type Disp Enb Where
3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505

n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的 

s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中 
c(ont(inue)),让程序正常运行,直到遇到断点 
j(ump),让程序跳转到指定的行数 
(Pdb) j 497
> /home/jchen/regression/regressionLogCMP.py(497)compareLog()
-> pdb.set_trace()

a(rgs),打印当前函数的参数 
(Pdb) a
_logger =
_base = ./base/MRM-8137.log
_new = ./new/MRM-8137.log
_caseid = 5550001
_toStepNum = 10
_cmpMap = {‘_bcmpbinarylog’: ‘True’, ‘_bcmpLog’: ‘True’, ‘_bcmpresp’: ‘True’}

p,最有用的命令之一,打印某个变量 
(Pdb) p _new
u’./new/MRM-8137.log’

!,感叹号后面跟着语句,可以直接改变某个变量 
q(uit),退出调试 
发现在命令行下调试程序也是一件挺有意思的事情,记录下来分享一下

w ,Print a stack trace, with the most recent frame at the bottom.An arrow indicates the "current frame",
which determines the context of most commands. 'bt' is an alias for this command. d ,Move the current frame one level down in the stack trace (to a newer frame). u ,Move the current frame one level up in the stack trace (to an older frame). 使用 u 和 d 命令,我们可以在栈帧之间切换,用以获取其相关上下文变量信息。w可以显示最近的一些栈帧信息。
复制代码

常用的 pdb debug 命令:

命令       用途
break 或 b     设置断点
continue 或 c   继续执行程序, 或是跳到下个断点
list 或 l      查看当前行的代码段
step 或 s     进入函数
return 或 r      执行代码直到从当前函数返回
exit 或 q      中止并退出
next 或 n     执行下一行
p 或!       打印变量的值,例如p a
help 或 h     帮助

 

其他

复制代码
pdb调试命令        
完整命令      简写命令        描述
args            a             打印当前函数的参数
break        b        设置断点
clear          cl            清除断点
condition      无            设置条件断点
continue      c或者cont      继续运行,知道遇到断点或者脚本结束
disable       无              禁用断点
enable        无              启用断点
help            h            查看pdb帮助
ignore       无            忽略断点
jump            j            跳转到指定行数运行
list            l            列出脚本清单
next            n            执行下条语句,遇到函数不进入其内部
p              p            打印变量值,也可以用print
quit            q            退出 pdb
return        r            一直运行到函数返回
tbreak       无            设置临时断点,断点只中断一次
step           s            执行下一条语句,遇到函数进入其内部
where        w            查看所在的位置
!             无            在pdb中执行语句
            
复制代码

 

 

 

3.print

用print调试代码是最简单的一种方法,也很常用,大部分人都掌握这种技巧。

在代码中合适的地方插入语句,可以是输出提示语句或者输出某些变量。

 

优点:

比较直观,使用简单

缺点:

需要入侵代码,也就是要修改代码

 

4.打log

就是利用logging模块,在代码合适的地方插入输出log语句,把合适的信息输出到log文件中,通过查看log文件分析代码的执行情况。

 

优点:

logging模块可以指定输出格式和内容(可以输出时间,代码的行号,当前运行程序的名称、当前运行的函数名称、进程ID等等),因此能获得更精确的调试信息,应用场景更广泛,可以应用于生产环境。

缺点:

需要入侵代码,也就是要修改代码;使用更复杂。

 

 

 

待续...

posted @   念槐聚  阅读(2644)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示