Python测试

单元测试、Mock、测试覆盖。

unittest

基础

import unittest


class CheckNumbers(unittest.TestCase):
    def setUp(self):
        pass

    def test_int_float(self):
        self.assertEqual(1, 1.0)

    def test_str_float(self):
        self.assertEqual(1, "1")
    
    @unittest.skip("Test is useless")
    def test_skip(self):
        self.assertEqual(False, True)

    
    def tearDown(self):
        pass

断言/Assertion

  • assertEqual
  • assertRaises

其他常用用法

  • expectedFailure()
  • skip(reason)
  • skipIf(condition, reason)
  • skipUnless(condition, reason)

执行

自动发现:

python -m unittest discover

mock

使用 Mock() 替换耗时对象或外部依赖

可以用 call_count 判断调用次数

from unittest.mock import Mock

用 patch 临时替换为固定值

import datetime
from unittest.mock import patch

fake_now = datetime.datetime(2020, 2, 22)
with patch("datetime.datetime") as dt:
    dt.now.return_value = fake_now

dt.now.assert_called_once_with()

代码覆盖率: coverage

pip install coverage

  • coverage run coverage_unittest.py : 会生成.coverage数据文件
  • coverage report : 基本报告
  • coverage html : 会生成 htmlcov文件夹,更丰富的报告

其他参数:

  • -m, –show-missing

扩展阅读

  • Python 3 Object-Oriented Programming : Chap.12