关于conftest和fixtures

一、 conftest.py 文件

  作用:存放case的前提条件和后置条件配置函数;一般该类函数都会使用fixture装饰(fixture该篇第二点会介绍);使用conftest里面的函数时不需要导入 conftest.py 这个文件。只需将函数名作为变量传入test_case即可调用;
  使用 conftest.py 的规则:
特点:

  1. conftest.py 这个文件名是固定的,不可以更改。
  2. conftest.py 与运行用例在同一个包下,并且该包中有 init.py 文件
  3. 使用的时候不需要导入 conftest.py,pytest 会自动识别到这个文件
  4. 放到项目的根目录下可以全局调用,放到某个 package 下,就在这个 package 内有效。

二、fixture

  pytest中可以使用@pytest.fixture装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中。可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数;
  fixture里面有一个参数scope,通过scope可以控制fixture的作用范围,根据作用单位大小划分为:session>module>class>function

  1. function函数或者方法级别都会被调用
  2. class类级别调用一次
  3. module模块级别调用一次
  4. session是多个文件调用一次(可以.py文件调用,每个.py文件就是一个module);fixture scope 为 session 级别是可以跨 .py 模块调用的,也就是当我们有多个 .py 文件的用例时,如果多个用例只需调用一次 fixture,可以将 scope='session',并且写到 conftest.py 文件里。写到 conftest.py 文件可以全局调用这里面的方法。

2.1 .将fixture作为函数参数
  通常使用setup和teardown来进行资源的初始化。如果有这样一个场景,测试用例1需要依赖登录功能,测试用例2不需要登录功能,测试用例3需要登录功能。这种场景setup、teardown无法实现,可以使用pytest fixture功能,在方法前加个@pytest.fixture装饰器,加了这个装饰器的方法可以以参数的形式传入到方法里面执行。
2.2 将fixture作为模块参数
  整个模块有多条测试用例,需要在全部用例执行之前打开浏览器,全部执行完之后去关闭浏览器,打开和关闭操作只执行一次,如果每次都重新执行打开操作,会非常占用系统资源。这种场景除了setup_module,teardown_module可以实现,还可以通过设置模块级别的fixture装饰器(@pytest.fixture(scope="module"))来实现

如果每条测试用例都需要添加 fixture 功能,则需要在每一要用例方法里面传入这个fixture的名字,这里就可以在装饰器里面添加一个参数 autouse='true',它会自动应用到所有的测试方法中,只是这里没有办法把返回值给测试用例。

俗话说的好百闻不如一见,下面展示一下,我们经常使用的场景;

示例例:

下图就是conftest.py文件中的前置条件函数【ModulInit】,并且以fixture装饰;

注:【ModulInit】该函数主要功能是登录设备,并获取该设备型号

下图是test_case函数调用前置条件函数的方式;将前置条件函数名称直接作为参数传入到case中,那么在执行该case之前,程序会自动先执行前置函数【ModulInit】;然后再执行case;并且该前置函数是有返回值的(返回值为一个列表),使用返回值也是直接前置函数名称后跟序号来取;ModulInit[0/1/2]

 

posted @ 2024-07-04 10:58  疯狂学习中  阅读(84)  评论(0编辑  收藏  举报