查看原文: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/
Python错误、调试及测试相关备忘
最新推荐文章于 2024-12-24 18:38:55 发布