pipenv install mypy --dev
默认情况下,Mypy 将递归检查所有导入包的类型注释,当库不包含这些注释时,就会报错 。我们需要将 mypy 配置为仅在我们的代码上运行,并忽略没有类型注释的导入错误 。我们假设我们的代码位于以下配置的 best_practices 包中 。将此添加到 setup.cfg :
[mypy]files=best_practices,testignore_missing_imports=true
现在我们可以运行 mypy 了:
pipenv run mypy
这是一个有用的 备忘单[7] 。
用 pytest 和 pytest-cov 进行测试使用 pytest[8] 编写测试非常容易,消除编写测试的阻力意味着可以快速的编写更多的测试!
pipenv install pytest pytest-cov --dev
这是 pytest 网站上的一个简单示例:
# content of test_sample.pydef inc(x): return x + 1def test_answer(): assert inc(3) == 5
要执行它:
$ pipenv run pytest=========================== test session starts ============================platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.ycachedir: $PYTHON_PREFIX/.pytest_cacherootdir: $REGENDOC_TMPDIRcollected 1 itemtest_sample.py F [100%]================================= FAILURES =================================_______________________________ test_answer ________________________________ def test_answer():> assert inc(3) == 5E assert 4 == 5E + where 4 = inc(3)test_sample.py:6: AssertionError========================= 1 failed in 0.12 seconds =========================
我们所有的测试代码都放在 test 目录中,因此请将此目录添加到 setup.cfg :
[tool:pytest]testpaths=test
如果还想查看测试覆盖率 。创建一个新文件 .coveragerc,指定只返回我们的项目代码的覆盖率统计信息 。比如示例的 best_practices 项目,设置如下:
[run]source = best_practices[report]exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about missing debug-only code: def __repr__ if self.debug # Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError # Don't complain if non-runnable code isn't run: if 0: if __name__ == .__main__.:
现在,我们就可以运行测试并查看覆盖率了 。
pipenv run pytest --cov --cov-fail-under=100
--cov-fail-under=100 是设定项目的测试覆盖率如果小于 100% 那将认定为失败 。
pre-commit 的 Git hooksGit hooks 可让您在想要提交或推送时随时运行脚本 。这使我们能够在每次提交/推送时,自动运行所有检测和测试 。pre-commit[9] 可轻松配置这些 hooks 。
Git hook 脚本对于在提交代码审查之前,识别简单问题很有用 。我们在每次提交时都将运行 hooks,以自动指出代码中的问题,例如缺少分号、尾随空白和调试语句 。通过在 code review 之前指出这些问题,代码审查者可以专注于变更的代码内容,而不会浪费时间处理这些琐碎的样式问题 。在这里,我们将上述所有工具配置为在提交 Python 代码改动时执行(git commit),然后仅在推送时运行 pytest coverage(因为测试要在最后一步) 。创建一个新文件 .pre-commit-config.yaml,配置如下:
repos: - repo: local hooks: - id: isort name: isort stages: [commit] language: system entry: pipenv run isort types: [python] - id: black name: black stages: [commit] language: system entry: pipenv run black types: [python] - id: flake8 name: flake8 stages: [commit] language: system entry: pipenv run flake8 types: [python] exclude: setup.py - id: mypy name: mypy stages: [commit] language: system entry: pipenv run mypy types: [python] pass_filenames: false - id: pytest name: pytest stages: [commit] language: system entry: pipenv run pytest types: [python] - id: pytest-cov name: pytest stages: [push] language: system entry: pipenv run pytest --cov --cov-fail-under=100 types: [python] pass_filenames: false
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 它是Excel最短的一个函数:N,你知道怎么使用吗
- 私域流量如何高效运营:中老年买单决策30%是情感原因
- 如何保障一场千万级大型直播?
- 农商银行和农村信用社是一个银行吗?
- 蜀国什么时候建立的 蜀国谁建立
- 霍山黄芽真假如何辨,霍山黄芽价格多少
- 如何选择女士睡衣
- 使用一个28mm焦距的镜头拍摄10m外,焦距24mm到70mm镜头?
- 清政府建立的海军主力 清朝初期战斗力
- 企业宣传画册印刷如何制作