pytest封神之路第七步 用例查找原理
时间:2022-07-26
本文章向大家介绍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__方法。
- Silverlight中的序列化
- 第四次工业革命
- 每周.NET前沿技术文章摘要(2017-06-07)
- 再谈Silverlight中的对象序列化/反序列化
- jQuery打造智能提示插件
- 每周.NET前沿技术文章摘要(2017-05-17)
- 每周.NET前沿技术文章摘要(2017-05-24)
- ruby学习笔记(10)-puts,p,print的区别
- Linux下的Mongodb部署应用梳理
- Ocelot API网关的实现剖析
- ruby学习笔记(9)-别名(alias)与方法取消(undef,remove_method)
- Pupet自动化管理环境部署记录
- ruby学习笔记(8)-"静态方法的4种写法"与"单例方法的2种写法"
- Puppet常识梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WordPress移除head头部js、css、feed等多余加载项
- python控制鼠标键盘,解放你的双手~
- 用腾讯云批量计算(batch-compute)调度GPU分布式机器学习
- R语言模拟保险模型中分类器的ROC曲线不良表现
- Linux xargs grep zgrep命令
- r语言空间可视化绘制道路交通安全事故地图
- 小知识:Oracle RAC添加服务名实现单节点访问
- Python去掉图片四周纯色边框
- R语言空间可视化:绘制英国脱欧投票地图
- CC攻击防御的一种方法
- 机器学习笔记之梯度下降算法原理讲解
- 使用OpenCV在Python中进行图像处理
- R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化生成GIF动画
- Shiny-R语言轻松开发交互式web应用
- SPSS中的等级线性模型Multilevel linear models研究整容手术数据