Pytest如何使用mark的方法

一、常见的内置markers

  • usefixtures - 为测试函数或者测试类知名使用那些fixture
  • filterwarnings - 为一个测试函数过滤一个指定的告警
  • skip - 跳过一个测试函数
  • skipif - 如果满足条件就跳过测试函数
  • xfail - 标记用例失败
  • parametrize - 参数化

二、查看所有markers

如下,可以查看到当前环境中的所有markers

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

$ pytest --markers

@pytest.mark.forked: Always fork for this test.

@pytest.mark.flaky(reruns=1, reruns_delay=0): mark test to re-run up to 'reruns' times. Add a delay of 'reruns_delay' seconds between re-runs.

@pytest.mark.hypothesis: Tests which use hypothesis.

@pytest.mark.allure_label: allure label marker

@pytest.mark.allure_link: allure link marker

@pytest.mark.allure_description: allure description

@pytest.mark.allure_description_html: allure description html

@pytest.mark.filterwarnings(warning): add a warning filter to the given test. see https://docs.pytest.org/en/stable/warnings.html#pytest-mark-filterwarnings

@pytest.mark.skip(reason=None): skip the given test function with an optional reason. Example: skip(reason="no way of currently testing this") skips the test.

@pytest.mark.skipif(condition, ..., *, reason=...): skip the given test function if any of the conditions evaluate to True. Example: skipif(sys.platform == 'win32') skip

s the test if we are on the win32 platform. See https://docs.pytest.org/en/stable/reference.html#pytest-mark-skipif

@pytest.mark.xfail(condition, ..., *, reason=..., run=True, raises=None, strict=xfail_strict): mark the test function as an expected failure if any of the conditions eva

luate to True. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expe

cted, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See https://docs.pytest.org/en/stable/reference.html#pytes

t-mark-xfail

@pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of valu

es if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would lead to two calls o

f the decorated test function, one with arg1=1 and another with arg1=2.see https://docs.pytest.org/en/stable/parametrize.html for more info and examples.

@pytest.mark.usefixtures(fixturename1, fixturename2, ...): mark tests as needing all of the specified fixtures. see https://docs.pytest.org/en/stable/fixture.html#usefix

tures

@pytest.mark.tryfirst: mark a hook implementation function such that the plugin machinery will try to call it first/as early as possible.

@pytest.mark.trylast: mark a hook implementation function such that the plugin machinery will try to call it last/as late as possible.

三、注册自定义marks

方式一:在pytest.ini中按照如下格式声明即可,冒号之前为注册的mark名称,冒号之后为此mark的说明

1

2

3

4

[pytest]

markers =

    smoke: smoke tests

    test: system tests

此时test_demo.py代码如下

1

2

3

4

5

6

7

8

9

10

11

12

import pytest

@pytest.mark.smoke

def test_func():

    assert 1==1

@pytest.mark.test

def test_func2():

    assert 1==1

def test_func3():

    assert 1==1

使用pytest -m smoke执行结果如下,发现此时即只执行了标记为smoke的一个用例,这就是和自定义mark的使用方法

1

2

3

4

5

6

7

8

9

10

$ pytest -m smoke

========================================================================= test session starts ==========================================================================

platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0

rootdir: D:\src\blog\tests, configfile: pytest.ini

plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0

collected 3 items / 2 deselected / 1 selected                                                                                                                          

test_demo.py .                                                                                                                                                    [100%]

=================================================================== 1 passed, 2 deselected in 0.04s ====================================================================

方式二:在conftest.py文件中重写pytest_configure函数即可,比如如下,注册两个mark:smoke和test

1

2

3

4

5

6

7

def pytest_configure(config):

    config.addinivalue_line(

        "markers", "smoke: smoke test"

    )

    config.addinivalue_line(

        "markers", "test: system test"

    )

test_demo.py代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

import pytest

@pytest.mark.smoke

def test_func():

    assert 1==1

@pytest.mark.test

def test_func2():

    assert 1==1

def test_func3():

    assert 1==1

通过pytest -m test 执行结果如下:

1

2

3

4

5

6

7

8

9

10

$ pytest -m test

========================================================================= test session starts ==========================================================================

platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0

rootdir: D:\src\blog\tests

plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0

collected 3 items / 2 deselected / 1 selected                                                                                                                          

test_demo.py .                                                                                                                                                    [100%]

=================================================================== 1 passed, 2 deselected in 0.02s ====================================================================

四、对未注册mark的限制

默认情况下,对未注册mark直接使用是会产生一条告警信息,比如这里把pytest.ini和conftest.py都删除掉,只剩test_demo.py一个文件

test_demo.py代码如下

1

2

3

4

5

6

7

8

9

10

11

12

import pytest

@pytest.mark.smoke

def test_func():

    assert 1==1

@pytest.mark.test

def test_func2():

    assert 1==1

def test_func3():

    assert 1==1

直接使用 pytest -m smoke 执行结果如下,可以发现这里产生了两条告警,这就是因为这两条告警未在pytest.ini或者conftest.py中进行注册的原因,在实际项目开发中如果在执行测试的时候发现了这种大片告警打印,解决办法就是在pytest.ini或者conftest.py将这些告警报出的mark都进行注册即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

$ pytest -m smoke

========================================================================= test session starts ==========================================================================

platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0

rootdir: D:\src\blog\tests

plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0

collected 3 items / 2 deselected / 1 selected                                                                                                                          

test_demo.py .                                                                                                                                                    [100%]

=========================================================================== warnings summary ===========================================================================

test_demo.py:3

  D:\src\blog\tests\test_demo.py:3: PytestUnknownMarkWarning: Unknown pytest.mark.smoke - is this a typo?  You can register custom marks to avoid this warning - for deta

ils, see https://docs.pytest.org/en/stable/mark.html

    @pytest.mark.smoke

test_demo.py:7

  D:\src\blog\tests\test_demo.py:7: PytestUnknownMarkWarning: Unknown pytest.mark.test - is this a typo?  You can register custom marks to avoid this warning - for detai

ls, see https://docs.pytest.org/en/stable/mark.html

    @pytest.mark.test

-- Docs: https://docs.pytest.org/en/stable/warnings.html

============================================================= 1 passed, 2 deselected, 2 warnings in 0.02s ==============================================================

如果希望强制限制必须先注册再使用mark,则可以在pytest.ini中加上如下配置即可

1

2

[pytest]

addopts = --strict-markers

比如test_demo.py代码:

1

2

3

4

5

6

7

8

9

10

11

12

import pytest

@pytest.mark.smoke

def test_func():

    assert 1==1

@pytest.mark.test

def test_func2():

    assert 1==1

def test_func3():

    assert 1==1

此时继续使用pytest -m smoke执行结果如下,发现此时已经报错了,即强制限制必须对mark进行注册

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$ pytest -m smoke

========================================================================= test session starts ==========================================================================

platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0

rootdir: D:\src\blog\tests, configfile: pytest.ini

plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, hypothesis-6.31.6, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0

collected 0 items / 1 error                                                                                                                                            

================================================================================ ERRORS ================================================================================

____________________________________________________________________ ERROR collecting test_demo.py _____________________________________________________________________

'smoke' not found in `markers` configuration option

======================================================================= short test summary info ========================================================================

ERROR test_demo.py

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

=========================================================================== 1 error in 0.14s ===========================================================================

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值