python + pytest 之 fixture装饰器使用详解(版本2)

发布时间 2023-05-17 04:14:23作者: 乌鸦哥

一、前言

测试用例类中的setup和teardown可实现在测试用例之前和之后加入一些环境预设和环境恢复的操作,

但这种是一个类中所有测试方法均生效的,如果我想实现以下场景:

test用例1需要先登录,test用例2不需要登录,test用例3需要先登录。那么这就无法使用setup来实现了。

 

二、fixture优势

1.fixture装饰器相对于setup和teardown来说有以下几点优势:

(1)方法名命名自定义,不局限于setup和teardown的命名;

(2)conftest.py 配置文件中的数据可共享,且不需要import就能自动使用;

(3)scope="module" 可以实现一个.py文件的所有用例的前置共享;

(4)scope="session"以实现多个.py文件使用一个fixture装饰器来完成多个用例。

 

三、fixture参数传入(scpoe="function")

实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录。

import pytest
# 默认scope="function"
@pytest.fixture()
def login():
    print("输入账号和密码,先登录")

def test_s1(login):
    print("用例1:登录后执行操作s1...")

def test_s2():   # 不传login
    print("用例2:直接执行操作s2...")

def test_s3(login):
    print("用例3:登陆后执行操作s3...")

if __name__ == "__main__":
    pytest.main(["-s","test_fix1.py"])

========================= test session starts ================================
platform win32 -- Python 3.8.5, pytest-5.4.2, py-1.11.0, pluggy-0.13.1
rootdir: D:\PycharmProjects\requests_fuxi_230313\api
plugins: allure-pytest-2.8.6, assume-2.4.3
collected 3 items


test_fix1.py 输入账号和密码,先登录
用例1:登陆后执行操作s1...
.用例2:直接执行操作s2...
.输入账号和密码,先登录
用例3:登陆后执行操作s3...
.


=========================== 3 passed in 0.04s ===============================

 

四、conftest.py配置

1.上面是在同一个.py文件中,多个test用例调用同一个登陆方法,如果有多个.py的文件都需要调用这个登陆方法的话,

那就不能把登录写到某个.py用例里面去。此时应该要有一个公共的配置文件conftest.py,管理一些预置的操作场景。

pytest默认读取conftest.py里面的配置。conftest.py配置文件名是固定的,conftest.py与运行的用例要在同一个pakage(有init.py文件)。

不需要import导入conftest.py,pytest测试用例会自动找到它。

示例:

文件1:conftest.py

import pytest

@pytest.fixture()
def login():
    print("输入账号和密码,先登录")

文件2:test_fix1.py

import pytest
# 默认scope="function"
# @pytest.fixture()
# def login():
#     print("输入账号和密码,先登录")

def test_s1(login):
    print("用例1:登陆后执行操作s1...")

def test_s2():   # 不传login
    print("用例2:直接执行操作s2...")

def test_s3(login):
    print("用例3:登陆后执行操作s3...")

if __name__ == "__main__":
    pytest.main(["-s","test_fix1.py"])

========================== test session starts ==========================
platform win32 -- Python 3.8.5, pytest-5.4.2, py-1.11.0, pluggy-0.13.1
rootdir: D:\PycharmProjects\requests_fuxi_230313\api
plugins: allure-pytest-2.8.6, assume-2.4.3
collected 3 items

test_fix1.py 输入账号和密码,先登录
用例1:登陆后执行操作s1...
.用例2:直接执行操作s2...
.输入账号和密码,先登录
用例3:登陆后执行操作s3...
.

========================= 3 passed in 0.05s ============================

文件3:test_fix2.py

import pytest

def test_s4(login):
    print("用例4:登陆后执行操作s4...")

def test_s5():
    print("用例5:直接执行操作s5...")

if __name__ == "__main__":
    pytest.main(["-s","test_fix2.py"])

========================== test session starts ==========================
platform win32 -- Python 3.8.5, pytest-5.4.2, py-1.11.0, pluggy-0.13.1
rootdir: D:\PycharmProjects\requests_fuxi_230313\api
plugins: allure-pytest-2.8.6, assume-2.4.3
collected 2 items

test_fix2.py 输入账号和密码,先登录
用例4:登陆后执行操作s4...
.用例5:直接执行操作s5...
.

========================= 2 passed in 0.04s ==============================