调试
程序一次写完不出错的概率很小,有的bug看错误信息就知道,有的变量值是错误的,因此 需要一整套调试程序的手段来修复bug。
第一种方法简单直接粗暴有效,就是print()把可能有问题的变量打印出来:
def foo(s):
n = int(s)
print('>>>n = %d' % n)
return 10 / n
def main():
foo('0')
main()
用point的最大坏处是还得删掉他,如果程序里都是print(),运行结果也会有很多垃圾信息。
断言
判断一下,然后输出 句话
def foo(s):
n = int(s)
assert n != 0, 'n is Zero!'
return 10/n
def main():
foo('0')
main()
结果:
Traceback (most recent call last):
File "G:/zrx/demoproject/demo1.py", line 734, in <module>
main()
File "G:/zrx/demoproject/demo1.py", line 732, in main
foo('0')
File "G:/zrx/demoproject/demo1.py", line 728, in foo
assert n != 0, 'n is Zero!'
AssertionError: n is Zero!
虽然也充满 输出语句
不过启动python解释器时可以用参数-O来关闭assert
$ python -O err.py
Traceback (most recent call last):
…
ZeroDivisionError: division by zero
logging
把print()
替换为logging
是第三种方式,logging
不会抛出错误,而且可以 输出到文件:
import logging
logging.basicConfig(level = logging.INFO)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print( 10 / n )
这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等 几个级别,当我们指定level = INFO时,logging.debug就不起作用了。
同理,指定level = WARNING后,debug和info 就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
pdb
第四种是启动Python的 调试器pdb,让程序以单步方式 运行,可以随时查看运行状态。我们先准备好程序:
import pdb
s = '0'
n = int(s)
#pdb.set_trace() 算是一个断点,执行到这里,但输出下一句代码,需要import pdb
print(10 / n)
在命令行
pdb命令简介:https://www.cnblogs.com/Zzbj/p/10592278.html
IDE
如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:
Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。
PyCharm:http://www.jetbrains.com/pycharm/
单元测试
单元测试就是用来对一个模块、一个函数或者一个类来进行 正确性检验工作。
比如对函数abs(),我们可以编写出以下几个测试用例:
1.输入正数,比如1、1.2、0.99,期待返回值与输入相同;
2.输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;
3.输入0,期待返回0