unittest基础概念unittest是Python内置的单元测试框架灵感来源于JUnit。核心概念包括Test Case测试用例最小的测试单元继承自unittest.TestCaseTest Suite测试套件多个测试用例的集合Test Runner测试运行器执行测试并输出结果Fixture测试夹具测试前的准备和测试后的清理工作二、编写第一个测试创建一个简单的计算器类及其测试123456789101112131415# calculator.pyclassCalculator:defadd(self, a, b):returnabdefsubtract(self, a, b):returna-bdefmultiply(self, a, b):returna*bdefdivide(self, a, b):ifb0:raiseValueError(除数不能为零)returna/b对应的测试代码1234567891011121314151617181920212223242526272829303132333435# test_calculator.pyimportunittestfromcalculatorimportCalculatorclassTestCalculator(unittest.TestCase):defsetUp(self):# 每个测试方法前执行self.calcCalculator()deftearDown(self):# 每个测试方法后执行passdeftest_add(self):self.assertEqual(self.calc.add(2,3),5)self.assertEqual(self.calc.add(-1,1),0)deftest_subtract(self):self.assertEqual(self.calc.subtract(10,5),5)self.assertEqual(self.calc.subtract(-1,-1),0)deftest_multiply(self):self.assertEqual(self.calc.multiply(3,4),12)self.assertEqual(self.calc.multiply(-2,3),-6)deftest_divide(self):self.assertEqual(self.calc.divide(10,2),5)self.assertAlmostEqual(self.calc.divide(7,2),3.5)deftest_divide_by_zero(self):withself.assertRaises(ValueError):self.calc.divide(10,0)if__name____main__:unittest.main()三、常用断言方法unittest.TestCase提供了丰富的断言方法方法用途assertEqual(a, b)验证a bassertNotEqual(a, b)验证a ! bassertTrue(x)验证x为TrueassertFalse(x)验证x为FalseassertIs(a, b)验证a is bassertIsNone(x)验证x is NoneassertIn(a, b)验证a in bassertIsInstance(a, b)验证isinstance(a, b)assertRaises(exc)验证抛出异常assertAlmostEqual(a, b)验证浮点数近似相等四、高级特性1. 跳过测试与预期失败123456789101112131415importunittestimportsysclassTestAdvanced(unittest.TestCase):unittest.skip(暂时跳过此测试)deftest_skip(self):passunittest.skipIf(sys.platformwin32,Windows平台跳过)deftest_skip_windows(self):passunittest.expectedFailuredeftest_expected_failure(self):self.assertEqual(1,2)# 已知会失败2. 使用Mock对象12345678910111213141516171819fromunittest.mockimportMock, patch, MagicMock# 创建Mock对象mockMock()mock.return_value42print(mock())# 输出: 42# 使用patch装饰器importrequestsclassTestAPI(unittest.TestCase):patch(requests.get)deftest_fetch_data(self, mock_get):mock_get.return_value.status_code200mock_get.return_value.json.return_value{data:test}resultrequests.get(https://api.example.com)self.assertEqual(result.status_code,200)mock_get.assert_called_once()五、测试组织与发现对于大型项目合理的测试组织至关重要12345678project/├── src/│ ├── __init__.py│ └── calculator.py└── tests/├── __init__.py├── test_calculator.py└── test_integration.py运行测试的多种方式1234567891011121314# 运行单个测试文件python -m unittest test_calculator# 运行具体测试类python -m unittest test_calculator.TestCalculator# 运行具体测试方法python -m unittest test_calculator.TestCalculator.test_add# 自动发现并运行所有测试python -m unittest discover -s tests -v# 生成HTML测试报告需安装html-testRunnerpipinstallhtml-testRunner六、最佳实践总结测试命名使用test_前缀描述清楚测试意图独立性每个测试应独立运行不依赖其他测试单一职责一个测试只验证一个概念使用setUp/tearDown合理管理测试资源Mock外部依赖单元测试应隔离外部系统覆盖率目标核心代码建议达到80%以上覆盖率使用coverage工具检查测试覆盖率1234pipinstallcoveragecoverage run -m unittest discovercoverage reportcoverage html# 生成HTML报告