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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值