pytest封神之路第四步 内置和自定义marker
可以通过命令行查看所有marker,包括内置和自定义的
pytest --markers
内置marker
内置marker本文先讲usefixtures 、filterwarnings 、skip 、skipif 、xfail这5个。参数化的marker我会写在《pytest参数化》中,hook的marker我会写在《pytest hook》中,插件的marker(pytest-ordering、allure等)我会写在《pytest插件》中。当前只需知道有以上这些分类的marker即可,更多内容请关注后续文章。
usefixtures
如果我们只想把fixture注入到test中,test不直接访问fixture的时候,就需要用到usefixtures。
示例,test需要一个临时目录,但是并不需要知道这个目录具体路径在哪
# content of conftest.py
import os
import shutil
import tempfile
import pytest
@pytest.fixture
def cleandir():
old_cwd = os.getcwd()
newpath = tempfile.mkdtemp()
os.chdir(newpath)
yield
os.chdir(old_cwd)
shutil.rmtree(newpath)
# content of test_setenv.py
import os
import pytest
@pytest.mark.usefixtures("cleandir")
class TestDirectoryInit:
def test_cwd_starts_empty(self):
assert os.listdir(os.getcwd()) == []
with open("myfile", "w") as f:
f.write("hello")
def test_cwd_again_starts_empty(self):
assert os.listdir(os.getcwd()) == []
TestDirectoryInit的测试方法需要一个临时目录作为当前工作目录,在类上添加@pytest.mark.usefixtures("cleandir"),类的方法不加fixture也能有"cleandir"的效果。
usefixtures可以添加多个fixture
@pytest.mark.usefixtures("cleandir", "anotherfixture")
usefixtures可以用在pytestmark,作用域是定义所在module的所有tests
pytestmark = pytest.mark.usefixtures("cleandir")
usefixtures也可以用在pytest.ini,作用域是整个项目的所有tests
# content of pytest.ini
[pytest]
usefixtures = cleandir
不过需要注意的是fixture函数本身是不能用usefixtures的,如果想要嵌套fixture,只能通过在fixture修饰的函数中,添加参数这种方式。
filterwarnings
过滤警告信息。
示例,api_v1()抛出了“api v1”的警告,test_one()函数使用filterwarnings过滤掉了
import warnings
def api_v1():
warnings.warn(UserWarning("api v1, should use functions from v2"))
return 1
@pytest.mark.filterwarnings("ignore:api v1")
def test_one():
assert api_v1() == 1
同样可以添加到pytestmark和pytest.ini中。
skip
跳过,不测试。
示例,skip需要添加reason哦
@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
...
不过,更实用的方式是调用pytest.skip(reason)函数,而不是用mark,这样就可以用if判断跳不跳
def test_function():
if not valid_config():
pytest.skip("unsupported configuration")
allow_module_level 可以跳过整个module
import sys
import pytest
if not sys.platform.startswith("win"):
pytest.skip("skipping windows-only tests", allow_module_level=True)
skipif
if判断跳不跳,还可以用skipif。
示例,如果Python版本小于3.6就跳过测试
import sys
@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_function():
...
如果想在summary中看到reason,需要添加-rs参数。
可以把skipif赋值给变量,然后直接引用变量,或者把变量import到其他module中使用
# content of test_mymodule.py
import mymodule
minversion = pytest.mark.skipif(
mymodule.__versioninfo__ < (1, 1), reason="at least mymodule-1.1 required"
)
@minversion
def test_function():
...
# test_myothermodule.py
from test_mymodule import minversion
@minversion
def test_anotherfunction():
...
skipif添加到class上,会跳过类中所有方法。
可以使用pytestmark跳过module内所有test
# test_module.py
pytestmark = pytest.mark.skipif(...)
如果function有多个skipif作用,只要有一个为True,就会跳过。
xfail
明知失败,依然前行!不好意思跑偏了。xfail就是expected fail,预期失败
@pytest.mark.xfail
def test_function():
...
执行后summary不会统计为"failed",会单独列出来。如果结果失败了,“expected to fail” (XFAIL);如果结果成功了,“unexpectedly passing” (XPASS)。但是整个执行结果是”Tests passed“。
if判断
def test_function():
if not valid_config():
pytest.xfail("failing configuration (but should work)")
值得注意的是,marker会继续执行所有test代码,pytest.xfail()函数会抛出异常,中断执行后续代码
添加condition,判断条件
@pytest.mark.xfail(sys.platform == "win32", reason="bug in a 3rd party library")
def test_function():
...
添加reason,理由
@pytest.mark.xfail(reason="known parser issue")
def test_function():
...
添加raises,抛出异常/错误
@pytest.mark.xfail(raises=RuntimeError)
def test_function():
...
添加run,禁止运行
@pytest.mark.xfail(run=False)
def test_function():
...
添加strict,严格模式,即使xpass也会强制失败,summary中有输出信息”[XPASS(strict)] “,测试结果为”Tests failed“。
@pytest.mark.xfail(strict=True)
def test_function():
...
断言成功也强制失败,确实够强势的!
可以在ini文件中定义全局strict
[pytest]
xfail_strict=true
在命令行添加--runxfail,忽略xfail marker,相当于没有添加这个标记的效果,该成功就成功,该失败就失败,再强势也不虚,哈哈,恶灵退散。
pytest --runxfail
pytest --runxfail
再强势也不虚,恶灵退散,哈哈。
自定义marker
通过注解自定义marker
# content of test_server.py
import pytest
@pytest.mark.webtest
def test_send_http():
pass # perform some webtest test for your app
def test_something_quick():
pass
def test_another():
pass
class TestClass:
def test_method(self):
pass
在命令行通过-m指定运行mark打标的test
$ pytest -v -m webtest
也可以反选
$ pytest -v -m "not webtest"
但是,这样定义的marker是未注册的!在执行后会警告,PytestUnknownMarkWarning。如果添加了命令行参数--strict-markers ,未注册的marker会报错。
可以在pytest.ini文件中注册,冒号后面的所有代码都是marker说明,包括换行
[pytest]
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
serial
更高级的,可以在pytest_configure hook函数中注册,这主要用在第三方插件
def pytest_configure(config):
config.addinivalue_line(
"markers", "env(name): mark test to run only on named environment"
)
简要回顾
本文介绍了5个pytest内置的marker,接着介绍了如何自定义marker和注册marker。通过marker,可以让我们更灵活的执行用例。
参考资料
docs-pytest-org-en-stable
pytest封神之路第四步 内置和自定义marker的更多相关文章
- pytest封神之路第五步 参数化进阶
用过unittest的朋友,肯定知道可以借助DDT实现参数化.用过JMeter的朋友,肯定知道JMeter自带了4种参数化方式(见参考资料).pytest同样支持参数化,而且很简单很实用. 语法 在& ...
- pytest封神之路第零步 快速入门
背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest.如果你是从这篇文章第一次阅读,那么请忽略以上 ...
- pytest封神之路第三步 精通fixture
首先放一句"狠话". 如果你不会fixture,那么你最好别说自己会pytest. (只是为了烘托主题哈,手上的砖头可以放下了,手动滑稽) fixture是什么 看看源码 def ...
- pytest封神之路第六步 断言技巧
pytest的断言把Python语言简洁的优点发挥的淋漓尽致,因为它用的就是Python的标准断言assert. assert基础 assert用法 assert_stmt ::= "ass ...
- pytest封神之路第二步 132个命令行参数用法
在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个 序号 类别 中文名 包含命令行参数数量 1 positional arguments 形参 1 2 gene ...
- pytest封神之路第一步 tep介绍
『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...
- [Python笔记]第四篇:内置函数
本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...
- python之路:进阶篇 内置函数
li = [11, 22, 33] news = map( li = [100, 2200, 3300] news = map( [13, 24, 35] [11, 11, 11] [22, 4 ...
- GO语言系列(四)- 内置函数、闭包与高级数据类型
一.内置函数.递归函数.闭包 内置函数 1. close:主要用来关闭channel 2. len:用来求长度,比如string.array.slice.map.channel 3. new:用来分配 ...
随机推荐
- openvswitch 流表测试 ovs-appctl
[root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...
- 个人项目WC.exe Node.js+electron实现
前言 实现语言:Javascript 编译工具:webstorm GitHub:https://github.com/NPjuan/WC.git 项目要求 wc.exe 是一个常见的工具,它能统计文本 ...
- 目标追踪(Object Tracking)概念的简要介绍
现在我们有一个视频流,可以拆解出 N 个帧出来,这时候初始帧/某一帧中出现了一个我们感兴趣目标,我们希望在后续帧中对这个目标进行追踪,这时候就需要 CV 中的目标追踪: 目标追踪的效果如下: 虽然效果 ...
- 机器学习 | 深入SVM原理及模型推导(一)
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第32篇文章,我们来聊聊SVM. SVM模型大家可能非常熟悉,可能都知道它是面试的常客,经常被问到.它最早诞生于上世纪六 ...
- java父类子类代码
import java.util.Scanner;import java.util.*; class PersonF{ public void print(String ID,String Workc ...
- [CSP-S2019]划分 题解
CSP-S2 2019 D2T2 考场上读完题感觉是DP就直接扔了开T3了,考完才发现部分分好像不难拿,枯了 题意分析 给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和. ...
- python安装wordcloud库报错
pip install wordcloud 安装成了这样 红彤彤的一片 解决方法 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 下载对应版 ...
- 跳转语句 break 和 continue
break跳出循环体,结束本次循环. continue结束本次循环. for(var i=0; i<5; i++){ if(i == 3) break; document.write(" ...
- Mybatis入门篇之基础CRUD
前言 作为一个资深后端码农天天都要和数据库打交道,最早使用的是 Hiberate,一个封装性极强的持久性框架.自从接触到 Mybatis 就被它的灵活性所折服了,可以自己写 SQL,虽然轻量级,但是麻 ...
- P3419 [POI2005]SAM-Toy Cars
Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上 ...