• pytest


    pytest简介:
    pytest 是 python 的第三方单元测试框架,比自带的 unittest 更简洁和高
    效,同时兼容 unittest 框架。它还有如下优点:
    1、简单灵活,容易上手,文档丰富;
    2、支持参数化,可以细粒度地控制要测试的测试用例;
    3、能够支持简单的单元测试和复杂的功能测试,还可以用来做
    selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
    4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytestselenium(
    集成selenium)、pytest-html(完美html测试报告生成)、
    pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
    5、测试用例的skip和xfail处理;
    6、可以很好的和CI工具结合,例如jenkins。

    pytest是python的一个第三方类库,可以直接使用pip install pytest 在线
    安装,或者下载离线包安装。

    pytest测试用例编写规则:
    1、测试文件以test_开头(以_test结尾也可以)
    2、测试类以Test开头,并且不能带有 init 方法
    3、测试函数以test_开头
    4、断言必须使用 assert

    fixture方法详解:
    fixture(callable_or_scope=None,*args,scope="function",params=None,aut
    ouse=False,ids=None,name=None):
    scope: 作用范围,设置范围后,会根据设置的范围去触发执行。范围可选值:
    function:每个方法(函数)都会执行一次。(默认)
    class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
    module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
    package/session:多个文件调用一次,可以跨 .py 文件。
    params:传入参数,接收一个列表,列表中每个数据都作为用例的输入
    autouse:在一个session内所有的test都会自动调用当前的fixture,默认为false
    ids:测试字符串id的列表,每个测试字符串id对应于params,默认为参数值
    name:fixture的名称,默认为装饰函数的名称

    fixture方法实战之autouse、ids、name应用:

    import pytest
    
    @pytest.fixture(ids=['01','02','03'],params=[100,200,300],scope='class')
    def set_up(request):  # 装饰函数的名称
        return request.param
    
    class Test01:
        def testadd(self,set_up):
            print('exec TestDemo01 testadd')
            assert 100+100 <= set_up
    
    if __name__=='__main__':
        pytest.main(['-v','-s'])  # -s 为了查看 print信息  -v 显示用例详情

    conftest.py文件应用:
    pytest中的fixture是pytest用于将测试前后进行预备,清理工作的代码分离
    出核心测试逻辑的一种机制。但是我们更加希望的是在一个测试套件中,能够共
    享fixture的机制,这样一个测试套件里面的所有测试点都能够共同使用。
    在pytest中可以通过conftest.py来共享fixture,如果希望多个测试文件共同
    使用一个fixture时候,可以在该目录下创建conftest.py文件。有如下代码结构:
    使用conftest.py:
    1、该文件所在目录必须存在__init__.py文件
    2、该文件不能被其他文件导入,会自动被调用
    3、所有同目录测试文件运行前都会执行该文件
    4、该文件名字是固定的,不可以做任何修改

    • 外层的conftest.py文件针对当前层和下层的模块都可以生效引用
    • 内层的测试模块可以同时自定义配置调用fixure

    pytest中的mark:

    mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记
    名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等。

    设置步骤如下:
    1、注册标签名,通过pytest.ini配置文件注册;
    2、在测试用例的前面加上:@pytest.mark.已注册标签名
    3、运行时,根据用例标签过滤(-m 标签名)

    mark应用实战之测试用例分组执行:
    1、pytest.ini配置文件编写:

    [pytest]
    markers =
            smoketest:冒烟测试
            systemtest:系统测试

    2、测试用例分组,也可以使用 -m not smoketest 执行组外的方法,代码示例:

    import pytest
    
    class TestDemo1:
        @pytest.mark.smoketest
        def testadd001(self):
            print('TestDemo1》testadd001!')
            assert 1 +1  > 1
    
    if __name__ == '__main__':
        pytest.main(['-s','-m smoketest'])

    设置测试用例执行顺序:

    默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文
    件),再根据名称按ascii码值的顺序升序执行。
    如果想自定义pytest测试用例的执行顺序,可以通过多种方式实现,常用的
    方法有:
    1、利用pytest_ordering插件,通过装饰器@pytest.mark.run(order=1)来进行
    控制,数字越小,越前执行。需要提前使用pip install pytest_ordering安装插

    2、在测试方法上加装饰器 @pytest.mark.last 表示最后一个执行(目前新版本
    会报警告)

    import pytest
    
    class TestDemo2:
        @pytest.mark.systemtest
        def testadd002(self):
            print('TestDemo2》testadd001!')
            assert 1+1 > 1
        @pytest.mark.run(order=1)
        def testadd003(self):
            print('TestDemo2》testadd002!')
            assert 1+1 > 1
        @pytest.mark.last
        def testadd004(self):
            print('TestDemo2》testadd003!')
            assert 1+1 > 1
    
        @pytest.mark.run(order=2)
        def testadd005(self):
            print('TestDemo2》testadd004!')
            assert 1+1 > 1
    
    if __name__=='__main__':
        pytest.main(['-s'])

    测试用例跳过(忽略)设置:

    在实际工作中,经常需要跳过过某个测试用例,比如现阶段某个功能还没有
    开发完毕,但是先把测试用例写到了pytest中,因此需要先把这个测试用例给跳
    过。可以使用如下方式跳过用例:
    1、使用 @pytest.mark.skip(self,reason=None):在要跳过的测试用例前加入
    该标签,并可以选择传入一个非必须参数reason表示原因
    2、使用@pytest.mark.skipif(self,condition, reason=None):在要跳过的测试
    用例前加入该标签,根据condition条件判断是否进行跳过
    3、使用skip()方法:在测试用例中调用pytest.skip()方法来实现跳过,可以选择
    传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在if判断里
    4、使用pytestmark=pytest.mark.skip()方法:可以跳过整个模块,注意
    pytestmark为关键字,必须用此名称

    import pytest
    
    #该设置可以跳过整个模块的用例
    pytestmark=pytest.mark.skip()
    class Testskip:
        @pytest.mark.skip(reason=None)
        def testadd002(self):
            print('TestDemo2》testadd001!')
            assert 1+1 > 1
        @pytest.mark.skip(reason='该用例开发未完成,暂不执行')
        def testadd003(self):
            print('TestDemo2》testadd002!')
            assert 1+1 > 1
        def testadd004(self):
            pytest.skip('想跳过就跳过!')
            print('TestDemo2》testadd003!')
            assert 1+1 > 1
    
        @pytest.mark.skipif(condition='True', reason='如果条件为True就跳过!')
        def testadd005(self):
            print('TestDemo2》testadd005!')
            assert 1+1 > 1
    
        @pytest.mark.skipif(3>2, reason='如果条件为True就跳过!')
        def testadd005(self):
            print('TestDemo2》testadd005!')
            assert 1 + 1 > 1
    
        def testadd006(self):
            print('TestDemo2》testadd006!')
            assert 1 + 1 > 1
    
    if __name__=='__main__':
        pytest.main(['-s'])

    Pytest生成测试报告

    1、生成JunitXML文件:
    在命令模式下中切换到pytest测试用例路径下,执行命令:py.test 测试文件
    --junitxml=./log.xml
    2、生成HTML测试报告:
    使用命令pip install pytest-html 安装html报告插件,在命令模式下切换到
    pytest测试用例路径下,执行命令:py.test 测试文件 --html=./report.html

    3. allture测试报告配置(推荐):
    allure是一款开源的,专门用来展示测试结果的一个工具,allure可以与很多
    的测试框架做集成,比如:java的Junit、TestNG,python的pytest等
    allure会将测试用例的执行数据保存到xml文件中去,再利用allure的命令行
    将文件转换成HTML形式呈现出来。
    allture搭建步骤如下:
    1、使用命令pip install allure-pytest安装allure插件
    2、安装allure命令行工具:
    2.1 安装jdk,并配置好环境变量,allure命令行工具由java开发;
    2.2 通过地址:https://github.com/allure-framework/allure2/releases
    下载最新版本的allure命令行工具并解压
    2.3 配置环境变量:
    新增 ALLURE_HOME:allure命令行工具解压路径
    在path最后追加 ;%ALLURE_HOME%in

    allture测试报告配置:
    allture使用步骤如下(推荐):
    1、在命令模式下中切换到pytest测试用例路径下,执行命令:py.test 测试文件
    --alluredir=报告路径,生成xml报告
    2、 在命令模式下执行命令:allure generate xml报告路径 -o html报告路径,
    生成网页版的测试报告
    3、在html报告路径中,打开index.html文件即可展示报告


    备注:生成测试报告也可以通过pytest.main()增加参数来完成。如:
    pytest.main(["--resultlog=./log.txt"])
    pytest.main(["--junitxml=./log.xml"])
    pytest.main(["--html=./report.html"])
    pytest.main(["--alluredir=./report/"])

  • 相关阅读:
    pyqt-QGrapicsView类
    pyqt5.0 GraphicsView框架
    STM32(三)- GPIO输入输出之按键检测点亮LED
    STM32(二)- 位带操作、启动文件讲解
    STM32(一)- 基于固件库的工程模板
    C语言(四)- C预处理和C库
    C语言(三)- 结构体、结构体指针、位运算
    C语言(二)- 函数、指针、数组
    C语言(一)- 基础知识
    [caffe笔记]:杀死caffe多个进程中的某个(发生 leveldb lock 解决方法)
  • 原文地址:https://www.cnblogs.com/joy-field/p/13523169.html
Copyright © 2020-2023  润新知