092-Python单元测试 (二)

 

 

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则在之前和之后

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(092-Python单元测试 (二))