python接口自动化之前后置、夹具
前言:在做接口自动化时, 前后置功能是我们必用的一个功能,下面将介绍pytest中,都有哪些前后置方法,以及他们的优劣之分
1. setup和teardown (函数级)前后置功能方法,来看一下它是怎么使用的。
import pytest class TestOrder: def setup(self): print("前置条件") def teardown(self): print("后置条件") def test_001(self): print('用例1') def test_002(self): print('用例2') if __name__ == '__main__': pytest.main(['-s', r'./test_001.py'])
运行结果>>>
前置条件
用例1
后置条件
前置条件
用例2
后置条件
根据执行结果可以看出, “前置条件” 和 ”后置条件“ 都是在(用例1)、(用例2)的前面和后面各执行了一次,所以为函数级前后置功能。在正常情况下有什么作用呢?记住有这样一个方法就行,一般我们不会用这个方法,下面有更优的方法。
2. setup_class和teardown_class (类级别)前后置功能方法,来看一下它是怎么使用的
import pytest class TestOrder: def setup_class(self): print("前置条件") def teardown_class(self): print("后置条件") def test_001(self): print('用例1') def test_002(self): print('用例2') if __name__ == '__main__': pytest.main(['-s', r'./test_001.py'])
运行结果>>>
前置条件
用例1
用例2
后置条件
这个就很容易理解,就是在类的前面和后面执行前后置功能,所以为类级别前后置功能。知道有这么一个方法就行, 正常情况这个功能我们用的比较少,因为有以下更优的功能可以代替它。
不管是(函数级)还是(类级别)前后置功能,它们都有一个缺点:它们不能多py文件共享,每一个类都得写一个前后置方法,太过于繁琐,所以衍生下面这个更优的方法。
3. @pytest.fixture 首先来看一下这个功能的基本使用
import pytest @pytest.fixture() def login(): print("登录") class Test_Demo(): def test_case1(self): print('用例1') def test_case2(self, login): print('用例2') def test_case3(self): print('用例3') if __name__ == '__main__': pytest.main(['-s',r'./test_001.py'])
运行结果>>> 用例1
登录 用例2 用例3
可以看到,我在测试类的上面定义了一个“login”函数,并加上一个@pytest.fixture(),然后我将“login”方法名称放到用例2中,它就在用例2前执行了“login”。但是这样无法达到多个py文件共享,所以我们不是这样使用的,需要结合conftest.py文件来一起使用,那怎么使用呢?
这个conftest.py文件名称是固定的,它的所在路径是有要求的,如果你想所有用例都共享,则新建在根目录下,如果想让它对某个py测试文件生效,则将它放置在测试文件同一个目录下即可
然后文件中新建一个“登录”函数
然后回到用例文件,执行一下用例文件看看会发生什么,可以看到, 用例文件中有三条用例, 执行之后, “登录”函数被调用上了,并且在用例文件中并没有导入和调用,它为什么会自动执行呢,这个就是conftest.py的作用,conftest.py文件里面的函数可以不调用来直接使用
也需你注意到了,这里的@pytest.fixture 比刚开始时多了两个参数,下面我来解释一下这两个参数的意思,其实@pytest.fixture 一共有5个参数:@pytest.fixture(scope = "作用域", params = "数据驱动", autouse = "自动执行", ids = "自定义参数名", name = "重命名")
scope 参数解释:默认值为function
@pytest.fixture(scope = "function") :前后置功能作用于(用例),也就是每执行一条用例时,这个函数就会执行 @pytest.fixture(scope = "class") :前后置功能作用于(类),每执行一个类时,这个函数就会执行(上面演示就是用class,所以只在类的前面执行了一次“登录”函数) @pytest.fixture(scope = "module") :前后置功能作用于(模块/py文件),依次类推,每知执行一个py文件时执行一次函数 @pytest.fixture(scope = "package/session") :前后置功能作用于(包目录/session)
params 参数解释:
@pytest.fixture(scope='class', autouse=True) :为true时自动调用函数,默认为False。(刚刚在演示时,我没有经过任何调用,“登录”函数就自动执行了,原因是我填写True)
有自动执行,当有手动执行,如何手动执行呢? 假如我想让用例3执行“登录”函数,其它用例不执行,如何操作?
如下图所示,我将scope参数去掉了,将autouse=True 改为False, 然后在执行的用例3调用“登录”函数即可,“登录”函数就会在用例3之前执行
params 参数解释:后续补充
ids 参数解释:后续补充
name 参数解释:后续补充
说了 @pytest.fixture() 的前置功能,再来说说它的后置功能,比如有些用例,登录之后需要退出登录, 这个怎么操作?很简单,直接加上yield 参数
来看一下用例执行结果,可以看到, “登录”在用例3前执行了登录操作, 然后再用例3执行后, 执行了“退出登录”操作
yield还有另外一个强大的功能, 它还可以作为带参数返回
来看一下执行结果,效果就很明显了, 我在用例3中打印了“登录”函数, 可以将“登录”函数中的“hello”返回数据给拿到, 这个有什么用呢? 这个就由你自己思考了,项目上业务变化莫测,总会用的到的
总结:
@pytest.fixture() 一般会和 conftest.py 文件一起使用。conftest.py 文件的名称是固定的, 功能很强大。
1. conftest.py 文件是单独存放@pytest.fixture() 方法的, 用处是可以在多个py文件中共享前后置配置。
2. conftest.py 文件里面的方法在调用时不需要导入, 可以直接使用。
3. conftest.py 文件可以有多个。也可以有多个不同的层级
4. 在实际项目中,@pytest.fixture() 和 conftest.py的结合, 可以用来做登录、数据库连接等多种前置功能配置,它的好处就是多个py文件能共享,不用每个类都写一次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现