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 pdb

  s = '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 = d['empty']
  • 运行单元测试
    (1)最简单的运行方式是在mydict_test.py的最后加上两行代码:
if __name__ == '__main__':
    unittest.main()

将测试当做脚本运行
(2)在命令行通过参数-m unittest运行

  • setUp与tearDown
    这两个方法会分别在每调用一个测试方法的前后分别被执行。可以进行一些资源打开与关闭的操作

文档测试

直接运行文档中的示例代码。文档注释一般在函数定义语句、类定义语句下一行开始,使用多行字符串的语法:

def abs(n):
    """
    注释内容
    """

模块中文档测试代码:

if __name__ == "__main__":
    import doctest

    doctest.testmod()

你可能感兴趣的:(Python学习记录之:错误、调试和测试)