`py.test`和`__init __.py`文件

Vla*_*hev 6 python unit-testing pytest

我认为它py.test是"独立的",因为它test_*.py"按原样" 处理文件,并且只导入这些文件中指定的模块,而不考虑任何周围的文件.看起来我错了.这是我的对话框py.test:

$ ls
__init__.py    test_pytest.py
$ cat __init__.py 
$ cat test_pytest.py 
def test_pytest():
    assert True
$ py.test test_pytest.py 
========================================================= test session starts ==========================================================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

================================================================ ERRORS ================================================================
___________________________________________________ ERROR collecting test_pytest.py ____________________________________________________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
======================================================= 1 error in 0.01 seconds ========================================================
$ rm __init__.py 
$ py.test test_pytest.py 
========================================================= test session starts ==========================================================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

test_pytest.py .

======================================================= 1 passed in 0.01 seconds =======================================================
$ 
Run Code Online (Sandbox Code Playgroud)

我如何py.test工作并仍然拥有我的__init__.py文件?

UPDATE

在评论中,Holger Krekel问,父目录的名称是什么.事实证明,我可以重现上面的错误只有一个父目录名称(例如,与安装的其中一个包同名distutils).看这里:

~/test_min 
$ tree
.
??? distutils
    ??? __init__.py
    ??? test_pytest.py

1 directory, 2 files
~/test_min 
$ cat distutils/__init__.py 
~/test_min 
$ cat distutils/test_pytest.py 
def test_pytest():
    assert True
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

=============================== ERRORS ===============================
_____________ ERROR collecting distutils/test_pytest.py ______________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
====================== 1 error in 0.01 seconds =======================
~/test_min 
$ rm distutils/__init__.py 
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

distutils/test_pytest.py .

====================== 1 passed in 0.01 seconds ======================
~/test_min 
$ touch __init__.py
~/test_min 
$ ls
__init__.py distutils
~/test_min 
$ touch distutils/__init__.py
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

distutils/test_pytest.py .

====================== 1 passed in 0.02 seconds ======================
~/test_min 
$ rm __init__.py 
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

=============================== ERRORS ===============================
_____________ ERROR collecting distutils/test_pytest.py ______________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
====================== 1 error in 0.01 seconds =======================
~/test_min 
$ mv distutils foobar
~/test_min 
$ py.test foobar/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

foobar/test_pytest.py .

====================== 1 passed in 0.01 seconds ======================
~/test_min 
$ 
Run Code Online (Sandbox Code Playgroud)

希望这些额外信息会有所帮助.

Bas*_*ork 14

看起来像py.test py._path.pyimport用来打开你的文件.如果__init__.py目录中有文件,它会将您的文件视为模块,否则会打开该文件.简而言之,删除__init__.py或将测试放在项目代码之外的另一个目录中(<---好主意).

http://doc.pylib.org/en/latest/_modules/py/_path/local.html#LocalPath.pyimport


tit*_*ito 5

我真的建议您将目录重命名为不称为“distutils”的内容。为什么 ?因为您正在覆盖现有模块。当“import distutils”或“from distutils import *”出现在脚本中时(来自另一个导入或你自己的python文件),它会更喜欢你的目录而不是系统目录。如果之前已经加载了模块 distutils,则不会加载您的 distutils,因为该符号已存在于 global() 中。

重命名该目录(如测试)而不是尝试使用 py.text / python 内部结构会更简单。