【pytest】fixtrue 加载顺序

【背景】在公司搭建框架的时候,发现在testcase根目录的conftest.py 加载失败,filemenu 模块目录下的conftest.py 一直包get_driver 找不到?

【分析】

1、了解conftest.py加载顺序?

  • 收集测试:pytest首先会遍历文件系统,找到所有符合测试命名规则的Python文件(如以test_开头或以_test结尾的文件,或者在tests目录中的文件),并收集这些文件中的测试函数或方法。

  • 解析fixtures:pytest会分析每个测试函数或方法的签名,找出它们所依赖的fixtures。这些fixtures可能是直接在函数签名中声明的,也可能是通过其他方式(如装饰器或模块级别的变量)指定的。

  • 确定fixtures的依赖关系:pytest会分析fixtures之间的依赖关系。如果一个fixture在定义时接收了另一个fixture作为参数,那么它就依赖于那个fixture。pytest会构建一个fixtures的依赖图。

  • 按照依赖顺序调用fixtures:在执行测试之前,pytest会按照fixtures的依赖顺序调用它们。首先会调用没有依赖关系的fixtures(即叶节点),然后逐层向上调用有依赖关系的fixtures(即非叶节点)。每个fixture的返回值都会被缓存起来,以便在需要时提供给测试函数或方法。

  • 执行测试:当所有fixtures都准备好之后,pytest会调用测试函数或方法,并将它们所依赖的fixtures的返回值作为参数传递进去。

  • 清理fixtures:测试执行完毕后,pytest会按照与调用顺序相反的顺序清理fixtures。这通常包括执行任何必要的清理操作(如关闭文件、断开数据库连接等),以及释放由fixtures分配的资源。

2、针对于fixtrue 中 autouse=True 的加载顺序?

 

  • 作用域(Scope)顺序:
    • autouse=True的fixtures根据其作用域(sessionmoduleclassfunction)的顺序来执行。作用域更大的fixtures会先执行。
    • 具体的顺序是:session -> module -> class -> function
  • 同级别顺序:
    • 在相同的作用域下,如果有多个autouse=True的fixtures,它们的执行顺序主要取决于它们在conftest.py文件中的定义顺序(即从上到下)。
    • 如果这些fixtures定义在不同的conftest.py文件中,那么pytest会按照conftest.py文件在文件系统中的位置来决定它们的加载顺序。通常,离测试文件更近的conftest.py文件中的fixtures会先被加载和执行。
  • 自动调用与手动调用:
    • 如果一个fixture被标记为autouse=True,那么它会在测试函数或方法执行之前自动运行
    • 另一方面,如果一个fixture没有被标记为autouse=True,但它在测试函数或方法的签名中被显式声明了,那么它也会被执行,但通常会在自动使用的fixtures之后执行。
  • 依赖关系:
    • 如果一个fixture依赖于另一个fixture(即在一个fixture的定义中使用了另一个fixture作为参数),那么被依赖的fixture会先执行。这种依赖关系不受autouse参数的影响。
  • 文件位置:
    • 如果在多个conftest.py文件中定义了同名的autouse=True的fixtures,并且这些fixtures在同一个作用域下,那么pytest会根据conftest.py文件在文件系统中的位置来决定它们的加载顺序。通常,离测试文件更近的conftest.py文件中的fixtures会先被加载和执行。
  • 测试用例中的fixtures:
    • 如果在测试用例中直接定义了一个fixture(即该fixture没有定义在conftest.py文件中),并且这个fixture被标记为autouse=True,那么它的加载顺序将取决于它的作用域和其他factors(如文件位置、依赖关系等)。但是,它仍然会按照pytest的规则来执行。

【总结】

pytest 首先会收集测试用例数据,根据测试用例的命名(test_)等进行信息收集,收集完成后,会对测试用例中的fixtrue进行解析,并解析对应的依赖关系。然后测试用例在执行的时候分为两种情况,

  • fixtrue 为auto时,他会在测试用例执行之前自动运行。离测试用例近的优先进行执行。
  • fixtrue 为手动调用时,他会根据获取到的测试用例中 fixtrue的调用 顺序 ,如果存在依赖关系时,pytest 会自动处理调用

 

posted on 2024-05-13 10:29  彩屏黑白  阅读(2)  评论(0编辑  收藏  举报

导航