• 单元测试框架-pytest


    单元测试框架-pytest

    官网

    常用插件
    • pytest-html: 生成html报告
    • pytest-xdist: 实现并发测试
    • pytest-ordering: 实现测试用例顺序设置
    • pytest-rerunfailures: 测试用例失败重试
    • allure-pytest: 生成测试报告
    引入依赖

    在项目根目录下创建:requirements.txt

    pytest
    pytest-html
    pytest-xdist
    pytest-ordering
    pytest-rerunfailures
    allure-pytest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行命令

    pip install -r requirements.txt
    
    • 1

    验证安装成功

    pytest --version
    
    • 1

    使用Pytest
    规范
    • 模块名必须以test_开头或者_test结尾
    • 测试类必须以Test开头,并且不能有__init__方法
    • 测试方法必须以test开头
    运行方式
    • 主函数模式

      pytest.main()
      
      • 1
    • 命令行模式

      pytest
      
      • 1
    • 通过读取pytest.ini配置文件运行

      • 一般放在项目根目录
      • 编码:必须时ANSI,可以使用notepad++修改编码格式
      • 作用:改变pytest默认行为
      • 运行规则:主函数与命令行模式都会读取该文件
      [pytest]
      #命令行参数,用空格分隔
      addopts = -vs
      # 测试用例文件夹,可以自己配置
      testpaths = ./testcase
      # 配置测试搜索的模块文件名称
      python_files = test*.py
      # 配置测试搜索的测试类名
      python_classes = Test*
      # 配置测试搜索的测试函数名
      python_functions = test
      #测试分组
      markers =
      	g11n:国际化测试组
      	i10n:本地化测试组
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 执行指定模块

      pytest.main(['test_module.py'])
      
      • 1
    • 指定目录

      pytest.main(['dir_name'])
      
      • 1
    • 通过nodeid指定测试用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成

      pytest.main('./dir_name/module.py::class_name::fun_name')
      
      • 1
    参数详情
    • -s:显示测试用例的调试内容

    • -v:显示测试用例详细信息

    • -n:多线程执行测试用例

    • –reruns:设置重试次数

    • -x:只要有一个测试用例失败,停止测试

    • –maxfail:设置几个测试失败停止运行

    • -k:根据测试用例的部分字符串指定测试用例

    • -m:指定测试分组

    执行顺序
    • unittest:按ascii的大小来运行

    • pytest:默认从上到下

    指定测试用例顺序:需要安装pytest-ordering

    @pytest.mark.run(order=)
    
    • 1
    分组测试
    @pytest.mark.mark_name
    
    • 1
    • mark_name:为自定义的分组名称

    运行测试

    pytest -m "mark_name"
    
    • 1

    运行多个分组

    pytest -m "mark1 or mark2"
    
    • 1
    跳过测试
    • 无条件

      @pytest.mark.skip(reason="原因")
      
      • 1
    • 条件跳过

      @pytest.mark.skipif(expr, reason="原因")
      
      • 1
    生成报告
    • HTML

      pytest --html ./save_path/report.html
      
      • 1
    • Allure

      下载

      • 解压项目并配置到环境变量中,验证是否安装成功
      allure --version
      
      • 1
      • 生成json格式临时报告
      --alluredir  ./temp
      
      • 1
      • 生成allure报告
      allure generate ./temp -o ./report --clean
      
      • 1

      -o: 报告输出目录

      –clean:对目录进行清除

    测试夹具(前后置)
    • setup_class:所有测试用例执行之前运行一次
    • teardown_class:所有测试用例执行之后运行一次
    • setup_method:每个测试用例执行之前运行一次
    • teardown_method:每个测试用例执行完成执行一次

    部分测试用例前后置实现:@pytest.fixture()

    参数

    • scope:作用域
      • function 方法级别的前后置 (默认)
      • class 类级别的前后置
      • module 模块级别的前后置
      • package/session 包级别的前后置
    • params: 参数化
      • 支持参数类型:(列表:[] 元组() 字典列表[{},{},{}],字典元组:({},{},{}))
    • autouse: 自动执行 默认值:False 如果为False,需要将函数名作为需要调用的方法的参数
    • ids: 当使用params参数化时,给参数列表每一个值设置一个变量名
    • name: 表示的时被@pytest.fixture标记的方法取一个别名
    # yield返回后面可以有代码,return后面不能有代码,返回值即为测试方法的所传入的参数
    # 参数名必须为request,否则报错[not found]
    # 使用name对标记的方法起别名后不能使用原函数名作为参数,否则报错
    @pytest.fixture(scope='function', params=['赵姗姗', '马化腾', '张一鸣'], ids=['zss', 'mht', 'zym'], name='fixt')
    def my_fixture2(request):
        print("前置")
        yield request.param
        print("后置")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    conftest.py与fixture结合使用

    • 通常在每个测试包下可以包含一个conftest.py文件,通常将前后置fixture定义在该文件中,在其他模块中无需导入即可使用
    • 夹具可以使用当前包及其父包的conftest.py中所定义的,同级包无法使用
    断言
    assert
    
    • 1
    数据驱动
        @pytest.mark.parametrize('args', ['zss', 'nan', 'lis'])
        def test_ddt(self, args):
            print(args)
    
        @pytest.mark.parametrize('name,age', [('张三', 21), ('李四', 22), ('王五', 23)])
        def test_ddt2(self, name, age):
            print(name)
            print(age)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 参数1:迭代的变量名
    • 参数2:迭代的value
  • 相关阅读:
    【数学】【位运算】Divan and bitwise operations—CF1614C
    LabVIEW软件开发工程师需要具备哪些能力与素质?
    ospf 单区域配置
    小程序如何搭建在服务器上
    Python中的ThreadPoolExecutor
    Android ByteBuffer Bitmap byte[] convert,Kotlin
    深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析
    MySQL 执行 Online DDL 操作报错空间不足?
    机器学习(23)---Boosting tree(课堂笔记)
    经历了源码的痛苦,掌握DRF的核心序列化器
  • 原文地址:https://blog.csdn.net/qq_52751442/article/details/132837455