当前位置:   article > 正文

pytest.mark_pytest.mark.

pytest.mark.

目录

一、Pytest简介

二、安装

三、pytest.mark

1.标记

2.参数化

3. skip跳过

4. xfail 该用例置为失败


一、Pytest简介

Pytest是python一个第三方测试框架,有非富的第三方插件可以扩展

特点:

  1. 简单灵活,容易上⼿;⽀持参数化;
  2. 能够⽀持简单的单元测试和复杂的功能测试,还可以⽤来做selenium/appium等⾃动化测试、接口⾃动化测试(pytest+requests);
  3. pytest具有很多第三⽅插件,并且可以⾃定义扩展, ⽐较好⽤的如 pytest-allure(完美html测试报告⽣成) pytest-xdist(并发执行测试用例)
  4. 可以很好的和jenkins集成;

二、安装

pip安装,安装命令

  pip install pytest

查看是否安装成功

  pytest --version

三、pytest.mark

1.标记

作用:

给测试用例或类打上标签,便于管理和运行测试用例

使用:

在测试用例/测试类前面加上:@pytest.mark.标签名

打标记范围:测试用例、测试类、模块文件

注册标签

使用之前,先注册标签,个人理解就是先定义标签,如果不进行注册运行时(pytest的高级版本)可能会报警告让你进行注册

注册有以下两种方法:

  1. pytest.ini
  2. [pytest]
  3. addopts = -v -p no:warnings -p no:faulthandler
  4. filterwaring =
  5.     ignore:.*U.*mode is deprecared:DeprecationWarning
  6. testpaths = ./test ./
  7. markers =
  8.     smoking :
  9.     high    :
  10.     medium  :
  11.     lower   :

conftest.py需要多少个标签写多少

  1. def pytest_configure(config):
  2.     config.addinvalue_line("markers","P0"),
  3.     config.addinvalue_line("markers","P1"),
  4.     config.addinvalue_line("markers","reg")

使用mark标记

     在类或方法前加上@pytest.mark.标签名

测试代码:

  1. class Test_mark:
  2.     @pytest.mark.P0
  3.     def test_mark1(self,a=1):
  4.         print(a)
  5.     @pytest.mark.P1
  6.     def test_mark2(self,b=2):
  7.         print(b)

测试结果:

2.参数化

在类前或用例前用pytest.mark.parametrize ,可进行参数化

 传参方式比较灵活,有很多种,下面是列出的几种方式,其他的可自行研究

@pytest.mark.parametrize("参数名",列表)

源码:

  1. :param argnames:
  2.     A comma-separated string denoting one or more argument names, or
  3.     a list/tuple of argument strings.
  4. :param argvalues:
  5.     The list of argvalues determines how often a test is invoked with
  6.     different argument values.
  7.     If only one argname was specified argvalues is a list of values.
  8.     If N argnames were specified, argvalues must be a list of
  9.     N-tuples, where each tuple-element specifies a value for its
  10.     respective argname.

翻译:

       参数名:字符串的形式存在一个或多个参数,用逗号分隔 ,或者用参数字符串的列表或元组

  参数:如果是一个,则用list;

                  如果多个,参数必须以列表中元组的形式,每一个元组对应一组参数值

单个参数:

         只传单个参数的值即可

  1.     @pytest.mark.parametrize("a",["test1","test2"])
  2.     def test_a(self,a):
  3.         print(a)

运行结果:

  • 多个参数

      以元组的形式传入多个参数的值,一个元组代表一组参数的值

     例如:第一组a=1,b=2

               第二组a=3,b=4

  1.     @pytest.mark.parametrize("a,b",[(1,2),(3,4)])
  2.     def test_two_param(self,a,b):
  3.         print(a+b)   

运行结果:

 参数名以列表的传入

  1.     @pytest.mark.parametrize(["a","b","c"],[(1,2,3),(3,4,7)])
  2.     def test_list(self,a,b,c):
  3.         assert a+b == c
  4.         print(a+b)

 运行结果:

  单个多次传入多个参数,排列组合传入

  1.     a = (1,2,3)
  2.     b = (4,5)
  3.     @pytest.mark.parametrize("test_a",a)
  4.     @pytest.mark.parametrize("test_b",b)
  5.     def test_2_param(self,test_a,test_b):
  6.         print(test_a*test_b)

  运行结果:

   json格式传入参数

       调用时,在名称后面加.items()读取内容

  1.     data1 = {
  2.     "test1":"test1",
  3.     "test2":"test2"
  4.     }
  5.     @pytest.mark.parametrize("test",data1.items())
  6.     def test_json(self,test):
  7.         print(test)

    运行结果:

  3. skip跳过

自动化测试过程中,可能会遇到环境问题、已知bug、未完成接口等情况需要跳过用例,这时就需要用到pytest.mark.skip()或pytest.mark.skipif()

@pytest.mark.skip(reason)  只要有此标记就跳过,无条件

@pytest.mark.skipif(condition,reason="跳过原因")  满足输入的条件,就跳过

适用范围:

  •     放在测试类前面,跳过该类下的所有用例
  •     放在方法或者测试用例前面,跳过此方法或测试用例
  •     直接跳过 可加参数reason=“跳过原因”
  1.     @pytest.mark.skip(reason="跳过该用例")
  2.     @pytest.mark.parametrize(["a","b","c"],[(1,2,3),(3,4,7)])
  3.     def test_list(self,a,b,c):
  4.         assert a+b == c
  5.         print(a+b)

满足条件跳过,即condition返回值为true

  1.     @pytest.mark.parametrize(["a","b","c"],[(1,2,3),(3,4,7)])
  2.     @pytest.mark.skipif(1==1,reason = "跳过该用例")
  3.     def test_list(self,a,b,c):
  4.         assert a+b == c
  5.         print(a+b)

将skip赋值给变量,可多处调用

  1. myskip = pytest.mark.skip(reason="跳过a,b相关用例")
  2. class Test_param:
  3.     @myskip
  4.     def test_param(self,a=1,b=2):
  5.         assert a+b == 4
  6.         print(a+b)

4. xfail 该用例置为失败

已经知道该用例结果是失败的,又不想跳过,可以用xfail

xfail不会影响测试用例的执行,如果执行成功则报xpass,如果失败就会报xfail

  1.   #运行结果为xpass
  2.   @pytest.mark.xfail()
  3.     def test_normal(self,c=10):
  4.         print(c)
  5.     #运行结果为xfail
  6.     @pytest.mark.xfail()
  7.     @pytest.mark.parametrize(["a","b","c"],[(1,2,3),(3,4,7)])
  8.     def test_list(self,a,b,c):
  9.         assert a+b != c
  10.         print(a+b)

用例中标记失败,用pytest.xfail标记的测试用例,执行到这一句时,直接置为xfail,没有xpass

  1.     data1 = {
  2.     "test1":"test1",
  3.     "test2":"test2"
  4.     }
  5.     @pytest.mark.parametrize("test",data1.items())
  6.     def test_json(self,test):
  7.         pytest.xfail(reason='该功能未完成')
  8.         print(test)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/143702
推荐阅读
相关标签
  

闽ICP备14008679号