zoukankan      html  css  js  c++  java
  • pytest框架的安装与使用(mark)

            pytest框架的安装与使用

    一,pytest了解

      pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。

      优点:

      1.第一个优点肯定是简单,灵活,易上手

      2.支持参数化,pytest直接使用@pytest.mark.parametrize装饰器

      3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)

      4.pytest有丰富的第三方插件库,比如pytest-HTML、allure插件,专门用作与测试报告。pytest-selenium插件,集成测试。pytest-rerunfailures插件,用于失败重跑。pytest-assume插件,多重效验。pytest-ordering设定执行顺序等实用插件。

      5.pytest断言直接在assert 后面接表达式

      6.conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用。

      7.scope="session" 以实现多个.py跨文件使用一个session来完成多个用例

    二,安装

      1.安装pytest

       2种安装方法。

        1是直接通过pip安装。安装命令为:pip install pytest,

        检测是否安装成功命令:pytest --version ,如果他显示了版本名称,就表示已经安装成功。

        2是通过官网直接下载然后放进python插件库里。

        下载地址:https://pypi.org/project/pytest/

      2.安装插件

      安装html插件命令:pip install pytest-html

      除开 pytest-html插件外 ,pytest还具备丰富的插件库,pytest插件汇总站点:http://plugincompat.herokuapp.com/

    三,pytest执行测试需要遵循的规则(重要)

      · .py测试文件必须以test_开头或者_test结尾

       · 测试类必须以Test开头,并且不能有init方法

       · 测试方法必须以test_开头

       · 测试断言用assert

      使用:

      1,先创一个以test_开头的文件

      2,创建一个Test_code

      3,创建测试方法

    1 # -*- coding: utf-8 -*-
    2 
    3 class Test_code:
    4     def test_jian(self):
    5         assert 520==520

    执行有两种方法:

    1,是通过dos命令或者pycharm的命令窗口输入pytest。

      我这是通过pytest 地址 指定搜索的目录下的文件,直接执行文件中所有的用例,也可以精确到类,某个用例。
      还可以通过输入pytest直接所搜用例并执行。会在默认从当前目录中搜索用例,即在哪个目录下运行pytest命令,则从哪个目录中搜索。

     2是通过在主函数中用代码执行。需要导入pytest包。

      可以在mian()中填上哪个用例方法就执行哪个。

     

    # -*- coding: utf-8 -*-
    import pytest
    class Test_code:
        def test_jian(self):
            assert 520==520
    
    
    if __name__ == '__main__':
        pytest.main()

    四,全能的mark

      1,标签

        我们在运行测试用例的时候,有时候不需要全部测试,那我们就可以通过给用例打标签的方式来执行用例。

        使用:

        1,创建一个pytest.ini文件,在文件中按照以下格式添加标签名:

        2,我们通过 (@pytest.mark.标签名) 这个代码放在用例上面来标明。一个用例可以用多个标签来表示

        冒号前是标签名,冒号后面是注释,方便明白标签是什么意思。

        注意:这个文件中不能含任何中文。

    [pytest]
    markers=
            smoke:smoke test
            demo:demo test

        给用例赋予标签,代码如下:

        注意:可以给类赋予标签,也可以给用例赋予标签

    # -*- coding: utf-8 -*-
    import pytest
    
    @pytest.mark.demo
    class Test_code:
        @pytest.mark.smoke
        def test_jian(self):
            assert 520==520

        运行:dos命令     pytest -m 标签名

    或者

    if __name__ == '__main__': 
        pytest.main(['-m','demo'])

      2,fixture功能  

      在执行测试用例前往往需要进行环境的准备,在执行完用例,将环境销毁。在unittest中一般通过 setUp与tearDown来进行用例前的环境准备和用例后的环境销毁。而在pytest中还有另外一种方式——fifixture。与setup和teardown相比,fifixture使用起来更加灵活,更加方便。
      
      Fixture的使用
      这是fixture在页面中代码使用方法
      使用@pytest.mark.usefixtures("环境方法名") 代码放在用例或者类前,放在类前就是这个类里面的用例都会先执行环境。
     
    # -*- coding: utf-8 -*-
    import pytest
               #把前置
    @pytest.mark.demo
    class Test_code:
     
       @pytest.mark.usefixtures("aa1")  #把环境放在用例前,会在执行用例前执行这个环境aa1 @pytest.mark.smoke
    def test_jian(self): assert 520==520 @pytest.fixture() #声明这是fixture函数, def aa(seif): print("先执行我,然后再执行用例方法") aa=1+1 yield aa1 # 类似分隔符号, yield 后面接变量名 再执行后可以输出aa print("执行完用例后再执行我")

      多个文件共享一个fixture

      可以可以将fixture放在指定文件conftest.py中,来实现多个文件共享一个fixture(文件名不可更改)

    import pytest
    
    @pytest.fixture()       #声明这个是fixture函数
    def aa(seif):
         print("先执行我,然后再执行用例方法")
         aa=1+1
         yield aa           # 类似分隔符号, yield 后面接变量名   再执行后可以输出aa
         print("执行完用例后再执行我")

      3,参数化

      pytest参数化 和unittest中的ddt相似。都是把数据放入用例中执行。

      使用@pytest.mark.parametrize() 代码将数据代入用例中,括号中必须声明代入用例中的变量名,用引号引起,变量名必须一样

    list=([('741852963', '123456', '123456'),
        ('122886', '123456', '123456')])

    @pytest.mark.parametrize('urer,passd,ex',list) # 代入数据代码 def test_shuju(self,urer,pwd,ex): #变量名要和parametrize里面一样 print('这个是用户名'.format(urer)) print('这个是密码{}'.format(pwd)) assert pwd==ex

      4,失败重跑

       我们使用:pip3 install pytest-rerunfailures  代码来下载插件

       使用:@pytest.mark.flaky() 代码放在用例前面

    list=([('741852963', '123456', '123456'),
        ('122886', '123456', '123456')])


    @pytest.mark.flaky(reruns=5, reruns_delay=1) # 如果失败则延迟1s后重跑 最多跑五次 @pytest.mark.parametrize('urer,passd,ex',list) def test_shuju(self,urer,pwd,ex): print('这个是用户名'.format(urer)) print('这个是密码{}'.format(pwd)) assert pwd==ex

      

      

  • 相关阅读:
    iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二)
    iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
    iOS开发UI篇—简单介绍静态单元格的使用
    iOS开发UI篇—UITableview控件使用小结
    ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
    iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
    iOS开发UI篇—实现UItableview控件数据刷新
    iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
    人人都应学习的公链知识——比原总体架构
  • 原文地址:https://www.cnblogs.com/xiaolixiang/p/13292662.html
Copyright © 2011-2022 走看看