pytest中提供的mark模块,可以实现很多功能,如:

  1. 标记用例,即打标签
  2. skipskipif标记跳过,skip跳过当前用例,skipif符合情况则跳过当前用例
  3. xfail标记为预期失败

标记用例

有时候我们可能并不需要执行项目中的所有用例,而只执行其中的某些用例,即指定执行某一类或某个场景的测试用例,比如只执行冒烟用例,那么这个时候就需要使用@pytest.mark.标签名来进行打标签过滤。标签名需要先注册,然后才能使用。

注册标签

官方文档里提供了三种注册标签的方法,这里只介绍pytest.iniconftest.py,有兴趣的可以去查看官方文档

方法一,在项目根目录新建pytest.ini,并在其中注册、管理标签。示例如下:

[pytest]

markers =
smoke: marks test as smoke
login
order: 下单场景

这里定义了三个标签,分别是:smoke、login、order,冒号后面的是标签说明,可不加。

方法二,在conftest.py中定义钩子函数进行标签注册,格式如下:

def pytest_configure(config):
marker_list = [
"smoke: marks test as smoke",
"login",
"order: 下单场景"
]
for marker in marker_list:
config.addinivalue_line("markers", marker)

方法二需注意定义的格式,不能轻易修改函数名及入参。

使用方法

import pytest

# 标记测试函数
@pytest.mark.smoke
def test_01():
print("执行test_01") def test_02():
print("执行test_02") # 标记测试类
@pytest.mark.order
class TestOrder: def test_order(self):
print("下单") def test_pay(self):
print("支付") # 多个标签
@pytest.mark.smoke
@pytest.mark.login
def test_login():
print("登录")

给测试类打标签,还有另外一种方式,如下:

# 标记测试类(单个标签)
class TestOrder: # 给类中的所有测试方法打上order标签
pytestmark = pytest.mark.order def test_order(self):
print("下单") def test_pay(self):
print("支付") # 标记测试类(多个标签)
class TestOrder: # 给类中的所有测试方法打上order、smoke标签
pytestmark = [pytest.mark.order, pytest.mark.smoke] def test_order(self):
print("下单") def test_pay(self):
print("支付")

同样可以使用pytestmark标记模块,给模块中所有的测试类、测试函数打上标签,如下:

import pytest

# 模块中的所有测试函数、测试类都会被打上order、smoke标签
pytestmark = [pytest.mark.order, pytest.mark.smoke] def test_01():
print("执行test_01") def test_02():
print("执行test_02") class TestOrder:
def test_order(self):
print("下单") def test_pay(self):
print("支付")

执行方法

执行的时候加上参数-m标签名即可。

命令行

# 执行被标记为smoke的用例
pytest -m smoke # 执行被标记为smoke且被标记为login的用例
pytest -m "smoke and login" # 执行被标记为smoke或login的用例
pytest -m "smoke or login"

代码执行

# 执行被标记为smoke的用例
pytest.main(['-m smoke']) # 执行被标记为smoke或order的用例
pytest.main(["-m", "smoke or order"]) # 执行被标记为smoke同时被标记为login的用例
pytest.main(["-m", "smoke and login"]) # 执行被标记为smoke且不被标记为login的用例
pytest.main(["-m", "smoke and not login"])

这里需要注意,在测试模块中直接使用pytest.main()执行当前模块中的被打标签的用例是无效的,这样会执行当前模块中的所有测试用例。如下示例:

import pytest

# 标记测试函数
@pytest.mark.smoke
def test_01():
print("执行test_01") def test_02():
print("执行test_02") # 标记测试类
@pytest.mark.order
class TestOrder: def test_order(self):
print("下单") def test_pay(self):
print("支付") # 多个标签
@pytest.mark.smoke
@pytest.mark.login
def test_login():
print("登录") if __name__ == '__main__':
pytest.main(['-s', '-m smoke'])

运行该模块,结果如下:

从结果中可以看出,虽然代码中写了只执行标记为smoke的用例,但所有5条用例都被执行了,不能进行过滤。

我们需要将执行代码分离出来,放在单独的执行模块里面,如放在run.py,代码如下:

# run.py

import pytest

if __name__ == '__main__':
pytest.main(["-s", "-m", "smoke or order"])

运行结果如下:

从结果可以看出来,这里只运行了标记为smokeorder的测试用例。

标记跳过

有时候我们需要跳过某些测试用例不去执行,如代码更新后老的用例不需要执行了,或者在某些特定场景下不需要执行某些用例,这时就需要给对应的测试用例做标记跳过处理。

pytest中提供了两种标记跳过的方法,如下:

  1. 直接跳过,@pytest.mark.skip(reason="跳过原因"),reason可写可不写。
  2. 条件跳过,即满足某个条件则跳过不执行,@pytest.mark.skipif(b>3, reason="跳过原因")

示例如下:

import pytest

@pytest.mark.skip(reason="不需要执行test_01")
def test_01():
print("执行test_01") @pytest.mark.skip(2>1, reason="如果2大于1则跳过不执行")
def test_02():
print("执行test_02") if __name__ == '__main__':
pytest.main(['-s'])

运行结果:

从运行结果中可以看到,这2条用例都被跳过。如果想要 跳过测试类 或 测试模块,方法同上面给测试类、测试模块打标签的方法一样,不做过多说明。

xfail

有些场景下需要将测试用例标记为预期失败,如对尚未实现的功能或尚未修复的错误进行测试,使用@pytest.mark.xfail可以将测试用例标记为预期失败。

pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False),参数说明如下:

  1. condition,预期失败的条件,默认值为None,表示只有满足条件时才标记用例为预期失败。

  2. reason,失败原因,默认值为None,说明标记用例的原因。

  3. strict关键字参数,默认值为False。

    当 strict=False 时,如果用例执行失败,则结果标记为xfail,表示符合预期的失败;如果用例执行成功,结果标记为XPASS,表示不符合预期的成功;

    当strict=True时,如果用例执行成功,结果将标记为failed。

  4. raises关键字参数,默认值为None,可以上报指定的一个或多个异常。如果用例的失败不是因为所期望的异常导致的,pytest将会把测试结果标记为failed。

  5. run关键字参数,默认值为True。当run=False时,pytest不会再执行测试用例,直接将结果标记为xfail。

常用的参数示例如下:

import pytest

# run、strict都为默认,因为用例执行是失败的,所以该用例执行结果会被标记为xfail
@pytest.mark.xfail(reason="bug待修复")
def test_01():
print("执行test_01")
a = "hello"
b = "hi"
assert a == b # run、strict都为默认,因为用例执行是通过的,所以该用例执行结果会被标记为xpass
@pytest.mark.xfail(condition=lambda: True, reason="bug待修复")
def test_02():
print("执行test_02")
a = "hello"
b = "hi"
assert a != b # run=False,该用例不执行,直接将结果标记为xfail
@pytest.mark.xfail(reason="功能尚未开发完成", run=False)
def test_03():
print("执行test_03")
a = "hello"
b = "hi"
assert a == b # strict=True,因为用例执行是通过的,所以结果会被标记为failed
@pytest.mark.xfail(reason="功能尚未开发完成", strict=True)
def test_04():
print("执行test_04")
a = "hello"
b = "he"
assert b in a if __name__ == '__main__':
pytest.main(['-s'])

运行结果:

从结果中可以看出来,test_01结果展示为xfailtest_02结果展示为xpasstest_03没有执行而是直接展示为xfailtest_04结果展示为failed

总结

以上示例仅仅只是为了说明@pytest.mark提供的这些功能的使用方法,实际自动化过程中需要灵活选用。

在一般的自动化测试过程中,通过打标签的方式标记某个场景用例会比较多,如标记冒烟测试用例用于冒烟测试。跳过或条件跳过测试用例也经常会用到。而需要将用例标记为预期失败的场景则比较少。

pytest(9)-标记用例(指定执行、跳过用例、预期失败)的更多相关文章

  1. python:unittest之跳过测试和预期失败的用例

    在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...

  2. python--selenium多线程执行用例实例/执行多个用例

    python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...

  3. Python+selenium之跳过测试和预期失败

    在运行测试时,需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest单元测试框架提供了实现这些需求的装饰器. 1.unittest.skip(re ...

  4. unittest跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest提供了这些需求的装饰器. unittest.skip(reason) 无条 ...

  5. python单元测试框架-unittest(五)之跳过测试和预期失败

    概要 @unittest.skip(reason): skip(reason)装饰器:直接跳过测试,并说明跳过测试的原因. @unittest.skipIf(reason): skipIf(condi ...

  6. Pytest权威教程12-跳过(Skip)及预期失败(xFail): 处理不能成功的测试用例

    目录 跳过(Skip)及预期失败(xFail): 处理不能成功的测试用例 Skip跳过用例 xFail:将测试函数标记为预期失败 Skip/xFail参数设置 返回: Pytest权威教程 跳过(Sk ...

  7. 『德不孤』Pytest框架 — 7、Pytest预期失败

    目录 1.@pytest.mark.xfail()标记的作用 2.应用场景 3.语法参数说明 4.示例 5.忽略xfail标识 Pytest预期失败需要使用@pytest.mark.xfail()标记 ...

  8. pytest八:skip 跳过用例

    这是一个快速指南,介绍如何在不同情况下跳过模块中的测试1.无条件地跳过模块中的所有测试:pytestmark = pytest.mark.skip("all tests still WIP& ...

  9. Pytest系列(7) - skip、skipif跳过用例

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 pytest.mark.sk ...

随机推荐

  1. 第10组 Beta冲刺 总结

    1.基本情况 组长博客链接:https://www.cnblogs.com/cpandbb/p/14050808.html 答辩总结: ·因为alpha阶段的产品做得偏离了方向,所以beta冲刺大家非 ...

  2. python实现掘金定时签到抽奖

    python实现掘金定时签到抽奖 一. 概述 这里记录一下使用 python 实现掘金定时签到抽奖.首先需要登录掘金,进入签到页面,按 F12 打开浏览器的调试面板,选择 Network,选择 XHR ...

  3. IDEA导入Web项目配置Tomcat启动

    1.导入项目 2.配置project 3.导入项目模块 配置Models 4.配置Libraries 5. 6. 7.配置tomcat

  4. VirtualBox 安装 Ubuntu 20.04 全流程

    VirtualBox 安装 Ubuntu 20.04 全流程 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 在虚拟机 ...

  5. [开发笔记usbTOcan]PyUSB访问设备

    前面的几个章节的介绍,基本把usbTOcan的底层代码设计好,现在需要介绍PC端的PyUSB进行简单的测试. 在文章开始之前,需要简单的介绍一下整个系统. 0 | 部署 这里使用了两块TM4C123G ...

  6. openSUSE修改grub来修复对win8的引导

    前言:继上一次安装试用各版本linux发行版后,由于做项目将机器纯windows了一把,现在又想安回centos,各种挫折折腾两天玩残一个u盘日,其中包括自己本本的原装系统也崩了,各种泪奔,下面记录一 ...

  7. Markdown最新使用说明

    Markdown基本语法说明 markdown 和 typora关系:typora是一款实时预览markdown的文本编辑器 本文推荐使用的Markdown编辑器为:Typora (用了多款编辑器,觉 ...

  8. Tomcat下载安装以及配置方法

    Tomcat环境变量配置方法 注意一定要在java环境配置成功之后再来配置tomcat.我这里仅展现在Windows系统下载的安装方法 Tomcat下载地址如下: https://tomcat.apa ...

  9. VS2017:win32项目与win32控制台应用程序的转换方法

    原文:https://www.cnblogs.com/asuser/articles/12297251.html 刚开始使用VS2017新建项目工程时,有时把应用类型的工程建成控制台类型的工程,在编译 ...

  10. gorm中的更新

    保存所有字段 Save 会保存所有的字段,即使字段是零值. db.First(&user, 5)user.Name = sql.NullString{"王八", true} ...