问题现象
在单个执行test_login.py
文件时,Pytest是跑通了没有问题的。但是在虚拟环境的终端里去执行pytest命令时,报错:No module named ‘page’
- 通过
pytest
执行用例会返回异常:ModuleNotFoundError: No module named '***'
- 通过
python -m pytest
执行用例可以正常执行 - 通过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
进行模块导入时,会找不到对应的模块
- pytest在收集用例时找到
解决办法
方法一:通过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