【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根据其作用域(session
、module
、class
、function
)的顺序来执行。作用域更大的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作为参数),那么被依赖的fixture会先执行。这种依赖关系不受
autouse
参数的影响。
- 如果一个fixture依赖于另一个fixture(即在一个fixture的定义中使用了另一个fixture作为参数),那么被依赖的fixture会先执行。这种依赖关系不受
- 文件位置:
- 如果在多个
conftest.py
文件中定义了同名的autouse=True
的fixtures,并且这些fixtures在同一个作用域下,那么pytest会根据conftest.py
文件在文件系统中的位置来决定它们的加载顺序。通常,离测试文件更近的conftest.py
文件中的fixtures会先被加载和执行。
- 如果在多个
- 测试用例中的fixtures:
- 如果在测试用例中直接定义了一个fixture(即该fixture没有定义在
conftest.py
文件中),并且这个fixture被标记为autouse=True
,那么它的加载顺序将取决于它的作用域和其他factors(如文件位置、依赖关系等)。但是,它仍然会按照pytest的规则来执行。
- 如果在测试用例中直接定义了一个fixture(即该fixture没有定义在
【总结】
pytest 首先会收集测试用例数据,根据测试用例的命名(test_)等进行信息收集,收集完成后,会对测试用例中的fixtrue进行解析,并解析对应的依赖关系。然后测试用例在执行的时候分为两种情况,
- fixtrue 为auto时,他会在测试用例执行之前自动运行。离测试用例近的优先进行执行。
- fixtrue 为手动调用时,他会根据获取到的测试用例中 fixtrue的调用 顺序 ,如果存在依赖关系时,pytest 会自动处理调用