python + pytest 之 fixture装饰器使用详解(版本2)
一、前言
测试用例类中的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 ==============================