python学习(十一)测试和调试
最近学习了python的错误处理
和几种测试
方法
1 try except
可以通过try except
方式捕捉异常
try:
print('try...')
r = 10/0
print('result is :', r)
except ZeroDiversionError as e:
print('except is :', e)
finally:
print('finally ...')
print('END')
可以捕捉不同类型的错误,编写多个except
try:
print('try...')
r = 10/int('a')
print('result is: ', r)
except ValueError as e:
print('ValueError : ', e)
except ZeroDiversionError as e:
print('ZeroDivisionError is : ', e)
finally:
print('finally ...')
print('END')
try except同样支持else结构
try:
print('try... ')
r = 10/int('2')
print('result is : ', r)
except ValueError as e:
print('ValueError : ', e)
except ZeroDivisionError as e:
print('ZeroDivisionError is : ', e)
else:
print('no error')
finally:
print('finally ...')
print('END')
某个函数调用出现异常,在上层同样可以捕获到
def foo(s):
return 10/int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
print('Exception is : ', e)
finally:
print('finally...')
main()
2 logging
python 提供打日志方式输出异常,并且不会因为出现异常导致程序中断
import logging
def foo(s):
return 10/int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
如果想要将异常处理的更细致,可以自定义一个异常类,继承于几种错误类,如ValueError等,在可能出现问题的地方将错误抛出来
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n == 0:
raise FooError('invalid error is : %s' %s)
return 10/n
foo('0')
错误可以一层一层向上抛,直到有上层能处理这个错误为止
def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid error is: %s' %s)
return 10/n
def bar():
try:
foo('0')
except ValueError as e:
print('ValueError')
raise
bar()
logging可以设置不同的级别,通过basicConfig可以设置
import logging
logging.basicConfig(level=logging.INFO)
def foo(s):
n = int(s)
return 10/n
def main():
m = foo('0')
logging.info('n is : %d' %m)
main()
3 断言assert
大部分语言都支持assert,python也一样,在可能出错的地方写assert,会在异常出现时使程序终止
def foo(s):
n = int(s)
assert n != 0 ,'n is zero'
return 10/n
def main():
foo('0')
main()
4 pdb调试和set_trace
pdb调试用 python -m pdb 文件名.py, 单步执行敲n,退出为q
python 可以在代码里设置断点,在程序自动执行到断点位置暂停,暂停在set_trace
的代码行
import pdb
def foo(s):
n = int(s)
pdb.set_trace()
return 10/n
def main():
m = foo('0')
main()
5 单元测试
先实现一个自己定义的Dict类,将文件保存为mydict.py
class Dict(dict):
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except Exception as e:
raise AttributeError('AttributeError is :%s', e)
def __setattr__(self, key, value):
self[key] = value
python 提供了单元测试的类,开发者可以继承unittest.Test
实现特定的测试类,下面实现Dict的单元测试类,保存为unittestdict.py
import unittest
from mydict import Dict
class TestDict(unittest.TestCase):
def setUp(self):
print('setUp...')
def tearDown(self):
print('tear Down...')
def test_init(self):
d = Dict(a='testa', b = 1)
self.assertEqual(d.a, 'testa')
self.assertEqual(d.b, 1)
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['name'] = 'hmm'
self.assertEqual(d.name, 'hmm')
def test_attr(self):
d = Dict()
d.name = 'hmm'
self.assertEqual(d['name'], 'hmm')
self.assertTrue('name' in d)
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty def test_keyerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d['empty'] if __name__ == '__main__':
unittest.main()
运行unittest.py可以检测mydict中Dict类是否有错误
6 文档测试
文档测试在代码中按照特定格式编写python输入和期待的输出,通过python提供的文档测试类,实现测试代码的目的
class Dict(dict):
'''
>>> d1 = Dict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y = 200
>>> d1['y']
200
>>> d2=Dict(a=1,b=2,c='m')
>>> d2.c
'm' '''
def __init__(self, **kw):
super(Dict,self).__init__(**kw)
def __getattr__(self,key):
try:
return self[key]
except KeyError:
raise AttributeError('AttributeError key is %s' %key)
def __setattr__(self,key,value):
self[key] = value
if __name__ == '__main__':
import doctest
doctest.testmod()
我的公众号谢谢关注:
python学习(十一)测试和调试的更多相关文章
- python学习笔记012——pdb调试
1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调 ...
- python学习笔记之pdb调试
之前一直说要学python可还是一直停留在看的层面,昨天大神手把书教我pdb调试,说要摆脱IDE集成开发环境编程,感激不尽,立一个flag,python一定要入门! 1.进入方式 1)windows ...
- python django 基本测试 及调试
#########20181110from django.db import modelsfrom blog.models import Article, Author, TagAuthor.obje ...
- 使用Python学习selenium测试工具-4:查找元素
转自:https://blog.csdn.net/wd168/article/details/51819930 web通常包含了Hyper Text Markup Language (HTML).Ca ...
- Python学习--12 异常处理、调试
异常捕获 语法格式: try: pass except xxx as e: pass except xxx as e: pass ... else: pass finally: pass except ...
- python django 基本测试 及调试 201812
#####20181225 1.python解决SNIMissingWarning和InsecurePlatformWarning警告在想要获取https站点的资源时,会报出SNIMissingWar ...
- 【转】使用Python学习selenium测试工具
出处:https://my.oschina.net/u/1433482/blog/633231?fromerr=vaxqh9bn
- 转 Python3 错误和异常/ Python学习之错误调试和测试
########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...
- python学习笔记(六)——程序调试
在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...
随机推荐
- 局域网安全-MAC Flood/Spoof
原文发表于:2010-09-22 转载至cu于:2012-07-21 很早之前就看过秦柯讲的局域网安全的视频.但是看了之后在实际工作当中很少用到(指我个人的工作环境中,惭愧啊…),时间长了,好多技术细 ...
- day06 再谈编码 and 作业讲解
1. 小数据池,(其他语言又叫常量池) id() 查看变量的内存地址 is和== is 判断内存地址是否一致 == 判断内容是否一致 小数据池的作用: 为了快速的创建字符串对象, 可以减少内存的浪费 ...
- PPM、PGM、PBM图像格式剖析
今天突然需要用到PPM这个图像文件格式,之前没见过,在此记录一下. PPM.PGM.PBM这三个图像文件格式很少见,其实也不难,分别用于彩色图像.灰度图像.二值图像.这里以PPM格式为例. PPM格式 ...
- 初创型公司如何经济有效的申请邓白氏编码(DUNS)
听说有免费,和800元,1500元,上万元等不同的申请方式?听说申请完还要等十数个工作日让邓白氏和苹果的数据库同步.不同高低价格的申请方式得到的编码都能被苹果接受吗? http://www.zhihu ...
- HTML页面模板代码
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 HTML页面模板代码 常用的页面模板 & ...
- git中的重要指令
git命令 任何操作都需要以 git 命令为开头 本地操作: git init 初始化一个本地仓库 新建为 master主分支 git status 查看当前分支状态 git add <文件名& ...
- ncnblogs.com的用户体验
你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我是一名普通的学生,上cnblogs的期望是发表博客完成老师布置的任务. 当你第一次使用cnblogs 的功能的时候, 碰到了 ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
- 数学口袋精灵感受与BUG
232朱杰 http://www.cnblogs.com/alfredzhu https://github.com/alfredzhu/ 组长,团队 230蔡京航 http://www.cnblogs ...
- LoadRunner函数大全之中文解释
LoadRunner函数大全之中文解释