pytest单个文件执行成功,整个项目执行pytest命令时报错:No module named ‘xxx’

问题现象

在单个执行test_login.py文件时,Pytest是跑通了没有问题的。但是在虚拟环境的终端里去执行pytest命令时,报错:No module named ‘page’

  1. 通过pytest执行用例会返回异常:ModuleNotFoundError: No module named '***'
  2. 通过python -m pytest执行用例可以正常执行
  3. 通过pycharm进行run对应的用例文件,可以正常执行

原因分析

python -m pytest和pytest区别

  • python -m pytest会把当前项目的目录添加到sys.path(指定模块的搜索路径)中
  • 通过pycharm进行运行的时候也会把项目当前所在路径添加到sys.path中
  • 因此问题出在项目所在目录为添加到sys.path中,所以找不到指定的模块

可以通过下面方式和验证:

1.进入当前虚拟环境中,打印sys.path。没有当前项目路径。C:\Users\Lenovo\PycharmProjects\pythonProject1

2.点击pycharm下面的python控制台。可以看到自动添加了项目路径

pytest导入机制

  • 一开始找到原因时由于没有把项目目录添加到sys.path中,网上大部分的解决办法都是手动添加到sys.path中。
  • 由于之前做的项目都不需要手动添加也可以进行导入,为了解答此疑惑,了解了一下pytest导入模块的机制,以此项目目录进行说明,如下:
    • pytest在收集用例时找到pythonProject1/case/test_login.py,因为没有init.py文件,所以test_login.py不是包中的一部分,只会把路径pythonProject1/case/添加到sys.path
    • 未添加pythonProject1/路径到sys.path中,所以在test_login.py中通过from page.page_login import UserLogin进行模块导入时,会找不到对应的模块

解决办法

方法一:通过sys.path

在项目目录下新建conftest.py文件。代码如下:

import sys, os
sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))))

方法二:通过包的作用

case目录下添加__init__.py文件,case目录会被识别成package,为了导入page模块,因此会把项目路径pythonProject/路径添加到sys.path

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享