pytest(二)框架实现一些前后置(固件,夹具)的处理,常用三种

为什么需要这些功能?

比如:web自动化执行用例前是否需要打开浏览器?执行用例后需要关闭浏览器?

示例代码:

python 复制代码
import pytest
class Testcase:
    #这是每条测试用例执行前的初始化函数
    def setup(self):
        print("\n我是每条测试用例执行前的准备工作,比如:打开浏览器,加载页面等")
    #这是没条用例执行后的清理函数
    def teardown(self):
        print("\n我是每条测试用例执行后的清理工作,比如:关闭浏览器")
    #这是生活有用例执行前的初始化函数
    def setup_class(self):
        print("\n我是所有测试用例执行前的准备工作,比如:链接数据库,打开文件等")

    #这是所有用例执行后的清理工作
    def teardown_class(self):
        print("\n我是所有测试用例执行后的清理工作,比如:断开数据连接,关闭文件等")

    #测试用例1
    def test_case1(self):
        print("执行测试用例1")

    #测试用例2
    def test_case2(self):
        print("执行测试用例2")
if _name_=='_main_':
    pytest.main(["-vs"])

2.1 autose:是否自动执行

示例代码1(指定部分用例触发初始化、清理函数):

python 复制代码
import pytest
# 添加此装饰器的函数可以实现初始化和清理工作
@pytest.fixture()
def fun():
    print("我是初始化工作")
    yield
    print("我是清理工作")
class TestCase:
  # 测试用例1
    def test_case(self):
        print("执行测试用例1")
    # 测试用例2:只有将初始化、清理函数作为参数传入用例,才会触发
    def test_case2(self, fun):
        print("执行测试用例2")
if __name__ == '__main__':

    pytest.main(["-sv"])

@注意:如果@pytest.fixture()装饰器内没有传递autouse参数,默认为False,只有传递了初始化方法的测试用例会触发初花清理方法,如示例代码中:测试用例1不会触发,测试用例2就会触发

示例代码2(全部符合规则的用例都会触发初始化清理方法)

python 复制代码
import pytest

#添加此装饰器的函数可以实现初始化和清理工作
@pytest.fixture(autouse=True)
def fun():
    print("我是初始化工作")

    yield
    
    print("我是清理工作")

class TestCase:
    #测试用例1 
    def test_case1(self):
        print("执行测试用例1")

    #测试用例2
    def test_case(self):
        print("执行测试用例2")

if __name__=='__main__':
    pytest.main(["-vs"])

2.2 scope:表示被@pytest.fixture标记的方法的作用域

·示例代码

python 复制代码
import pytest


"""
scope参数:表示被@pytest.fixture标记的方法的作用域
    function:函数(默认值),传递此参数或者不传则每条测试方法执行前都会触发初始化清理方法
    class:传递此参数则每个类执行前后都会触发一次初始化清理方法
    module:传递此参数则每个py模块执行前后悔触发一次初始化清理方法
    package:传递此参数则每个包执行前后会触发一次初始化清理方法

"""
#添加此装饰器的函数可以实现初始化和清理工作
@pytest.fixture(autouse = True,scope="class")

def fun():
    print("我是初始化工作")
    yield
    print("我是清理工作")

class TestCase:
    #测试用例1
    def test_case1(self):
        print("执行测试用例1")

    #测试用例2
    def test_case2(self):
        print("执行测试用例2")
if __name__=='__main__':
    pytest.main(["-vs"])

2.3 params:参数化,支持:列表[],元组(),字典列表[{},{}],字典元组({},{})

·示例代码:

python 复制代码
import pytest

"""
        ·装饰器内参数是params,注意带s

        ·初始化、清理方法定义阶段要有一个实参必须为request

        ·初始化、清理方法内结合params参数化返回的值固定写法为:request.param,注意不带s

        ·params传递进去了几组测试数据,就会调用几次测试用例,并每次分发测试数据
"""
#添加此装饰器的函数可以实现初始化和清理工作
@pytest.fixture(params=[1,2,3])
def fun(request):
    print("我是初始化工作")
#固定写法:形参名字必须为request,而返回数据必须为request.param
    yield request.param
    print("我是清理工作")

class TestCase

    #测试用例1
    def test_case1(self)
        print("执行测试用例1")
    #测试用例2 初始化、清理方法内yiele或者return返回的结果会保存在初始化/清理方法名内,用例内可直接调用
    def test_case2(self,fun)
        print("执行测试用例2")
        print("测试数据:",fun)

if __name__=='__main__':
    pytest.main(["-vs"])

注意:

·装饰器内参数是params,注意带s

·初始化、清理方法定义阶段要有一个实参必须为request

·初始化、清理方法内结合params参数化返回的值固定写法为:request.param,注意不带s

·params传递进去了几组测试数据,就会调用几次测试用例,并每次分发测试数据

2.4 ids :当使用params参数化时,给每一个值设置一个变量名,意义不大

·示例代码:

python 复制代码
import pytest
"""
ids里面传递的别名必须和参数个数保持一致
在执行结果中可以看到打印的nodeid里面的参数已经替换成了别名
"""

#添加此装饰器的函数可以实现初始化清理工作
@pytest.fixture(params=[1,2,3],ids=["data1","data2","data3"])
def fun(request):
    print("我是初始化工作")
    #固定写法:形参名字必须为request,而返回数据必须为request.param
    yield request.param
    print("我是清理工作")

class TestCase:
    #测试用例1
    def test_case(self):
        print("执行测试用例1")


    #测试用例2
    def test_case2(self,fun):
        print("执行测试用例2")
        print("测试数据",fun)

if __name__=='__main__':
    pytest.main(["-vs"])

2.5 name :给被@pytest.fixture标记的方法取一个别名,意义不大

python 复制代码
import pytest
"""
起别名后,用例可以用别名来引用原来的方法名
起别名后原来的名字则无法使用了,否则报错
"""

#添加此装饰器的函数可以实现初始化和清理工作
@pytest.fixture(params=[1,2,3],name="aaa")
def fun(request):
    print("我是初始化工作")
    #固定写法:形参名字必须为request,而返回数据必须为request.param
    yield request.param
    print("我是清理工作")

class TestCase:
    #测试用例1
    def test_case1(self):
        print("执行测试用例1")

    #测试用例2
    def test_case2(self,aaa):
        print("执行测试用例2")
        print("测试数据",aaa)

if __name__=='__main__':
    pytest.main(["-vs"])

三、通过conftest.py和pytest.fixture()结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理等)

使用规则:

conftest.py文件是单独存放的一个家具配置文件,名称是不能更改的

用处:可以在不同的py文件中使用同一个fixture函数

原则上conftest.py需要喝运行的用例放到同一层,并且不需要做任何import 导入操作

注意:如果一个测试用例添加了两个测试夹具,后面的一个夹具会在前一个的内层执行

如:

python 复制代码
class TestCase:
    #测试用例
    def test_case(self,fun1,fun2):
        print("执行测试用例")
        print("测试数据:",fun1)
        print("测试数据:",fun2)
相关推荐
我的xiaodoujiao20 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
我的xiaodoujiao1 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 45--生成项目需要的requirements.txt依赖文件
python·学习·测试工具·pytest
月明长歌1 天前
全栈测试修炼指南:从接口策略到 Python+Pytest+Allure 企业级架构
python·架构·pytest
一晌小贪欢1 天前
Python 测试利器:使用 pytest 高效编写和管理单元测试
python·单元测试·pytest·python3·python测试
我送炭你添花2 天前
Pelco KBD300A 模拟器:20.搭建pytest集成测试基础框架 + 模拟器闭环测试
python·集成测试·pytest
我送炭你添花3 天前
Pelco KBD300A 模拟器:18. 按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试
python·单元测试·log4j·pytest
生活很暖很治愈3 天前
Pytest-order插件
python·测试工具·测试用例·pytest
测试人社区—66796 天前
2025区块链分层防御指南:AI驱动的安全测试实战策略
开发语言·驱动开发·python·appium·pytest
我送炭你添花6 天前
pytest 入门指南:从零开始掌握 Python 测试框架的核心概念与使用方法
chrome·python·pytest
though the night6 天前
Python UI 自动化测试框架搭建demo(Selenium+Pytest 版)
自动化测试·selenium·测试工具·pytest