专栏首页dongfangerpytest封神之路第七步 用例查找原理

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pytest封神之路第零步 快速入门

    背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest。如果...

    dongfanger
  • Django官方为什么没有标准项目结构

    Django官方并没有提供标准的项目结构,于是网上众说纷纭,百花齐放,一千个读者有一千个哈姆雷特。那我们该怎么设计项目结构呢?在回答这个问题之前,先了解一下Dj...

    dongfanger
  • pytest封神之路第二步 132个命令行参数用法

    在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个

    dongfanger
  • 《带你装B,带你飞》pytest成神之路2- 执行用例规则和pycharm运行的三种姿态

      今天北京下的雪好大好美啊!!!哎呀,忘记拍照片了,自己想象一下吧。言归真传,今天还是开始pytest的学习和修炼,上一篇写完后群里反响各式各样的,几家欢乐几...

    北京-宏哥
  • 初步了解Pytest测试框架

    最近加班再加上自己的懒惰,很久没有更新了,想想你停留在原地的时候,其他人正在努力,那你就会越来越落后,每天进步一点点,加油!!!关注公众号【‘软件测试小助手’】...

    小雯子打豆豆
  • [Django个人网站开发]·编写你的第一个 Django 应用-第 1 部分

    我们假定你已经阅读了 安装 Django。你能知道 Django 已被安装,且安装的是哪个版本,通过在命令提示行输入命令(由 $ 前缀)。

    小宋是呢
  • iOS自动化探索(四)自动化测试框架pytest - 安装和使用

    pytest是Python最流行的单元测试框架之一, 帮助更便捷的编写测试脚本, 并支持多种功能复杂的测试场景, 能用来做app测试也能用作函数测试

    周希
  • pytest文档15-使用自定义标记mark

    pytest可以支持自定义标记,自定义标记可以把一个web项目划分多个模块,然后指定模块名称执行。app自动化的时候,如果想android和ios公用一套代码时...

    上海-悠悠
  • Django安装及简单使用1.1

    Django安装及简单使用 1.1 Django的简要概述 Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。 代码都在github: U...

    98k
  • pytest文档1-环境准备与入门

    首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的。 刚开始我的内...

    上海-悠悠

扫码关注云+社区

领取腾讯云代金券