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()

  我的公众号谢谢关注:

时间: 2024-12-17 11:57:36

python学习(十一)测试和调试的相关文章

python学习笔记012——pdb调试

1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调试作用 : 可以让程序单步执行,观察中间结果 可以设定指定断点,进行特定位置观察 2 调试命令 完整命令 简写命令 描述 args a 打印当前函数的参数 break b 设置断点 clear cl 清除断点 condition 无 设置条件断点 continue c或者cont 继续运行,知道遇到

Python学习十一:函数式编程

这也是我第一接触函数式编程这个概念,并不知道是干嘛的?好奇心驱使下学习了一下,有了大致的了解: 函数式编程自己的理解:就跟说话一样写程序,这个程序写出来可以直白的告诉人是要干嘛的. 以下是我读到的关于函数式编程的文章的描述: 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数![1] 函数式编程的准则:不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你.[2] 函数式编程的理念:把函数当成变量来用,关注于描述问题而不是怎么实现,这样可以让代码更易

python学习笔记之pdb调试

之前一直说要学python可还是一直停留在看的层面,昨天大神手把书教我pdb调试,说要摆脱IDE集成开发环境编程,感激不尽,立一个flag,python一定要入门! 1.进入方式 1)windows cmd下或者anaconda prompt下,cd 到count_pdf.py目录下 2)大神告诉还可以在count_pdf.py上按shift点击鼠标右键--在此处打开命令窗口 2.python count_pdf.py会直接得到输出结果,这个不用我多说.下面介绍如何一步步调试 python -m

Python学习(十一) Python数据类型:字典(重要)

字典dict: 字典其实就相当于java里面的Map,用来存储键值对的.其中存储的数据时无序的. 假如有这样的数据: t1=['name','age','sex'] t2=['tom',30,'male'] 通过zip(t1,t2)可以获取到这样的数据[('name','tom'),('age',30),('sex','male')] 字典定义是通过 {}进行的. 字典是Python当中唯一的映射类型(哈希表),字段对象时可变的,但是字典对象的键必须是不可变的,并且一个字典中可以包含不通类型的键

python django 基本测试 及调试 201812

#####20181225 1.python解决SNIMissingWarning和InsecurePlatformWarning警告在想要获取https站点的资源时,会报出SNIMissingWarning和InsecurePlatformWarning警告 SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not availa

python测试与调试提示

测试与调试提示2.1 在交互模式输入一个python语句就会执行一个.在调试程序时,这种模式尤其有用. 测试与调试提示2.2 在一个文件调用python解释器后,解释器会在文件中的最后一个语句执行之后推出.然而,如果使用-i选项(例如python -i file.py)针对文件调用解释器,会导致编译器在执行了文件中的语句后进入交互模式.这非常使用于调试程序. 测试与调试提示2.3 如果一个表达式里包含许多运算符,请务必参考运算符优先级表,合适表达式中的运算符按自己希望的顺序执行,如表达式过于复杂

《Python学习手册 第五版》 -第12章 if测试和语法规则

本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.if三元表达式 以下是针对重点内容的详细说明 1.if语句的基本形式 if语句是根据测试结果,从一些备选的操作中做出选择的语句,也就是说要先计算测试结果,再选择做什么,基本形式如下: if test1: statements1 elif test2: statements2 else: stateme

Python:渗透测试开源项目

Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网络 Scapy: send, sniff and dissect and forge network packets. Usable interactively or as a library pypcap, Pcapy and pylibpcap:

Python:渗透测试开源项目【源码值得精读】

sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网络 Scapy: send, sniff and dissect and forge network packets. Usable interactively or as a library pypcap, Pcapy and pylibpcap: several different Python