我对 Python 还很陌生,正在尝试学习工具集。
我已经弄清楚如何让
py.test -f
在编码时观看我的测试。我还没弄清楚的一件事是是否有一种方法可以做一个更智能的观察者,就像 Ruby 的 Guard 库一样。
使用guard + minitest,我得到的行为是,如果我保存像
my_class.rb
这样的文件,那么my_class_test.rb
就会被执行,如果我在cli中点击enter
,它就会运行所有测试。
到目前为止,使用 pytest,我还无法找到一种方法来仅运行与最后一次触摸的文件相对应的测试文件,从而避免等待整个测试套件运行,直到当前文件通过。
Python 爱好者们会怎么做?
谢谢!
一种可能性是将 pytest-testmon 与 pytest-watch 一起使用。
它使用 coverage.py 来跟踪哪个测试涉及哪些代码行,一旦您更改一行代码,它就会重新运行以某种方式执行该行的所有测试。
要添加到上面@The Compiler的答案中,您可以使用pytest-watch的--runner
选项让pytest-testmon和
pytest-watch一起玩:
ptw --runner "pytest --testmon"
或者简单地说:
ptw -- --testmon
我得到的最快设置是当我将 @lmiguelvargasf @BenR 和 @TheCompiler 答案组合到此中时
ptw --runner "pytest --picked --testmon"
你首先必须安装它们
pip3 install pytest-picked pytest-testmon pytest-watch
还有 pytest-xdist,它有一个功能:
--looponfail:在子进程中重复运行测试。每次运行后 py.test 都会等待,直到项目中的文件发生更改,然后重新运行之前失败的测试。重复此操作,直到所有测试通过,然后再次执行完整运行。
如果您使用
git
作为版本控制,您可以考虑使用 pytest-picked
。根据文档,这是一个插件:
运行与未暂存文件或当前分支相关的测试
演示
pytest --picked
pytest-watch
在 2019 年停止维护,所以现在你应该使用 pytest-watcher
,它受到前者的启发,但不是它的分支。
唯一的变化是它采用路径作为参数。安装模块:
pip install pytest-testmon pytest-watcher
然后:
ptw . --testmon
您可以向此命令附加任何选项;例如,为了获得 HTML 形式的增量覆盖(使用
pytest-cov
),我使用:
ptw . --testmon --cov-report=html --cov-append
这确保我获得整个项目的覆盖范围,而不仅仅是其运行的测试所涉及的文件。