Python 测开28期 - TLF - 学习笔记 - Pytest - “标记”测试用例

在执行测试时,有时候需要只执行部分测试用例,比如 只执行与 添加学生功能 相关的测试方法,或者 只执行与 Windows操作系统 相关的测试方法,或者 忽略某些测试方法等,此时需要用 @pytest.mark.xxx 来标记和区分。

一、“标记” 测试用例 – 标签分类

可以对测试方法设置标签以表示其属于哪一类,便于测试时进行区别对待,比如只执行标记为 某类标签 的测试方法等。

1. 代码示例

import pytest

@pytest.mark.add
def test_add_int():
    return print("测试整数加法")

@pytest.mark.add
def test_add_float():
    return print("测试单精度小数加法")

@pytest.mark.add
def test_add_double():
    return print("测试双精度小数加法")

@pytest.mark.minus
def test_minus_int():
    return print("测试整数减法")

@pytest.mark.minus
def test_minus_float():
    return print("测试单精度小数减法")

@pytest.mark.minus
def test_minus_double():
    return print("测试双精度小数减法")

@pytest.mark.multiple
def test_multiple_int():
    return print("测试整数乘法")

@pytest.mark.multiple
def test_multiple_float():
    return print("测试单精度小数乘法")

@pytest.mark.multiple
def test_multiple_double():
    return print("测试双精度小数乘法")

@pytest.mark.division
def test_division_int():
    return print("测试整数除法")

@pytest.mark.multiple
def test_division_float():
    return print("测试单精度小数除法")

@pytest.mark.multiple
def test_division_double():
    return print("测试双精度小数除法")

2. 对特定标签对应的测试用例执行测试 及 运行效果展示

(1)命令格式

  • pytest [-s] test_file_name.py -m “category_name” # -s 表示输出调试信息,即显示测试函数中print()打印的信息
  • pytest [-s] test_file_name.py -m=“category_name”
  • pytest [-s] test_file_name.py -m “not category_name” # 可以用 not 排除某类,表示执行 除该类之外 的其他类别对应的测试方法

(2)运行效果展示

对代码示例中的代码分别使用下述两个命令进行测试。

  • pytest -s test_mark.py -m “add”

运行效果为:


  • pytest -s test_mark.py -m “not add”

运行效果为:


注意: warnnings的产生是由于系统不识别用户自定义的标签,需要在配置中设置一下,参见下面的解决方法。

3. 对系统未识别的标签进行处理

第一步,在项目目录下新建文件 pytest.ini

第二步,修改 pytest.ini 的内容

# 此处第一行必须是 [pytest]
[pytest]
# 设置 markers,将用户自定义的标签(分类名称)依次列举
# 注意:
# 1. 每行只能写一个标签
# 2. 用户自定义的标签不要顶格写,以免被系统误认为特殊含义
markers = add
           minus
           multiple
           division

第三步,执行测试命令


二、“标记” 测试用例 – 忽略

1. 概述

  • skip:始终跳过该测试用例,例如
  • skipif:遇到特定情况跳过该测试用例

2. 示例

(1)借助 @pytest.mark.skip(reason=“不被执行的原因”) 装饰器表示该测试方法被忽略,无需执行

import pytest

# 标记该方法不被执行
@pytest.mark.skip
def test_add_int():
    return print("测试整数加法")

# 标记该方法不被执行,且给出了不被执行的原因
@pytest.mark.skip(reason="被测模块还未实现")
def test_add_float():
    return print("测试单精度小数加法")

def test_add_double():
    return print("测试双精度小数加法")

运行效果为:

(2)在某种特定情况下,调用 pytest.skip(reason=“被跳过的原因”) 跳过后续代码的执行

import pytest

def check_login():
    return False

def test_buy():
    print("test_buy start...")
    if( not check_login()): # 若未登录,则不再执行该方法
        pytest.skip()   # 表示:满足条件时,不再继续执行该方法
    print("test_buy end...")

运行效果为:

(3)借助 @pytest.mark.skipif(condition, reason) 标记选择性跳过

import sys
import pytest

print(sys.platform)
print(sys.version_info)

# 当系统为 mac 时,本测试方法被跳过
@pytest.mark.skipif( sys.platform == "darwin", reason = "does not run on mac")
def test_case1():
    print("执行测试用例1--not mac")
    assert True

# 当系统为 windows 时,本测试方法被跳过
@pytest.mark.skipif( sys.platform == "win32", reason = "does not run on windows")
def test_case2():
    print("执行测试用例1--not windows")
    assert True

# 当 python 版本低于 3.6 时,本测试方法被跳过
@pytest.mark.skipif( sys.version_info < (3,6), reason = "requires python3.6 or higher")
def test_case3():
    print("执行测试用例1--not lower than 3.6")
    assert True

本人电脑操作系统为Windows,且 python 版本为3.8,因此,运行效果为:

三、“标记”测试用例 – 期望失败(即:预期结果为 fail,若通过则状态为 XPASS,若失败则状态为 XFAIL)

(1)借助 @pytest.mark.xfail 标记 预期失败的测试方法,例如:该测试方法对应的缺陷是否还未修复(此时,若标记为 xfail,则测试结果可能为 xpass / xfail,更容易发现此方法对应的缺陷是否还存在缺陷 )

(2)示例

import pytest

# 本测试方法结果为 xfail
@pytest.mark.xfail
def test_case():
    assert 4 == 2

# 本测试方法结果为 xpass
@pytest.mark.xfail
def test_case1():
    assert 2 == 2

# 本测试方法结果为 xfail
@pytest.mark.xfail
def test_case2():
    assert 1 == 2

# 本测试方法结果为 xfail
@pytest.mark.xfail
def test_case3():
    assert 2 == 3

(3)运行效果