使用pytest时找不到模块

时间:2018-10-26 15:00:20

标签: python pytest

我有一个使用Python 3的virtualenv,目前正在使用pytest进行测试。我已经打包了一个名为“ process_expiring_passwords”的程序,并从名为“ pep.py”的常规脚本文件中导入了此程序包。我还在virtualenv中使用pip安装了process_expiring_passwords软件包。

但是,当我运行测试时,出现以下错误:

  导入测试模块时

ImportError   “ /home/username/projects/process-expiring-passwords/tests/test_process_expiring_passwords.py”。

     

提示:请确保您的测试模块/软件包具有有效的Python名称。

     

跟踪:tests / test_process_expiring_passwords.py:3:在       从process_expiring_passwords导入ProcessExpiringPasswords process_expiring_passwords / process_expiring_passwords.py:16:在          来自process_expiring_passwords.models.ProcessExpiringPasswordsLog

     

\ E ModuleNotFoundError:未命名模块   'process_expiring_passwords.models'; “ process_expiring_passwords”为   不是包裹

在pytest无法找到所述软件包的情况下,为什么可以使用我的pep.py常规脚本文件中的软件包?

与此问题相关的代码的基本部分如下:

pep.py:

from process_expiring_passwords.process_expiring_passwords \
    import ProcessExpiringPasswords

pep = ProcessExpiringPasswords()
pep.process()

process_expiring_passwords / process_expiring_passwords.py:

from process_expiring_passwords.models.ProcessExpiringPasswordsLog \
    import ProcessExpiringPasswordsLog

class ProcessExpiringPasswords:
    def __init__(self):
        self.example = 0
    def process():
        pepl = ProcessExpiringPasswordsLog()

process_expiring_passwords / models / ProcessExpiringPasswordsLog.py:

class ProcessExpiringPasswordsLog():
    def __init__(self):
        self.example = 0

process_expiring_passwords / setup.py:

# ref: https://github.com/pypa/sampleproject/blob/master/setup.py
# ref: http://python-packaging.readthedocs.io/en/latest/minimal.html
from setuptools import setup

setup(
    name='process_expiring_passwords',
    version='0.0.1',
    packages=find_packages(),
    description='Process expiring passwords',
    license='MIT',
    install_requires=[
        'apiclient',
        'google-api-python-client',
        'httplib2',
        'mysqlclient',
        'oauth2client',
        'requests',
        'SQLAlchemy',
    ],
)

tests / test_process_expiring_passwords.py:

from process_expiring_passwords import ProcessExpiringPasswords

def test_pep():
    pep = ProcessExpiringPasswords()
    assert pep is not None

项目结构:

process_expiring_passwords
    pep.py
    process_expiring_passwords
        __init__.py
        models
            __init__.py
            ProcessExpiringPasswordsLog.py
        process_expiring_passwords.py
        setup.py
    tests
        test_process_expiring_passwords.py

注意:

  • 基于Matt的反馈更新了代码示例和setup.py 梅塞尔史密斯。

2 个答案:

答案 0 :(得分:1)

您的代码在发布时无法正常工作,我对其进行了修改,使其在构造函​​数和成员函数中具有self关键字。之后,我可以运行pep.py。

  

我可以使用pep.py中的程序包吗?   常规脚本文件,而pytest无法找到所述软件包?

是的,当您位于顶级process_expiring_passwords目录中时,可以运行pep.py,因为您将获得软件包的“本地”导入。

测试未运行的事实与pytest无关,而与您的import语句的外观以及您未构建包的事实有关:

from process_expiring_passwords import ProcessExpiringPasswords

您尚未创建名为process_expiring_passwords的软件包。您可以通过执行python setup.py bdist_wheel(或只需执行sdist并解压缩tarball),解压滚轮并注意不存在任何软件包来进行验证。

通常,您需要安装软件包python setup.py install(这会破坏您的站点软件包中的可分发内容),并且还必须在setup.py中命名这些软件包(find_packages()是您的朋友) ,然后您的测试应该(或多或少)按预期工作。

HTH。

答案 1 :(得分:1)

an extended conversation之后,根据@hoefling的评论,以及根据@Matt Messersmith的回答将packages=find_packages(),添加到setup.py之后,以下步骤特别有用: / p>

  1. setup.py移动到了根项目目录
  2. 已删除__pycache__个文件
  3. 在主要模块文件中建立了相对导入

    process_expiring_passwords / process_expiring_passwords.py:

    from .models.ProcessExpiringPasswordsLog \ import ProcessExpiringPasswordsLog

  4. 运行了python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

  5. easy-install.pth 中删除了旧的包装行(应使用上一步中的结果路径找到该行)
  6. 运行了pip install -e .
  7. 在测试文件的导入部分中添加了process_expiring_passwords

    from process_expiring_passwords.process_expiring_passwords \ import ProcessExpiringPasswords