打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
pytest封神之路第七步 用例查找原理


当执行pytest命令时,pytest会从project中查找test来执行。本文先从几个路径相关的概念讲起,这样便于理解pytest在遍历路径时的走向。

几个路径相关的概念

PYTHONHOME

定义了Python标准库的路径。

PYTHONPATH

定义了Python import模块搜索的路径。

basedir

①如果是module,目录中不包括__init__.py,basedir的值等于a
a
|--b_test.py
②如果是package,目录中包括__init__.py,basedir的值等于y
y
|--a
| |--b_test.py
| |--__init__.py // 表明a是package
③如果是package的package,目录中都包括__init__.py,basedir的值等于x
x
|--y
| |--a
| |--__init__.py // 表明y是package
| | |--b_test.py
| | |--__init__.py // 表明a是package

sys.path

模块搜索路径集,包括以上3个目录。它决定了import能否找到模块。

current working directory

当前工作目录,缩写cwd,等于执行pytest命令的目录。
如果用python -m pytest,以模块的方式来执行,会把cwd也加入sys.path中。
例如,在a目录下执行pytest,cwd是a,basedir是y,sys.path中只包含y。如果执行python -m pytest,sys.path中既包含y也包含a
y
|--a
| |--b_test.py
| |--__init__.py // 表明a是package

pytest查找原理

第一种情况

pytest命令是可以加参数的,如果加了文件夹/文件参数,那么就只在参数指定的文件夹/文件中查找,可以指定多个。例如
pytest a_dir b_dir c_test.py d_test.py
特殊的,如果a_dir中包含了c_test.py,那么会收集成2次,pytest也会执行2次。
也可以使用::来指定函数/类/方法,例如
pytest test_mod.py::test_func
pytest test_mod.py::TestClass::test_method

第二种情况

pytest不带参数。
  • 从“当前工作目录”开始找,递归查找子目录。匹配 test_*.py 或 *_test.py 的文件。
  • 找到这些模块(Python中1个.py文件就是1个模块)以后,进一步根据上节所述找basedir。
  • 调用sys.path.insert(0, basedir),把basedir加入sys.path中。这些模块就可以被pytest import了。
  • import之后,查找test开头的函数或方法。如果是类中的方法,类必须以Test开头,并且没有__init__方法。


 
如果你觉得这篇文章写的还不错的话,关注公众号,你的支持就是我写文章的最大动力。 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
pyinstaller打包找不到文件的问题解决
Python3 模块
Python imports指南
python模块导入及属性:import
python之路—模块和包
在Python中以绝对路径或者相对路径导入文件的方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服