Python异常处理与测试
捕获异常与异常处理
try:
x = 5 / 0
print(x)
# 捕获所有类型异常
except:
print('发生错误')
输出:
发生错误
try:
x = 5 / 0
print(x)
# 捕获特定类型异常并重命名实例
except ZeroDivisionError as e:
print('不能除以零', e)
except:
print('其他类型错误')
#如果没有异常则执行以下代码
else:
print('没有异常')
# 不管有无异常最后都要执行的代码(一般用于释放资源等)
finally:
pass
输出:
不能除以零 division by zero
try关键字后的代码块是有可能出现异常的代码,except关键字可以捕获特定类型异常或所有类型异常,else关键字后的代码是在try代码执行没有发生异常的情况下执行,finally后的代码在try代码执行不管是否发生异常都要执行,raise用于在代码中手动抛出异常。
注意:
try代码块中可能出现异常的语句后面不要加必须执行的语句,因为一旦出现异常,try代码块里后面的语句都会被跳过不执行
Python测试函数
main.py
def get_formatted_name(firstname, lastname):
fullname = '{} {}'.format(firstname, lastname)
return fullname.title() # 所有单词首字母大写,转化为标题格式
test_name_fuction.py
import unittest # 导入Python内置的用于测试的模块
from main import get_formatted_name # 导入要测试的函数
# 自定义一个类继承unittest模块中的TestCase类
class NameTestCase(unittest.TestCase):
def test_title_name(self):
formatted_name = get_formatted_name('tom', 'lee')
# 调用断言函数判断两个参数是否相同
self.assertEqual(formatted_name, 'Tom Lee')
# 也可以写成如下形式
# self.assertEqual('Tom Lee', get_formatted_name('tom', 'lee'))
if __name__ == '__main__':
unittest.main()
输出:
Ran 1 test in 0.004s
OK
Python测试类
main.py
class Coder:
def __init__(self, name):
self.name = name
self.skills = []
def master_skill(self, skill):
self.skills.append(skill)
def show_skills(self):
print('掌握技能:')
for skill in self.skills:
print('-', skill)
test_coder.py
import unittest
from main import Coder
class CoderTestCase(unittest.TestCase):
def test_skill_in(self):
c = Coder('Tom')
c.master_skill('Python')
c.master_skill('C#')
self.assertIn('Python', c.skills)
if __name__ == '__main__':
unittest.main()
输出:
Ran 1 test in 0.002s
OK
也可以重写unittest的setUp()方法来创建测试类的实例对象(完成初始化工作),以及tearDown()方法进行资源的释放。unittest 在运行每个测试用例(以 test_ 开头的方法)之前都会执行一次 setUp() 方法,在运行完每个测试用例(以 test_ 开头的方法)之后都会执行一次 tearDown() 方法。
import unittest
from main import Coder
class CoderTestCase(unittest.TestCase):
def setUp(self):
self.c = Coder('Tom')
self.c.skills = ['Python', 'C#']
def test_skill_in(self):
self.assertIn('Python', self.c.skills) # 此处注意要加上self
def tearDown(self):
del self.c
if __name__ == '__main__':
unittest.main()
输出:
Ran 1 test in 0.003s
OK
常用断言函数
import unittest
person = {'name': 'Mike', 'age': 20}
num = [1, 6, 55]
s = 'Python'
class TestAssert(unittest.TestCase):
def test_assert_method(self):
# 判断值是否相等
self.assertEqual('Mike', person.get('name'))
# 判断第一个参数是否大于第二个
self.assertGreater(3, num[0])
# 判断是否约等于
self.assertAlmostEqual(3.3, 1.1 + 2.2)
# 判断是否为真
self.assertTrue('Py' in s)
# 判断是否包含
self.assertIn('Py', s)
# 判断是否为同一引用
self.assertIs(True + 1, 2)
# 判断是否为空
self.assertIsNone(person.get('gender', None))
# 判断是否为某类型实例
self.assertIsInstance(s, str)
if __name__ == '__main__':
unittest.main()
输出:
Ran 1 test in 0.003s
OK