092-Python单元测试 (二)
今天我们来学习Python单元测试第二课
先来看一个例子
class Employee:
raise_amt = 1.05
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
@property
def email(self):
return '{}.{}@email.com'.format(self.first, self.last)
@property
def fullname(self):
return '{} {}'.format(self.first, self.last)
def apply_raise(self):
self.pay = int(self.pay * self.raise_amt)
如何来对这个例子中的三个方法
1.email
2.fullname
3.apply_raise
进行测试呢,
很简单,运用已经学过的assert_Equal就可以了
我们把测试代码写出来
注意命名必须是test_xxx.py
比如如果是employee.py,那么测试文件就是test_employee.py
import unittest
from emp import Employee
class TestEmp(unittest.TestCase):
def test_email(self):
emp_1 = Employee('Bill', 'Gates', 1000)
emp_2 = Employee('Steve', 'Jobs', 2000)
self.assertEqual(emp_1.email, '[email protected]')
self.assertEqual(emp_2.email, '[email protected]')
def test_fullname(self):
emp_1 = Employee('Bill', 'Gates', 1000)
emp_2 = Employee('Steve', 'Jobs', 2000)
self.assertEqual(emp_1.fullname, 'Bill Gates')
self.assertEqual(emp_2.fullname, 'Steve Jobs')
def test_apply_raise(self):
emp_1 = Employee('Bill', 'Gates', 1000)
emp_2 = Employee('Steve', 'Jobs', 2000)
emp_1.apply_raise()
emp_2.apply_raise()
self.assertEqual(emp_1.pay, 1050)
self.assertEqual(emp_2.pay, 2100)
都是使用assertEqual方法进行测试
在这个测试代码中,我们发现,
在每个测试方法中,我们都写了
emp_1 = Employee('Bill', 'Gates', 1000) emp_2 = Employee('Steve', 'Jobs', 2000)
那么这显然是冗余的,
如何将这两行创建对象的代码,在每个测试方法中复用呢
我们需要用到 setUp方法
import unittest
from emp import Employee
class TestEmp(unittest.TestCase):
def setUp(self):
print('setUp')
self.emp_1 = Employee('Bill', 'Gates', 1000)
self.emp_2 = Employee('Steve', 'Jobs', 2000)
def test_email(self):
print('test_email')
self.assertEqual(self.emp_1.email, '[email protected]')
self.assertEqual(self.emp_2.email, '[email protected]')
def test_fullname(self):
print('test_fullname')
self.assertEqual(self.emp_1.fullname, 'Bill Gates')
self.assertEqual(self.emp_2.fullname, 'Steve Jobs')
def test_apply_raise(self):
print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()
self.assertEqual(self.emp_1.pay, 1050)
self.assertEqual(self.emp_2.pay, 2100)
如上代码,我们添加了setUp方法,
setUp方法会在每个测试方法执行前执行,
所以每次执行测试方法之前,都会给self赋两个 Employee
我们运行一下测试代码
setUp
test_apply_raise
setUp
test_email
setUp
test_fullname
Ran 3 tests in 0.004s
OK
我们看到,
先是setUp,然后是测试方法
setUp方法是在每个测试方法之前执行,
除了setUp,还有tearDown方法
tearDown方法是在每个测试方法之后执行,
此外,还有setUpClass和tearDownClass方法,与这两者的区别就是
class方法是整个class的之前和之后
我们来看下代码
import unittest
from emp import Employee
class TestEmp(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass')
@classmethod
def tearDownClass(cls):
print('tearDownClass')
def setUp(self):
print('setUp')
self.emp_1 = Employee('Bill', 'Gates', 1000)
self.emp_2 = Employee('Steve', 'Jobs', 2000)
def tearDown(self):
print('tearDown')
def test_email(self):
print('test_email')
self.assertEqual(self.emp_1.email, '[email protected]')
self.assertEqual(self.emp_2.email, '[email protected]')
def test_fullname(self):
print('test_fullname')
self.assertEqual(self.emp_1.fullname, 'Bill Gates')
self.assertEqual(self.emp_2.fullname, 'Steve Jobs')
def test_apply_raise(self):
print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()
self.assertEqual(self.emp_1.pay, 1050)
self.assertEqual(self.emp_2.pay, 2100)
看下运行结果
setUpClass
setUp
test_apply_raise
tearDown
setUp
test_email
tearDown
setUp
test_fullname
tearDown
tearDownClass
Ran 3 tests in 0.005s
OK
由此可见,class方法在开头与结尾,
setUp和tearDown则在之前和之后