ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python进阶教程:单元测试与代码质量

Python进阶教程:单元测试与代码质量 目录Python进阶教程单元测试与代码质量一、为什么需要测试二、unittest 基础三、setUp 与 tearDown四、pytest更简洁的框架五、Mock模拟外部依赖六、代码质量工具6.1 代码风格检查6.2 覆盖率统计七、实战为工具类编写测试总结Python进阶教程单元测试与代码质量本文是Python 入门教程系列的第 14 篇扩展篇。上一篇讲解了装饰器与生成器本篇介绍如何用单元测试保障代码质量。一、为什么需要测试随着代码规模增长手动验证越来越不可靠。自动化测试能快速回归改动代码后立即发现是否破坏原有功能驱动设计写测试时倒逼代码结构清晰保障重构放心地优化代码而不怕改坏二、unittest 基础unittest 是 Python 内置测试框架importunittestdefadd(a,b):returnabdefdivide(a,b):ifb0:raiseValueError(除数不能为零)returna/bclassTestMath(unittest.TestCase):deftest_add(self):self.assertEqual(add(1,2),3)self.assertEqual(add(-1,1),0)deftest_divide(self):self.assertEqual(divide(10,2),5)withself.assertRaises(ValueError):divide(10,0)if__name____main__:unittest.main()运行python -m unittest test_math.py三、setUp 与 tearDownimportunittestclassTestDatabase(unittest.TestCase):defsetUp(self):每个测试前执行self.data{name:Alice,age:20}deftearDown(self):每个测试后执行self.data.clear()deftest_data(self):self.assertEqual(self.data[name],Alice)classmethoddefsetUpClass(cls):整个测试类执行前运行一次print(开始测试)classmethoddeftearDownClass(cls):整个测试类执行后运行一次print(测试结束)四、pytest更简洁的框架pytest 语法更简洁是社区主流pip install pytest# test_calculator.pyimportpytestdefadd(a,b):returnabdeftest_add_positive():assertadd(1,2)3deftest_add_negative():assertadd(-1,-2)-3# 参数化测试pytest.mark.parametrize(a,b,expected,[(1,2,3),(0,0,0),(-5,5,0),])deftest_add_param(a,b,expected):assertadd(a,b)expected# 异常断言deftest_add_raises():withpytest.raises(TypeError):add(1,2)运行pytest test_calculator.py -v五、Mock模拟外部依赖测试中经常需要模拟网络、数据库等外部依赖fromunittest.mockimportMock,patchdefget_user_data(api):从 API 获取用户数据依赖外部服务respapi.get(/users/1)returnresp.json()[name]deftest_get_user_data():# 创建一个 Mock APImock_apiMock()mock_api.get.return_value.json.return_value{name:Alice}resultget_user_data(mock_api)assertresultAlicemock_api.get.assert_called_with(/users/1)六、代码质量工具6.1 代码风格检查# 安装pipinstallflake8 black mypy# 检查代码风格flake8 my_module.py# 自动格式化black my_module.py# 类型检查mypy my_module.py6.2 覆盖率统计# 安装pipinstallcoverage# 统计测试覆盖率coverage run-mpytest coverage report# 查看报告coverage html# 生成 HTML 报告七、实战为工具类编写测试# calculator.pyclassCalculator:defadd(self,a,b):returnabdefsubtract(self,a,b):returna-bdefmultiply(self,a,b):returna*bdefdivide(self,a,b):ifb0:raiseValueError(不能除以零)returna/b# test_calculator.pyimportpytestfromcalculatorimportCalculatorpytest.fixturedefcalc():测试夹具为每个测试提供实例returnCalculator()deftest_add(calc):assertcalc.add(2,3)5deftest_subtract(calc):assertcalc.subtract(10,4)6deftest_divide(calc):assertcalc.divide(8,2)4deftest_divide_by_zero(calc):withpytest.raises(ValueError):calc.divide(1,0)总结本篇介绍了 unittest 与 pytest 两大测试框架、Mock 模拟外部依赖、以及 flake8/black/mypy/coverage 等代码质量工具并为计算器类编写了完整测试。养成写测试的习惯是成为专业开发者的重要一步。
返回列表