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

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

标记用例

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

注册标签

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

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

  1. [pytest]
  2. markers =
  3. smoke: marks test as smoke
  4. login
  5. order: 下单场景

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

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

  1. def pytest_configure(config):
  2. marker_list = [
  3. "smoke: marks test as smoke",
  4. "login",
  5. "order: 下单场景"
  6. ]
  7. for marker in marker_list:
  8. config.addinivalue_line("markers", marker)

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

使用方法

  1. import pytest
  2. # 标记测试函数
  3. @pytest.mark.smoke
  4. def test_01():
  5. print("执行test_01")
  6. def test_02():
  7. print("执行test_02")
  8. # 标记测试类
  9. @pytest.mark.order
  10. class TestOrder:
  11. def test_order(self):
  12. print("下单")
  13. def test_pay(self):
  14. print("支付")
  15. # 多个标签
  16. @pytest.mark.smoke
  17. @pytest.mark.login
  18. def test_login():
  19. print("登录")

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

  1. # 标记测试类(单个标签)
  2. class TestOrder:
  3. # 给类中的所有测试方法打上order标签
  4. pytestmark = pytest.mark.order
  5. def test_order(self):
  6. print("下单")
  7. def test_pay(self):
  8. print("支付")
  9. # 标记测试类(多个标签)
  10. class TestOrder:
  11. # 给类中的所有测试方法打上order、smoke标签
  12. pytestmark = [pytest.mark.order, pytest.mark.smoke]
  13. def test_order(self):
  14. print("下单")
  15. def test_pay(self):
  16. print("支付")

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

  1. import pytest
  2. # 模块中的所有测试函数、测试类都会被打上order、smoke标签
  3. pytestmark = [pytest.mark.order, pytest.mark.smoke]
  4. def test_01():
  5. print("执行test_01")
  6. def test_02():
  7. print("执行test_02")
  8. class TestOrder:
  9. def test_order(self):
  10. print("下单")
  11. def test_pay(self):
  12. print("支付")

执行方法

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

命令行

  1. # 执行被标记为smoke的用例
  2. pytest -m smoke
  3. # 执行被标记为smoke且被标记为login的用例
  4. pytest -m "smoke and login"
  5. # 执行被标记为smoke或login的用例
  6. pytest -m "smoke or login"

代码执行

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

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

  1. import pytest
  2. # 标记测试函数
  3. @pytest.mark.smoke
  4. def test_01():
  5. print("执行test_01")
  6. def test_02():
  7. print("执行test_02")
  8. # 标记测试类
  9. @pytest.mark.order
  10. class TestOrder:
  11. def test_order(self):
  12. print("下单")
  13. def test_pay(self):
  14. print("支付")
  15. # 多个标签
  16. @pytest.mark.smoke
  17. @pytest.mark.login
  18. def test_login():
  19. print("登录")
  20. if __name__ == '__main__':
  21. pytest.main(['-s', '-m smoke'])

运行该模块,结果如下:

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

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

  1. # run.py
  2. import pytest
  3. if __name__ == '__main__':
  4. pytest.main(["-s", "-m", "smoke or order"])

运行结果如下:

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

标记跳过

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

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

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

示例如下:

  1. import pytest
  2. @pytest.mark.skip(reason="不需要执行test_01")
  3. def test_01():
  4. print("执行test_01")
  5. @pytest.mark.skip(2>1, reason="如果2大于1则跳过不执行")
  6. def test_02():
  7. print("执行test_02")
  8. if __name__ == '__main__':
  9. 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。

常用的参数示例如下:

  1. import pytest
  2. # run、strict都为默认,因为用例执行是失败的,所以该用例执行结果会被标记为xfail
  3. @pytest.mark.xfail(reason="bug待修复")
  4. def test_01():
  5. print("执行test_01")
  6. a = "hello"
  7. b = "hi"
  8. assert a == b
  9. # run、strict都为默认,因为用例执行是通过的,所以该用例执行结果会被标记为xpass
  10. @pytest.mark.xfail(condition=lambda: True, reason="bug待修复")
  11. def test_02():
  12. print("执行test_02")
  13. a = "hello"
  14. b = "hi"
  15. assert a != b
  16. # run=False,该用例不执行,直接将结果标记为xfail
  17. @pytest.mark.xfail(reason="功能尚未开发完成", run=False)
  18. def test_03():
  19. print("执行test_03")
  20. a = "hello"
  21. b = "hi"
  22. assert a == b
  23. # strict=True,因为用例执行是通过的,所以结果会被标记为failed
  24. @pytest.mark.xfail(reason="功能尚未开发完成", strict=True)
  25. def test_04():
  26. print("执行test_04")
  27. a = "hello"
  28. b = "he"
  29. assert b in a
  30. if __name__ == '__main__':
  31. 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. GORM学习指南

    orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...

  2. Hive的导入导出和常用过滤语句的学习

    原文: https://www.toutiao.com/i6769166601871688196/?group_id=6769166601871688196 数据的导入 load data [loca ...

  3. PPT2010制作图片玻璃磨砂效果

    原文链接: https://www.toutiao.com/i6488928834799272462/ 选择"插入"选项卡,"图像"功能组,"图片&q ...

  4. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  5. Bootstrap实战 - 响应式布局

    一.介绍 响应式布局就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的. 导航栏与轮播在大部分网站的头部占很高的比重,特别是导航栏,扮演着网站地图的 ...

  6. Python科学计算类库

    Numpy是什么 Numpy是一个开源的Python科学计算库.使用Numpy,就可以很自然地使用数组和矩阵.Numpy包含很多实用的数学函数,涵盖线性代数运算.傅里叶变换和随机数生成等功能. 矩阵: ...

  7. vscode设置vue结构的初始代码片段

    { "Print to console": { "prefix": "vue", "body": [ "< ...

  8. 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernetes)-kubernetes/dashboard

    本章介绍所需环境:ubuntu18.04,建立在上一篇微服务探索之路01篇已经安装了docker的基础上. 1 替换k8s镜像源为国内镜像 进入目录 cd /etc/apt/sources.list. ...

  9. context包

    目录 Context包到底是干嘛用的? context原理 什么时候应该使用 Context? 如何创建 Context? 主协程通知有子协程,子协程又有多个子协程 context核心接口 empty ...

  10. jsp加载css失效的解决方法

    问题: 有时候大家修改了css文件里的样式,但是刷新浏览器,利用工具看样式的时候,发现样式根本没加载或者说没更新, 其实这出现的问题就是缓存的问题 解决: 如何避免发生这种事,其实很简单,只需要每次请 ...