小门板儿

Menu

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
  1. 标记函数 第一种,显式指定函数名,通过 :: 标记 ,如pytest 文件路径/test_a.py::test_f1 第二种,使用模糊匹配,使用 -k 选项标识 pytest -k f1 tests/test-function/test_no_mark.py 第三种,使用 pytest.mark 在函数上进行标记。 以下面脚本为例@pytest.mark.aaa
    def 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 ,跳过测试

pytest.mark.skip(*, reason=None)

无条件跳过测试函数

@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 ==================
— 于 共写了4410个字
— 标签:

评论已关闭。