python写单元大多数都会用到unittest和mock,测试代码覆盖率都会用到coverage,后再用nose把所有的东西都串起来,这样每次出版本,都能把整个项目的单元测试都运行一遍。
  Unittest
  unittest不详细介绍了,注意几点:
  测试类继承unittest.TestCase
  测试类、测试方法名字好以test开头,很多工具能根据名字来自动运行,很方便
  测试类里面的setUp/tearDown会在每个case执行之前/之后执行,setUpClass/tearDownClass加上@classmethod在整个测试类开始和结束的时候执行
  测试文件的main函数里面加上unittest.main(),可以直接用python命令运行了
  Mock
  单元测试里面比较精髓的是mock了,介绍几种常见的场景:
  1. Mock一个函数。其实有好几种方法,个人比较推荐下面这种,看上去很清晰:

 

def multiple(a, b):
return a*b
class TestProducer(unittest.TestCase):
def setUp(self):
self.calculator = Calculator()
@mock.patch('multiple')
def test_multiple(self, mock_multiple):
mock_multiple.return_value = 3
self.assertEqual(multiple(8, 14), 3)

  2. Mock一个对象里面的方法

class Calculator(object):
def add(self, a, b):
return a+b
class TestProducer(unittest.TestCase):
def setUp(self):
self.calculator = Calculator()
@mock.patch.object(Calculator, 'add')
def test_add(self, mock_add):
mock_add.return_value = 3
self.assertEqual(self.calculator.add(8, 14), 3)
  3. 让Mock的函数每次被调用返回不同的值,而1,2中的方法每次调用都会返回同样的值
class TestProducer(unittest.TestCase):
@mock.patch.object(Calculator, 'add')
def test_effect(self, mock_add):
mock_add.side_effect = [1, 2, 3]
self.assertEqual(self.calculator.add(8, 14), 1)
self.assertEqual(self.calculator.add(8, 14), 2)
self.assertEqual(self.calculator.add(8, 14), 3)