如何检测pytest需要运行的测试?
到目前为止,我在CI中进行了所有的测试。太慢了。
难道没有一种方法可以自动检测哪些测试需要运行,并且只执行整个测试套件的一小部分?
背景:我正在读谷歌SE ( Google )的书,还读到了他们巨大的单细胞体,他们的工具火焰可以检测到哪些测试需要运行。听起来很酷。
发布于 2021-05-14 19:09:11
我对pytest-testmon有很好的经验,它根据测试覆盖率确定要在代码更改上执行的测试子集。这方面的细节在确定受影响试验的testmon文档中解释得很清楚,但一般的建议是保持高行/分支覆盖,以使testmon有效。这也意味着,如果coverage失败,它就会失败。
如果要在CI中使用它,则需要在测试作业之间缓存.testmondata数据库文件,并确保在调用pytest时使用--testmon arg。它也取决于您的CI提供者,但最流行的那些提供缓存机制(Github,Gitlab,CircleCI,Appveyor等)。
testmon还可以与pytest-watch看门狗有效地结合,以保持一个守护进程以运行测试执行。一个示例命令,用于重新运行代码更改的测试子集,并在成功或失败时发送系统通知:
$ pytest-watch --runner="pytest --testmon" \
--onfail="notify-send --urgency=low -i error 'Tests Failed'" \
--onpass="notify-send --urgency=low -i info 'Tests passed'"您也可以使用Bazel进行构建和测试;但是,IMO对于纯Python项目来说是过分的,仅仅为了增量测试目的而不值得这样做。
发布于 2021-05-13 14:12:00
您可以为此使用pytest-增量插件,它使用AST分析项目的导入结构,并且只运行源代码已更改的测试。
pip install pytest-incremental
python -m pytest --inc

分析图表很容易看出,app中的更改只会导致执行test_app。而util中的更改将导致执行所有的测试。
发布于 2021-05-05 12:39:32
可以将@pytest.mark添加到测试中
@pytest.mark.SomeFeature
@pytest.mark.Regression
def test_example1(self):
pass
@pytest.mark.AnotherFeature
@pytest.mark.Regression
def test_example2(self):
pass并在触发测试时使用它
pytest TestsFolder -m SomeFeature这将只运行test_example1,-m Regression将运行这两个测试。
https://stackoverflow.com/questions/67398655
复制相似问题