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)
相关推荐
头疼的程序员1 天前
allure生成测试报告(搭配Pytest、allure-pytest)
测试工具·pytest
文人sec1 天前
接口自动化测试设计思路--设计实战
python·https·单元测试·自动化·pytest
测试开发Kevin3 天前
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
python·pytest
测试开发Kevin5 天前
以pytest_addoption 为例,讲解pytest框架中钩子函数的应用
python·pytest
川石教育11 天前
Pytest中的fixture装饰器详解
python自动化测试·pytest·pytest自动化测试框架·pytest测试框架·pytest单元测试框架
春风又。11 天前
接口自动化——参数化
python·测试工具·自动化·pytest
XTY0014 天前
mac电脑pytest生成测试报告
pytest
程序员的世界你不懂14 天前
pytest-前后置及fixture运用
pytest
天才测试猿15 天前
基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解
自动化测试·软件测试·python·测试工具·单元测试·测试用例·pytest
HtwHUAT16 天前
五、UI自动化测试05--PyTest框架
经验分享·python·ui·pytest