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) |