pytest 安装与入门(mark标记)
1、安装
pip3 install -U pytest
报错:OSError: [WinError 87] 参数错误
原因:python版本与pytest版本不一致
解决方案:
如果是python3.7.4以及pytest5.0+,将python降到3.7.3
python3.7.4 卸载报错0x80070643,请参考https://jingyan.baidu.com/article/22a299b5f3647b9e19376acb.html
2、pytest基础
2.1、编写规范以及执行测用例方法
1) 测试文件以test_开头(以test结尾也行)
2) 测试类以Test开头,并且不能带有init方法
3) 测试函数以test开头
2.2、断言assert使用
pytest使用 python里面的assert断言方法
assert xx:判断xx为真
assert not xx:判断xx不为真
assert a in b:判断b包含a
assert a == b:判断a等于b
assert a !=b:判断a不等于b
2.3 执行测试用例方式
pytest查找策略: pytest 会递归查找当前目录下所有以 test
开始或结尾的 Python 脚本,并执行文件内的所有以 test
开始或结束的函数和方法
以下面测试脚本为例:
#test_a.py
def test_f1():
assert 1 == 1
def test_f2():
assert 1 != 1
- 标记函数 第一种,显式指定函数名,通过
::
标记 ,如pytest 文件路径/test_a.py::test_f1 第二种,使用模糊匹配,使用-k
选项标识 pytest -k f1 tests/test-function/test_no_mark.py 第三种,使用pytest.mark
在函数上进行标记。 以下面脚本为例@pytest.mark.aaadef test_f1():
assert 1 == 1
@pytest.mark.bbb
def test_f2():
assert 1 == 2 测试时使用 -m 选择标记的测试函数: D:\learn\pytest>pytest -m aaa
========================================================================================= test session starts ==========================================================================================
platform win32 -- Python 3.7.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\learn\pytest
collected 2 items / 1 deselected / 1 selected test_sample.py .
============================================================================= 1 passed, 1 deselected in 0.04s ==============================================================================
备注:
一个函数可以打多个标记;多个函数也可以打相同的标记
@pytest.mark.aaa
@pytest.mark.ccc
def test_f1():
assert 1 == 1
2、跳过测试
过滤测试函数,比如在一些用于调试的函数或者是未开发完成的功能时,最好的方法就是略过
pytest.mark.skipif
(condition,*, reason=None)
如果条件为 True
,跳过测试
- 参数condition (bool or str) --
True/False
如果应跳过条件或 condition string .reason (str) -- 跳过测试函数的原因。
pytest.mark.skip
(*, reason=None)
无条件跳过测试函数
- 参数reason (str) -- 跳过测试函数的原因。
@pytest.mark.skip(reason='test')
def test_f1():
assert 1 == 1
@pytest.mark.skipif(1==2,reason='test 001')
def test_f2():
assert 2 == 2
执行用例时, 使用 s
表示测试被跳过(SKIPPED
)
D:\learn\pytest>pytest -s test_sample.py
========================================================================================= test session starts ==========================================================================================
platform win32 -- Python 3.7.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\learn\pytest, configfile: pytest.ini
collected 2 items
test_sample.py s.
===================================================================================== 1 passed, 1 skipped in 0.10s =====================================================================================
3、预见的错误
pytest.mark.xfail 教程 : xfail:将测试功能标记为预期失败 . 含义是期望测试用例是失败的,但是不会影响测试用例的的执行。如果测试用例执行失败的则结果是xfail(不会额外显示出错误信息);如果测试用例执行成功的则结果是xpass
pytest.mark.xfail(condition=None, *, reason=None, raises=None, run=True, strict=False)
condition (bool or str) -- 将测试功能标记为xfail的条件 (True/False 或A condition string ). 如果是bool,还必须指定 reason (见 condition string )
reason (str) -- 测试函数标记为xfail的原因。
raises (Type[Exception]) -- 异常子类预期由测试函数引发;其他异常将使测试失败。
run (bool) -- 是否应实际执行测试功能。如果 False ,函数将始终Xfail且不会执行(如果函数是segfaulting,则很有用)。
strict (bool) --
如果 False (默认)功能将如果用例失败了在终端输出中显示为 xfailed , 用例成功了显示xpass 。
如果 True ,功能将在终端输出中显示为 xfailed 如果它失败了,但是如果它意外地通过了,会提示本次用例有fail。这对于标记总是失败的函数特别有用,如果函数意外开始通过,则应该有明确的指示(例如,库的新版本修复了已知的错误)。
@pytest.mark.xfail(strict=True)
def test_f1():
assert 1 == 1
@pytest.mark.xfail(strict=True)
def test_f2():
assert 1 == 2
D:\learn\pytest>pytest test_sample.py
======================== test session starts ========================
platform win32 -- Python 3.7.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\learn\pytest, configfile: pytest.ini
collected 2 items
test_sample.py Fx [100%]
============================= FAILURES ==============================
______________________________ test_f1 ______________________________
[XPASS(strict)]
====================== short test summary info ======================
FAILED test_sample.py::test_f1
=================== 1 failed, 1 xfailed in 0.04s ====================
strict参数为False
@pytest.mark.xfail(strict=False)
def test_f1():
assert 1 == 1
@pytest.mark.xfail(strict=False)
def test_f2():
assert 1 == 2
D:\learn\pytest>pytest test_sample.py
====================== test session starts =======================
platform win32 -- Python 3.7.3, pytest-6.2.3, py-1.10.0, pluggy-0.1
3.1
rootdir: D:\learn\pytest, configfile: pytest.ini
collected 2 items
test_sample.py Xx [100%]
================= 1 xfailed, 1 xpassed in 0.10s ==================