The Pytest Discovery
对于pytest,我一直是使用,看文档也是只看fixture那部分的。昨天跟公司的vp争论一个问题,vp觉得tests目录下不该有
__init__.py
文件,这样子对于unite test来说语义是不对的。要使用setup.py develop
将包装载后测试,这样就不会出现我引入__init__.py
的初衷,为了找到找不到要测试的包。
首先,我没有认真研究为啥找不到包,但是加了__init__.py
在tests目录就能够正常pytest命令跑完测试。也就是说我是不知道原因的情况下,误打误撞利用的pytest的机制。
为了搞清这个问题我认真阅读了该章 发现了如下的文字:
setup.py mypkg/ ... tests/ __init__.py foo/ __init__.py test_view.py bar/ __init__.py test_view.py
But now this introduces a subtle problem: in order to load the test modules from the
tests
directory, pytest prepends the root of the repository tosys.path
, which adds the side-effect that nowmypkg
is also importable.This is problematic if you are using a tool like tox to test your package in a virtual environment, because you want to test the installed version of your package, not the local code from the repository.
解释下,意思是,如果你通过添加__init__.py
改变测试目录,使其变为一个测试模块,那么pytest会将根目录添加到sys.path中,使得同级的python包mypkg也可以导入了。但是对于使用tox来多环境测试来说,这是有问题的。
所以mypkg也能导入这就是我能顺利运行pytest的原因,但是这种情况下,对tox使用不利,虽然公司的代码限定了python版本不需要使用tox。
laike9m 说conftest.py文件的机制能达到相同的效果,而且不需要__init__.py
。
找到文档描述在这
但是比较奇怪,需要人为加conftest.py
文件在待测试包的同级别目录
setup.py
mypkg/
...
conftest.py
tests/
foo/
__init__.py
test_view1.py
bar/
__init__.py
test_view2.py
这样子也行。。
无论哪种做法都是利用了pytest,而不是将包安装进site-packages