Python学习记录之(错误、调试和测试)

错误处理

# coding=utf-8 import logging try: print 1 / 0 # print 1 / int('a') # print 1 / 2 except ZeroDivisionError, e: logging.exception(e)# 记录错误 print "exception:", e except ValueError, e: print "exception:", e raise SystemError('input error!')# 将错误转为另一种错误抛出 except Exception, e: print type(e) raise# 将错误原样抛出 else:# 没有错误时执行 print "no error" finally: print "finally"

常见的错误类型和继承关系看这里:
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
调试
  • 使用print
  • 断言
assert n != 0, 'n is zero!'# 表达式不为 True 抛出 AssertionError ,附带后面的信息

  • logging
import logging logging.basicConfig(level=logging.NOTSET) s = '0' n = int(s) logging.info('n = %d' % n) print 10 / n

logging有debug,info,warning,error...等多个级别,级别定高了低级别的信息就不会输出,可以输出到console或是文件等
  • pdb
python -m pdb err.py

进入调试模式,l 查看代码,n 单步执行,p 变量名查看变量,q 结束调试
  • pdb.set_trace()
import pdbs = '0' n = int(s) pdb.set_trace() # 运行到这里会自动暂停 print 10 / n

运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行
单元测试
  • “测试驱动开发”(TDD:Test-Driven Development)
  • 编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
  • 以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。
  • assertEquals()
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等

  • 另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError
with self.assertRaises(KeyError): value = https://www.it610.com/article/d['empty']

  • 运行单元测试
    (1)最简单的运行方式是在mydict_test.py的最后加上两行代码:
if __name__ == '__main__': unittest.main()

将测试当做脚本运行
(2)在命令行通过参数-m unittest运行
  • setUp与tearDown
    这两个方法会分别在每调用一个测试方法的前后分别被执行。可以进行一些资源打开与关闭的操作
文档测试
直接运行文档中的示例代码。文档注释一般在函数定义语句、类定义语句下一行开始,使用多行字符串的语法:
def abs(n): """ 注释内容 """

【Python学习记录之(错误、调试和测试)】模块中文档测试代码:
if __name__ == "__main__": import doctestdoctest.testmod()

    推荐阅读