zoukankan      html  css  js  c++  java
  • 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__方法。


    所有文章公众号【测试开发刚哥】首发!

    版权申明:本文为博主原创文章,转载请保留原文链接及作者。
  • 相关阅读:
    Linq to xml 示例分析
    Nhibernate学习笔记
    SQL – 11.练习
    集合 ArrayList
    分享一个不错的VS插件——CodeMap(转发)
    wamp配置虚拟主机,虚拟目录,伪静态
    RBAC (RoleBased Access Control)基于角色的访问控制
    PHP的面向对象
    一名靠谱的JavaScript程序员应备的素质
    Javascript 广告定位
  • 原文地址:https://www.cnblogs.com/df888/p/13751717.html
Copyright © 2011-2022 走看看