fixture
实现前后置
参数
scope --作用域
function:函数/方法之前和之后执行
手动调用方式是在测试用例的参数里加入fixture的名称
class:类之前和之后执行
手动调用的方式是在类上面加上@pytest.mark.usefixtures("方法名")
装饰器
package/session:整个项目会话之前和之后执行。
当session只作用于一个.py文件时相当于module
一般会结合conftest.py文件来实现
autouse --自动执行
默认:False;如果改为True,则不需要调用,在对应的作用域会自动执行
params --实现参数化(数据驱动)
ids --参数,必须和params一起使用,给参数起别名
name --给fixture起别名
yield
可以将数据返回,类似return
,但是return
后面就不能再接代码了,而yield
后面是可以继续写其他代码的。所以在“后置”操作时,我们都习惯用yield
。
当scope
的值为class
,autouse
的值为False
时,如何调用fixture
:
@pytest.mark.usefixtures("方法名")
params
用于实现参数化
比如一个用例需要分别用3个不同数据(等价类和边界值)进行测试,如果一个用例代码写三遍有点笨了,这个时候用params
这个参数就可以
说明:
1、params=read_yaml() --params=方法名(),调用 2、exe_sql(request) 注意,括号里是request 规定就是这么写,没有为什么 3、request.param 调用通过read_yaml()方法拿到的数据,就要求这么写,上面参数是params,这里是param,就要求这么写 4、exe_sql这里我本来是打印print(request.param)看了一下,然后才yield的。为了说明问题,就是实现参数化(数据驱动),直接强调一下通过yield方法是可以把取到的值作为参数传给其他方法的
5、test_api()方法引用fixture,要在方法中传fixture修饰过的方法名
执行结果:
可以看到,用例二分别用测试数据执行了三次。
ids
不能单独使用,必须和params
一起使用,作用是给参数起别名
看上面那个执行结果
如果你的数据太长,那这里显示会很乱,这时候就能用到ids这个参数了
执行结果:
name
作用是给fixture
起别名
上面我们用fixture
装饰的方法叫exe_sql
,如果这个方法很长或者你不想调用的时候叫这个名字,就可以用name
给fixture
修饰的方法改名字
注意:当你给fixture装饰的方法(exe_sql())传了name
参数改名字以后,用例调用的时候都要用你改过以后的名字(db),用原来的方法名(exe_sql)是会报错的,因为找不到了。