一:错误处理
使用try catch时,如果没有错误发生,可以在except语句后面加一个else,当没有错误发生时,会自动执行else语句
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')
二:调试
a:在初学python的时候我们很喜欢用print()把可能有问题的变量打印出来,但是这样有个最大的坏处就是未来我们还要删除掉它,如果忘记删除,运行结果也会包含很多垃圾信息,
b:所以就有了第二种方法:断言
凡是用print()来辅助查看的地方,都可以用断言(assert)来替代
def foo(s):
n=int(s)
assert n!=0,'n is zero'
return 10/n
def main():
foo('0')
在此处如果输入的值为0,则控制台会输出’n is zero’,如果不为0则可以当做pass略过
c:第三种方法是logging,与前两种相比,logging不会抛出错误,而且可以输出到文件
import logging
s='0'
n=int(s)
logging.info(n='%d'%n)
print(10/n)
执行后会发现,输出的文本中没有n=%d的信息,这个时候需要在import下面加上logging.basicConfig(level=logging.INFO),
设置logging的级别,通过简单的配合,一条语句可以同时输出到不同的地方,可以是控制台可以是文件
d:启动python的调试器pdb,类似于直接在控制台去使用断点,单步调试等,效率较低
e:直接使用ide设置断点等
三:单元测试/文档测试
此处是官方文档链接,请自行选择相应版本
https://docs.python.org/zh-cn/3/library/unittest.html?highlight=assertequal
A:单元测试:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的检测工作
A-1:独立的测试是使用类方法,这些方法的命名都以test_开头,这个命名约定也是为了告诉测试者,类的哪些方法表示测试
调用assertEqual()来检查预期的输出;调用assertTrue()或assertFalse()来验证一个条件;调动assertRaise()来验证一个特定的异常,使用这些方法而不是assert语句,是为了让运行测试的人能够聚合所有的测试结果并生成结果报告。
针对asserRaise做一个补充,对于初学者来说,官网中的解释可能不够清楚,可以试试运行一下我补充的案例,针对这个案例可以更好的了解asserRaise的用法
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split('raise zhe typrerror')#这样会显示TypeError not raised
with self.assertRaises(TypeError):
s.split(213)#如果触发了TypeError,则不会报错
with self.assertRaises(ValueError):
int('1sad')#如果触发了ValueError,则不会报错
B:文档测试:
此处是官方文档链接,请自行选择相应版本:https://docs.python.org/zh-cn/3/library/doctest.html?highlight=doctest
官方文档是这么说的:doctest 模块寻找像Python交互式代码的文本,然后执行这些代码来确保它们的确就像展示的那样正确运行,有许多方法来使用doctest
此处是引用了其他博主的链接:https://www.cnblogs.com/whrTC/p/9149997.html
def fact(n):
'''
Calculate 1*2*...*n
>>> fact(1)
1
>>> fact(10)
3628800
>>> fact(-1)
Traceback (most recent call last):
...
ValueError
'''
if n < 1:
raise ValueError()
if n == 1:
return 1
return n * fact(n - 1)
if __name__ == '__main__':
import doctest
doctest.testmod()
#其中fact(-1)需要将报错的输出写出,只要是输出与期望值一致,就标记为测试成功。其中…代表中间一大段的输出。
注意到最后3行代码。当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。
1 '>>>‘开头的行就是doctest测试用例。
2 不带’>>>'的行就是测试用例的输出。
3 如果实际运行的结果与期望的不一致,就标记为测试失败。