Python单元测试:由于从同一文件夹导入而失败

时间:2019-02-20 19:18:17

标签: python unit-testing testing import

这个问题看似微不足道,但我无法在网上找到单个答案。这是我的设置:

VsDevCmd.bat arch=amd64 && cmake <options> ... 

现在,我要跑步

project:
- src:
- - __init__.py (empty)
- - file1.py
- - file2.py
- test:
- - test1.py
- - test2.py
- - __init__.py (empty)

从项目文件夹中。

在test1.py中,我从第一个源文件导入和导入:

python -m unittest discover

但是在file1.py中,我是从另一个导入的:

from src.file1 import class1

如上所述运行单元测试会导致:

from file2 import class2

我在这里做什么错了?

谢谢您,祝您愉快!

1 个答案:

答案 0 :(得分:0)

您应完全限定进口产品的质量,而不是:

from file2 import class2

使用

from .file2 import class2

.之后注意from

更新:验证:

(dev) go|c:\srv\tmp\unttst\project> tree
.
|-- src
|   |-- __init__.py
|   |-- file1.py
|   `-- file2.py
`-- test
    |-- __init__.py
    `-- test1.py

2 directories, 5 files

(dev) go|c:\srv\tmp\unttst\project> type src\file1.py

from .file2 import Class2

class class1:
    pass

(dev) go|c:\srv\tmp\unttst\project> type src\file2.py


class Class2:
    pass

(dev) go|c:\srv\tmp\unttst\project> type test\test1.py

from src.file1 import class1

(dev) go|c:\srv\tmp\unttst\project> python -m unittest discover

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

(dev) go|c:\srv\tmp\unttst\project>

请注意,我正在从from src.xxx有意义的目录中运行命令。

更新2:注意,Python不能满足直接在子目录中(即作为入口点)运行单个文件的需要。 Guido强烈反对这种用法,因此这种情况不太可能改变。尽管您可以解决此问题,但正确的做法非常简单,值得学习。

我们首先将src/file1.py更改为具有main()功能:

(dev) go|c:\srv\tmp\unttst\project> cat src\file1.py

from .file2 import Class2

class class1:
    pass


def main():
    print("hello from main")

注意:我没有添加if __name__=="__main__"部分。

从命令行调用此函数的正确方法是使project成为“真实”包。

通过添加setup.py文件来创建“真实”包。 setup.py文件可以包含很多字段,但是此用例唯一需要的字段如下:

(dev) go|c:\srv\tmp\unttst\project> cat setup.py

from setuptools import setup

setup(
    name="myproject",
    entry_points={
        'console_scripts': """
            run-file1 = src.file1:main
        """
    }
)

请注意,setup.py位于project文件夹中。

接下来,您以“开发”模式安装软件包:

(dev) go|c:\srv\tmp\unttst\project> pip install -e .

最后请注意.

setup.py文件中的entry_points .. console_scripts现在为您创建了一个新的shell命令:

(dev) go|c:\srv\tmp\unttst\project> run-file1
hello from main

console_scripts行

run-file1 = src.file1:main

表示要创建一个名为run-file的shell命令,该命令应执行main中的src.file1函数。