pytest学习 用例查找原理

597 篇文章 17 订阅
12 篇文章 3 订阅

当执行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__方法。

在这里插入图片描述
如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加入我们。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值