Python Unit Test
1. pc.py 新建类 PC
2. 新建单元测试 pc_unit
3. 编写 pc_unit
4. 修改类 PC
1. pc.py 新建类 PC
class PC(object):
def add(self,x,y):
return x+y
def sub(self,x,y):
return x-y
def mul(self,x,y):
return x*y
def div(self,x,y):
return x/y
if __name__=='__main__':
pc=PC()
print(pc.add(100,4))
print(pc.sub(100, 4))
print(pc.mul(100, 4))
print(pc.div(100, 4))
2. 新建单元测试 pc_unit
Name:pc_unit
Kind:Python unit test
自动生成
import unittest
class MyTestCase(unittest.TestCase):
def test_something(self):
self.assertEqual(True, False)
if __name__ == '__main__':
unittest.main()
3. 编写 pc_unit
(1)导入包:import unittest
(2)引入 PC 类:from day05.pc import PC
(3)添加函数 setUpClass(cls)、tearDownClass(cls)
1、setUpClass(cls) 和 tearDownClass(cls) 前需加装饰器
2、setUpClass(cls):在执行所有用例前,执行一次
3、tearDownClass(cls):在执行所有用例后,执行一次
(4)添加函数 setUp(self)、tearDown(self)
1、setUp(self):在执行每个用例前,执行一次
2、tearDown(self):在执行每个用例后,执行一次
(5)实例化 PC 类
# 在 setUpClass(cls) 方法中,实例化
@classmethod # 装饰器
def setUpClass(cls): # 在所有用例执行之前执行一次
print('-- all start --')
cls.pc=PC() # 类变量,实例化PC类得到一个该类对象
(6)编写测试用例
def test_01(self): #一个用例
print('test01')
# 调用 pc 的 div 除方法
r=self.pc.div(100,20)
# 断言相等:assertEqual(期望值,实际值,显示内容)
self.assertEqual(5,r,'100÷20=5')
- assertEqual 断言的使用:
assertEqual(a,b,desc) | assertEqual(期望值,实际值,提示内容) |
---|---|
assertEqual(a,b,desc) | 相等,判断 a 和 b 是否相等,相等返回 True,不相等则返回提示 desc |
assertNotEqual(a,b,desc) | 不相等 |
assertTrue(a,desc) | 为真 |
assertFalse(a,desc) | 为假 |
assertIs(a,b,desc) | 同一个对象 |
assertIsNot(a,b,desc) | 非同一个对象 |
assertIsNone(a,desc) | 为空 |
assertIsNotNone(a,desc) | 非空 |
assertIsIn(a,b,desc) | a in b |
assertIsNotIn(a,b,desc) | a not in b |
assertIsIsInstance(a,b,desc) | a 是 b 的实例 |
assertIsNotIsInstance(a,b,desc) | a 不是 b 的实例 |
assertIsGreater(a,b) | a > b |
assertIsGreaterEqual(a,b) | a >= b |
assertLess(a,b) | a < b |
assertLessEqual(a,b) | a <= b |
(7)函数执行顺序
(8)完整代码
import unittest
from day05.pc import PC
class MyTestCase(unittest.TestCase):
@classmethod # 装饰器
def setUpClass(cls): # 在所有用例执行之前执行一次
print('-- all start --')
cls.pc=PC() # 类变量,实例化PC类得到一个该类对象
@classmethod # 装饰器
def tearDownClass(cls): # 在所有用例执行之后执行一次
print('-- all over --')
def setUp(self): # 在每个用例执行之前执行一次
print('--any start')
def tearDown(self): # 在每个用例执行之后执行一次
print('--any over')
# 有效等价类:合法的数字相除
def test_01(self): #一个用例
print('test01')
r=self.pc.div(100,20)
# 断言相等:assertEqual(期望值,实际值,显示内容)
self.assertEqual(5,r,'100÷20=5')
# 无效等价类:除以0
def test_02(self): # 一个用例
print('test02:除零')
r=self.pc.div(100,0)
self.assertEqual(None,r,'除数不能为0')
# 无效等价类:字符串
def test_03(self): # 一个用例
print('test03:除字符串')
r = self.pc.div('100', 'abc')
self.assertEqual(None, r, '不能为字符串')
# 无效等价类:数字字符串
def test_04(self): # 一个用例
print('test04:除数字字符串')
r = self.pc.div('100', '20')
self.assertEqual(5, r, '不能为字符串')
if __name__ == '__main__':
unittest.main()
(9)pc_unit 运行结果,除了 test_01 用例,其他都报错
4. 修改类 PC
(1)使 test_02、test_03、test_04 用例能通过
修改 PC 类的 div 除方法:
1、除数不能为0
2、数字型字符串,转换为浮点类型
3、非数字字符串,返回 None
(2)使用 try - except 捕获异常,处理异常
try: # 尝试执行下面代码,若报错,转到 except 执行
return float(x) / float(y) # 数字型字符串,转换为浮点类型
except:
return None # 非数字字符串,返回 None
- try - except - finaly 的使用
try:
# 执行语句
# 捕获异常进入 except 块
# 若无异常进入 else 块
except error as e:
# 处理异常
# 一个 except 块可有多个异常
# try 块只有一个,except 块可有多个
else:
# 执行语句
finally:
# 执行语句,最后都会被执行
(3)完整代码:
class PC(object):
def add(self,x,y):
return x+y
def sub(self,x,y):
return x-y
def mul(self,x,y):
return x*y
def div(self,x,y):
try: # 尝试执行下面代码,若报错,转到 except 执行
return float(x) / float(y)
except:
return None
if __name__=='__main__':
pc=PC()
print(pc.add(100,2000))
print(pc.sub(100, 2000))
print(pc.mul(100, 2000))
print(pc.div(100, 4))
(4)pc_unit 运行结果,所有用例通过