pytest Mark标记、Skip跳过、xFail预期失败 L2

1、使用 Mark 标记测试用例

Mark:标记测试用例

  • 场景:只执行符合要求的某一部分用例 可以把一个web项目划分多个模块,然后指定模块名称执行。
  • 解决: 在测试用例方法上加 @pytest.mark.标签名
  • 执行: -m 执行自定义标记的相关用例
    • pytest -s test_mark_zi_09.py -m=webtest
    • pytest -s test_mark_zi_09.py -m apptest
    • pytest -s test_mark_zi_09.py -m "not ios"
import pytest


def double(a):
    return a * 2

# 测试数据:整型
@pytest.mark.int
def test_double_int():
    print("test double int")
    assert 2 == double(1)

# 测试数据:负数
@pytest.mark.minus
def test_double1_minus():
    print("test double minus")
    assert -2 == double(-1)

# 测试数据:浮点数
@pytest.mark.float
def test_double_float():
    assert 0.2 == double(0.1)

@pytest.mark.float
def test_double2_minus():
    assert -0.2 == double(-0.1)

@pytest.mark.zero
def test_double_0():
    assert 0 == double(0)

@pytest.mark.bignum
def test_double_bignum():
    assert 200 == double(100)


@pytest.mark.str
def test_double_str():
    assert 'aa' == double('a')

@pytest.mark.str
def test_double_str1():
    assert 'a$a$' == double('a$')



警告解决办法

2、pytest 设置跳过、预期失败

Mark:跳过(Skip)及预期失败(xFail)

  • 这是 pytest 的内置标签,可以处理一些特殊的测试用例,不能成功的测试用例
  • skip - 始终跳过该测试用例
  • skipif - 遇到特定情况跳过该测试用例
  • xfail - 遇到特定情况,产生一个“期望失败”输出

Skip 使用场景

  • 调试时不想运行这个用例
  • 标记无法在某些平台上运行的测试功能
  • 在某些版本中执行,其他版本中跳过
  • 比如:当前的外部资源不可用时跳过
    • 如果测试数据是从数据库中取到的,
    • 连接数据库的功能如果返回结果未成功就跳过,因为执行也都报错
  • 解决 1:添加装饰器
    • @pytest.mark.skip
    • @pytest.mark.skipif
  • 解决 2:代码中添加跳过代码
    • pytest.skip(reason)
import pytest

@pytest.mark.skip
def test_aaa():
    print("代码未开发完")
    assert True

@pytest.mark.skip(reason="存在bug")
def test_bbb():
    assert False

import pytest

## 代码中添加 跳过代码块 pytest.skip(reason="")
def check_login():
    return False

def test_function():
    print("start")
    # 如果未登录,则跳过后续步骤
    if not check_login():
        pytest.skip("unsupported configuration")
    print("end")

import sys

import pytest

print(sys.platform)
# 给一个条件,如果条件为true,就会被跳过
@pytest.mark.skipif(sys.platform == 'darwin', reason="does not run on mac")
def test_case1():
    assert True
@pytest.mark.skipif(sys.platform == 'win', reason="does not run on windows")
def test_case2():
    assert True
@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_case3():
    assert True

xfail 使用场景

  • 与 skip 类似 ,预期结果为 fail ,标记用例为 fail
  • 用法:添加装饰器@pytest.mark.xfail
import pytest

# 代码中标记xfail后,下部分代码就不惠继续执行了
def test_xfail():
    print("*****开始测试*****")
    pytest.xfail(reason='该功能尚未完成')
    print("测试过程")
    assert 1 == 1

# xfail标记的测试用例还是会被执行的,fial了,标记为XFAIL,通过了标记为XPASS,起到提示的作用
@pytest.mark.xfail
def test_aaa():
    print("test_xfail1 方法执行")
    assert 1 == 2

xfail = pytest.mark.xfail

@xfail(reason="bug 110")
def test_hello4():
    assert 0