Python程序设计之调试与测试(上)

281 阅读4分钟
参与拿奖:本文已参与「新人创作礼」活动,一起开启掘金创作之路

1.使用IDLE调试程序

1.1 使用Python标准开发环境IDLE的调式器Debugger

1.2 步骤如下:

运行IDLE进入主界面; 如下图找到Debugger点击运行即可: 在这里插入图片描述 调试方法:打开IDLE然后打开Debug下的Debugger即可,然后在IDLE窗口运行需要调试的程序(如下图所示);

在这里插入图片描述

2.使用pdb调试程序

2.1 交互模式下调试

使用pdb提供的功能可以直接调试语句块、表达式、函数等多种脚本:

#调试案例
import pdb
def f1():
    x=5
    print(x)
pdb.runcall(f1)
>>> pdb.runcall(f1)
> <pyshell#16>(2)f1()
(Pdb) 3
3
(Pdb) p x
*** NameError: name 'x' is not defined
(Pdb) 5
5
(Pdb) n
25
--Return--
> <pyshell#16>(2)f1()->None
(Pdb) 1
1
(Pdb) 5
5
(Pdb) return

2.2 在程序中插入断点

导入pdb模块,然后通过set_trace()函数在需要的位置设置断点。如果程序通过这种方法显示插入断点,那么命令提示符环境下执行该程序或双击程序时将自动打开pdb调试环境:

import pdb
n=5
pdb.set_trace()
for i in range(2,n):
    if n%i==0:
        print('No')
        break
    else:
       print('Yes')
(Pdb) p i
3
(Pdb) l
119  	#导入pdb模块,然后通过set_trace()函数在需要的位置设置断点,
120  	# 如果程序通过这种方法显示插入断点,那么命令提示符环境下执行该程序或双击程序时将自动打开pdb调试环境
121  	import pdb
122  	n=5
123  	pdb.set_trace()
124  ->	for i in range(2,n):
125  	    if n%i==0:
126  	        print('No')
127  	        break
128  	    else:
129  	       print('Yes')
(Pdb) 

2.3把pdb作为模块来调试程序

在命令行提示符执行"pdb -m pdb 脚本文件名",则直接进入调试程序,当调试结束或程序正常结束后,pdb重启该程序;把上述程序中的pdb模块的导入和断点插入函数都删除,然后在命令提示符环境中使用调试模式运行:

>>> python -m pdb 1.py

3.常用pdb调试命令:

①显示当前函数参数:

a(rgs)

②设置断点,和列出所有断点:b(reak)[[filename:]lineno]|function[,condition]

b 12   #在12行设置断点
b function #在function函数第一条执行语句设置断点
b      #不带参数则列出所有断点,包括每个断点的触发次数、当前忽略计数以及与之关联的条件
b 17,condition #设置条件断点,仅当condition值为True时该断点有效

③删除缎断点:cl(ear)[filename:lineno|bpnumber[bpnumber...]]

cl     #清除所有断点
cl filename:lineno #清除指定文件指定行的所有断点
cl 3 5 9   #清除第3,5,9个断点

④设置条件断点:condition bpnumber[condition]

condition 3 a<b    #仅当a<b时,3号断点有效
condition 3    #将3号断点设置为无条件断点

⑤继续运行至下一断点或脚本或结束:continue ⑥禁用断点:disable[bpnumber[bpnumber]...]

disable 3 5 #禁用第3,5个断点,禁用后断点任然存在,可以再次被启用

⑦列出脚本清单:l(ist)[first[,last]]

l      #列出脚本清单,默认11行
l m,n  #列出第m行到n行的脚本代码
l m    #列出从第m行开始的11行的代码

⑧关于栈帧: 在跟踪器中向下移动一个栈帧

d(own)

查看当前栈帧

w(here)

在栈跟踪器中向下移动一个栈帧

u(p)

⑨执行语句: 执行下一条语句,遇到函数时不进入其内部:n(ext) 执行下一条语句,遇到函数进入其内部:step

⑩临时断点:设置临时断点,该类型断点只会出现一次,执行后就会自动删除:tbreak

其他: 启用第n个断点:enable[bpnyumber[bpnumber...]]

enable n

查看pdb帮助

h(elp)[command]

为断点设置忽略计数,count默认值为0。如果某断点的忽略计数不为0,则触发时自动减1,当忽略计数为0时该断点处于活动状态:ignore bpnumber[count]

跳行执行:j(ump)

j 20   #跳到第20行执行

打印:p(rint)

p i    #打印变量i的值

退出pdb调试:q(uit)

一直执行到当前函数返回:f(turn)

在pdb中执行语句,!与要执行的语句之间不需要空格,任何非pdb命令都被解释为Python语句并执行,甚至可以调用函数或修改当前上下文中华变量的值:[!]statement

默认执行上一条命令:直接回车

学习笔记

1.关于调试的方法有IDLE和pdb两种方式;

2.使用pdb有三种方式,分别为:a.在交互模式下使用;b.在程序执行中使用;c.使用"python -m pdb 脚本文件名"来进入调试模式;