pytest详细教程

pytest详细教程

  1. 安装pytest

    pip install pytest

  2. 创建pytest配置文件

    pytest.ini

  3. 编写用例

    • test_开头的文件
    • test_开头的函数
    • 使用断言

    例如:

    python 复制代码
    # test_api.py
    from session import MySession
    
    session = MySession("http://127.0.0.1:8000")
    
    def test_api():
        user_info = {"username": "test", "password": "123456"}
        response = session.request("post", "/login/with_json", json=user_info)
        assert response.status_code == 200
  4. 执行测试命令

    shell 复制代码
    # 方法1
    pytest
    # 方法2  -vs显示代码中打印的详细信息
    pytest -vs
    # 方法3  指定文件
    pytest test_api.py
    # 方法4  通过代码启动pytest测试框架
    import pytest
    pytest.main()  
    # 方法5  pytest.ini配置文件可以添加配置选项,这样的话在执行pytest命令时就不需要指定-vs了
    [pytest]
    addopts = -vs
  5. pytest进阶用法

    • mark
    • fixture
    • hook
    • 各种插件
  6. mark, 自定义标记的用途的是筛选用例,只执行部分用例

    • 在pytest.ini注册标记

      python 复制代码
      [pytest]
      addopts = -vs -m "login or db"
      
      markers =
        login: 登录相关
        db: 数据库相关
        upload: 上传相关
    • 再用例中通过装饰器添加标记

      python 复制代码
      @pytest.mark.db
      def test_a():
          print("使用数据库")
      
      @pytest.mark.login
      def test_b():
          pass
      
      @pytest.mark.upload
      def test_c():
          pass
      
      def test_d():
          pass
    • 在命令行参数中加-m使用标记

      pytest -m "login or db"

    • 内置标记:由pytest自己注册的,目的不是为筛选用例,而是对用例进行特殊处理。

      无需注册,直接使用:

      1. skip: 无条件跳过用例

      2. skipif: 有条件跳过

      3. xfail: 预期失败

      4. parametrize: 参数化测试 + 数据文件 = 数据驱动测试

        参数化测试:通过添加、编辑数据,实现添加、编辑测试用例的效果。

  7. fixture夹具,在测试用例执行之前、执行之后,自动的运行代码

    python 复制代码
    @pytest.fixture()
    def jia_ju():
        print("我是前置代码,在用例执行之前,自动运行")
        yield
        print("我是后置代码,在用例执行之后,自动运行")
    
    
    @pytest.mark.maya
    def test_jia_ju(jia_ju):
        print("我是测试用例")
  8. fixture夹具的作用域

    python中的作用域有4种:LEGB

    • Local: 函数内部
    • Enclosing: 嵌套函数的外部函数,闭包中的外部变量
    • Global: 模块级别,模块顶级的变量
    • Built-in: python内置,print len等等

    fixture夹具作用域:5种

    • function: 每个用例
    • class: 每个类
    • model: 每个文件
    • package: 每个目录包
    • session: 所有的用例

    接口自动化测试中,通过fixture提供全局的session,实现TCP复用、参数共享、cookies关联、日志记录、BaseURL。

  9. hook钩子

    钩子:被pytest自动调用的函数

    • 写在conftest.py中
    • 符合hook规范定义: 规则定义的方法名在这个文件里面 import _pytest.hookspec
    • pytest中有52个hook,分类、顺序、用法。
  10. 自动化测试项目实战

    • 创建fixture

    • 创建用例

      python 复制代码
      import pytest
      
      @pytest.mark.parametrize(
          "data, code",
          [
              ({}, 422),
              ({"email": "1341935532@qq.com", "password": "123456"}, 422),
              ({"username": "admin", "password": "123456"}, 200),
              ({"username": "admin", "password": "wrongpassword"}, 401),
          ]
      )
      def test_login(session, data, code):
          resp = session.post("/login/get_token", json=data)
          assert resp.status_code == code
  11. pytest插件生成日志记录和测试报告

    • 安装插件

      shell 复制代码
      pip install allure-pytest pytest-result-log pytest-base-url
    • 配置插件

      python 复制代码
      [pytest]
      addopts = -vs --alluredir=./allure_results --clean-alluredir
      
      log_file = pytest.log
      log_file_level = debug
      log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
      log_file_date_format = %Y-%m-%d %H:%M:%S
      result_log_level_verbose = info
      
      markers =
        login: 登录相关
        db: 数据库相关
        upload: 上传相关
        maya: maya相关
    • 生成报告

      (1)下载安装allure https://github.com/allure-framework/allure2/releases

      (2)执行allure命令,生成测试报告:allure generate -o report ./allure_results

  12. 总结:

    • requests是手,pytest是脑
    • pytest+requests可以实现基本的接口自动化
    • 测试框架+持续集成,形成企业级的落地方案
相关推荐
aqiu1111111 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
爱吃香菜的初学者1 小时前
十四.Linux——消息队列
linux·运维·开发语言
迅猛龙办公室1 小时前
python实现倒序输出数字
开发语言·python
夏幻灵7 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码7 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
在世修行8 小时前
干货:pytest
pytest·fixture·pytest assert
bkspiderx9 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆9 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光9 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园10 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言