文章插图
flake8 example.py的检查结果:
文章插图
flake8默认会忽略一些约定(E , F) , 如果我们检查所有约定:
flake8 --select E,F example.py , 结果:
文章插图
和isort一样 , 为了配合兼容Black , 需要在setup.cfg中额外配置:
[flake8]ignore = E203, E266, E501, W503max-line-length = 88max-complexity = 18select = B,C,E,F,W,T4mypy静态类型
文章插图
Mypy是Python的可选静态类型检查器 , 可以用结合动态(或"鸭子")类型和静态类型优点其他代码的性能 。通过Mypy将Python的动态类型便捷性和表现力的优势与静态类型强系统和编译时类型检查相结合 , 并且生成原生代码 , 支持通过Python VM运行 , 可以没有运行时开销的高性能运行 。在Python中使用静态类型好处有:
可以使程序更易于理解和维护;
可以帮助编译时调试和发现错误 , 减少测试和调试 。
可以在代码部署到生产环境之前就可以找到难以捕捉的错误 。
可以使用pipenv直接安装Mypy:
pipenv install mypy –devmypy动态类型和静态类型一个示例如下:
文章插图
项目配置默认情况下 , Mypy会递归检查所有类型注释的导入 , 这会导致库不包含这些注释时出错 。需要修改mypy配置仅检查当前代码运行 , 并忽略没有类型注释的import模块 。这也可以在setup.cfg中设置:
[mypy]files=项目,testignore_missing_imports=true代码测试程序开发中 , 除了写代码外 , 另外一个重要的部分是单元测试 。Python测试方面我们要介绍的工具有pytest 。
文章插图
可以使用pipenv添加测试工具包及扩展:
pipenv install pytest pytest-cov --devPytest框架可以让编写小测试变得容易 , 而且支持以扩展的方式提供更加复杂的功能 。下面是pytest网站的一个简单示例:
# content of test_sample.pydef inc(x):return x + 1def test_answer():assert inc(3) == 5通过以下命令测试
pipenv run pytest结果如下:
文章插图
pytest-cov是pytest的单元测试行覆盖率的插件 。pytets-cov的测试结果示例如下:
文章插图
pytest还有很多的扩展插件:
pytest-cov: 单元测试覆盖率报告
pytest-django: 对Django框架的单元测框架
pytest-asyncio:对asyncio的支持
pytest-twisted: 对twisted框架的单元测框架
pytest-instafail: 发送错误时报告错误信息
pytest-bdd 测试驱动开发工具
pytest-konira 测试驱动开发工具
pytest-timeout: 支持超时功能
pytest-pep8: 支持PEP8检查
pytest-flakes: 结合pyflakes进行代码检查
更多插件可以查看github pytest-dev组织下的项目 。
项目配置项目中 , 所有的测试都应该放在test目录中 , 我需要给setup.cfg添加配置:
[tool:pytest]testpaths=test单元覆盖率的项目配置需要创建一个新文件.coveragerc返回应用程序代码的覆盖率统计信息 , 配置示例如下:
[run]source = 项目[report]exclude_lines =pragma: no coverdef __repr__if self.debugraise AssertionErrorraise NotImplementedErrorif 0:if __name__ == .__main__.:然后再工程中运行一下命令 , 测试项目的覆盖率
pipenv run pytest --cov --cov-fail-under =100如果程序代码的测试覆盖率低于100% , 就会报错 。
Git pre-commit hook规范检查Git hook可以让我们在提交或推送时执行检查脚本 , 脚本可以配置对项目镜像测试或者规范性检查 。运行脚本 。我们可以配置pre-commit hook允许轻松配置这些钩子 , 下面.pre-commit-config.yaml配置示例可以帮我们自动做代码规范化 , 包括isort检查、black检查、flake8检查、mypy静态类型检查、pytest测试、pytest-cov测试覆盖率检查:
repos:- repo: localhooks:- id: isortname: isortstages: [commit]language: systementry: pipenv run isorttypes: [python]- id: blackname: blackstages: [commit]language: systementry: pipenv run blacktypes: [python]- id: flake8name: flake8stages: [commit]language: systementry: pipenv run flake8types: [python]exclude: setup.py- id: mypyname: mypystages: [commit]language: systementry: pipenv run mypytypes: [python]pass_filenames: false- id: pytestname: pyteststages: [commit]language: systementry: pipenv run pytesttypes: [python]- id: pytest-covname: pyteststages: [push]language: systementry: pipenv run pytest --cov --cov-fail-under=100types: [python]
推荐阅读
- 嘘,认真看!Layui一定是Java程序员必备后台前端框架
- Python 语言基础变量获得变量类型
- 微信小程序开发:一篇文章掌握基础配置、基本语法和功能
- 微信小程序开发教程:WeUI一个专为微信小程序设计的UI框架
- Python线上环境如何优雅地使用日志?
- Windows Python 命令行如何退出
- 如何通过Python批量生成测试报文?
- 使用Python管理网络设备
- 四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?
- 北方存茶要注意三点,台湾茶企三点刻将开发工业观光游