pytest用例执行相关笔记

10 阅读2分钟
# pytest用例执行相关笔记:
# 一,失败重跑
# 1,安装插件pip install pytest-rerunfailures

# 2. 全局失败重跑(所有用例失败自动重试)
# pytest --reruns 3        # 失败重跑3次
# pytest --reruns 3 --reruns-delay 2   # 每次间隔2秒
#
# 3,单个用例失败重跑(最常用)
import pytest
# 这个用例失败自动重跑 3 次
@pytest.mark.flaky(reruns=3, reruns_delay=1)
def test_demo():
    assert 1 == 2  # 会失败,但会重试3次

# 二,用例执行顺序控制
# 1,安装pip install pytest-order
# 2,指定先跑后跑
import pytest
# 第一个跑
@pytest.mark.run(order=1)
def test_first():
    print("第一个跑")
# 第二个跑
@pytest.mark.run(order=2)
def test_second():
    print("第二个跑")
# 最后跑
@pytest.mark.run(order=-1)
def test_last():
    print("最后跑")

# 三,多重断言不中断
# 1,安装 pip install pytest-assume
#
# 2,
from pytest_assume.plugin import assume

def test_many_assert():
    assume(1 == 2, "第一个断言失败")
    assume(2 == 2, "第二个断言成功")
    assume(3 == 4, "第三个断言失败")
    print("所有断言都会执行,不会中断!")

# 四,用例标记,条件执行
# 1,直接跳过
@pytest.mark.skip("暂时不执行")
def test_skip():
    pass

# 2,条件满足才跳过
@pytest.mark.skipif(condition=True, reason="版本不支持")
def test_skip_if():
    pass

# 3,标记为预期失败
@pytest.mark.xfail(reason="已知BUG")
def test_expect_fail():
    assert 1 == 2

# 4,冒烟用例
@pytest.mark.smoke
def test_smoke():
    assert 1 == 2

# 5,接口用例
@pytest.mark.api
def test_get_user():
    assert 1 == 1

# 6,回归用例
@pytest.mark.regression
def test_order():
    assert 1 == 1

# 运行使用:(会只运行打过标记的代码)
# pytest -m smoke -v
# pytest -m api -v

# 五,代码
import pytest
from pytest_assume.plugin import assume

# 夹具:全局token
@pytest.fixture(scope="session")
def token():
    print("\n登录获取token...")
    yield "auto_token_123456"
    print("\n测试结束,清理登录")

# 参数化用例
@pytest.mark.parametrize("case", [
    {"url": "/api/user", "expect": 200},
    {"url": "/api/order", "expect": 403},
])

# 失败重跑3次
@pytest.mark.flaky(reruns=3)
def test_all(case, token):
    assume(token is not None)
    assume(case["url"] is not None)
    assume(isinstance(case["expect"], int))
    print(f"执行用例:{case['url']}")