把夹具函数在文件中往前移动,就能保证它更早执行吗?pytest的Fixtures reference在Fixture instantiation order一节明确否定了这种依赖方式:当pytest已经知道某个测试要执行哪些夹具,它会按作用域、依赖关系和autouse三项因素确定顺序。[1] 定义位置与执行先后,因而不是同一份信息。

文档把函数名、定义地点、定义顺序,以及夹具被请求的排列顺序都列为不能依赖的依据。它们有时看起来与运行先后一致,原文仍将这种一致称为偶然关系。[1] 因此,阅读某份测试说明时,仅有一列按源码顺序排好的夹具名,还没有完整表达pytest所依据的顺序约束。

作用域提供其中一项关系。在一次函数请求的夹具集合内,较高作用域的夹具先于较低作用域执行,例如session先于function或class。[1] 这里的起点是该测试需要执行的集合,不是把整个项目全部夹具不分适用范围排成一条总队列。集合先被确定,随后才讨论内部顺序。

依赖则把同级夹具进一步连接起来。若夹具a请求夹具b,b先执行,因为a依赖b。[1] 原文特别补充,即使a并不需要b的返回值,请求关系仍能表达a应在b之后的要求。返回的数据与先后约束是这段说明中的两个对象,不能因为没有使用返回值,就删掉依赖所表达的时间关系。

这些约束还需要足够清楚。官方讨论依赖链存在歧义时指出,如果顺序可以有多种解释,应假定pytest可能采用其中任一种。[1] 在文档示例中,一个夹具只被限定在b之后、g之前,并没有因此被唯一安排在中间某个位置。本文采用这项概念,没有运行示例来宣称某一种排列必然出现。

autouse另有适用范围。它在自己的范围内先于其他夹具执行;被它请求的普通夹具,对那些实际受到该autouse夹具影响的测试,也会成为有效的autouse依赖。[1] 这解释了为何测试没有直接写出某个普通夹具名,它仍可能先执行:请求来自上游autouse夹具。

但这种效果没有把普通夹具全局改成autouse。文档进一步对照两个测试上下文:只有能够受到真实autouse夹具影响的那些测试,才同时获得这项依赖效果;另一个看不到该autouse夹具的上下文,不自动继承相同先后关系。[1] “被某个autouse请求”需要连同它能作用于哪些测试一起阅读。

对软件测试资料整理,具体问题因此是哪些夹具参与、它们的作用域和依赖怎样连接,而不是按函数名猜运行顺序。采用范围为pytest latest文档的上述连续章节,未补造安装版本、运行测试或检查实际计划;版权年份不作为首发日期。这份解释不证明测试覆盖充分或项目已通过,只保留官方定义的排序关系。

资料:[1] https://docs.pytest.org/en/latest/reference/fixtures.html

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。