您的位置:首页 > 编程语言 > Python开发

Python错误、调试及测试相关备忘

2016-12-12 14:02 531 查看
查看原文:http://www.wyblog.cn/2016/12/12/python%e9%94%99%e8%af%af%e3%80%81%e8%b0%83%e8%af%95%e5%8f%8a%e6%b5%8b%e8%af%95%e7%9b%b8%e5%85%b3%e5%a4%87%e5%bf%98/
本博文总结自廖雪峰老师的Python教程:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431913726557e5e43e1ee8d54ee486bddc3f607afb75000

错误

可以用
try...except...finally
机制来处理错误。当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
注意,这里except语句可以捕捉多个错误类型,例如:

try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')


except语句可以跨越多层调用,例如,被调用的子函数的子函数出错了,那么在调用函数这一级就能捕获到错误。例如,main()调用bar(),bar()调用foo(),如果foo()出错了,那么在main()里的except能够捕获到错误。

为了记录错误信息,可以使用logging模块。在except语句后边执行
logging.exception(e)
,错误就能被记录下来,而且,程序打印完错误信息后,还能继续执行未执行完的程序。

使用raise语句可以抛出一个错误,例如
raise ValueError('invalid value: %s' % s)
,如果仅仅单独使用
raise
不带任何参数,则可将当前错误原样抛出。

调试

assert断言语句可以替代print语句进行调试。在
print(n)
的地方,换成
assert n!=0,'n is zero'
,如果断言失败,程序就会抛出AssertionError。

pdb是python的单步调试器,可以带参数启动,
python -m pdb <file>
,输入l可以查看代码,n可以单步执行代码,可以用p来查看变量的值,q可以结束调试。
如果是大程序,单步执行就太慢了。可以在程序开头引入
import pdb
,然后在需要添加断点的地方设置
pdb.set_trace()
,可以用c命令继续执行程序。

测试

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。python里可以把一系列的测试用例放到一个测试模块里,构成一个完整的单元测试模块。如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确。
为了运行单元测试,需要引入
import unittest
模块,然后引入要测试的类,并且为测试类单独编写一个类,例如:

import unittest
from mydict import Dict

class TestDict(unittest.TestCase):
def test_init(self):
d = Dict(a=1, b='test')
self.assertEqual(d.a, 1)
self.assertEqual(d.b, 'test')
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEqual(d.key, 'value')
def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEqual(d['key'], 'value')
def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty


从以上可以看出,我们自己写的测试类都是从unittest.TestCase进行继承的。并且,测试方法都要以
test_
开头,才会被自动执行测试。

运行单元测试最简单的方式是,在测试程序里加入:

if __name__ == '__main__':
unittest.main()


这样就可以直接执行测试程序了
python3 mydict_test.py

另一种方式是
python3 -m unittest mydict_test
,这种是推荐做法。

可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。查看原文:http://www.wyblog.cn/2016/12/12/python%e9%94%99%e8%af%af%e3%80%81%e8%b0%83%e8%af%95%e5%8f%8a%e6%b5%8b%e8%af%95%e7%9b%b8%e5%85%b3%e5%a4%87%e5%bf%98/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: