news 2026/9/11 13:48:34

大厂测试都在用的Pytest技巧,面试加分项

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大厂测试都在用的Pytest技巧,面试加分项

01概述

pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:

  • 简单灵活,容易上手,文档丰富;

  • 支持参数化,可以细粒度地控制要测试的测试用例;

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

  • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;

  • 测试用例的skip和xfail处理;

  • 可以很好的和CI工具结合,例如jenkins

02使用介绍

安装:pip install pytest

1、示例代码

编写规则:编写pytest测试样例非常简单,只需要按照下面的规则:
  • 测试文件以test_开头(以_test结尾也可以)

  • 测试类以Test开头,并且不能带有 init 方法

  • 测试函数以test_开头

  • 断言使用基本的assert即可

pytest1.py

fixture的scope参数

scope参数有四种,默认为function

  • function:每个test都运行,默认是function的scope

  • class:每个class的所有test只运行一次

  • module:每个module的所有test只运行一次

  • session:每个session只运行一次

setup和teardown操作
  • setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等

  • teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等

备注:

也可以通过在fixture函数中通过yield实现setup和teardown功能

2、测试结果

如何执行
  • pytest # run all tests below current dir

  • pytest test_mod.py # run tests in module file test_mod.py

  • pytest somepath # run all tests below somepath like ./tests/

  • pytest -k stringexpr # only run tests with names that match the
    # the "string expression", e.g. "MyClass and not method"
    # will select TestMyClass.test_something
    # but not TestMyClass.test_method_simple

  • pytest test_mod.py::test_func # only run tests that match the "node ID",
    # e.g "test_mod.py::test_func" will be selected
    # only run test_func in test_mod.py

通过pytest.mark对test方法分类执行

通过@pytest.mark控制需要执行哪些feature的test,例如在执行test前增加修饰@pytest.mark.website

  • 通过 -m "website" 执行有website标记的test方法

  1. $ pytest -v -m "website" pytest1.py

  2. ============================================================================== test session starts ===============================================================================platform linux2 --Python2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1--/home/kevin/soft/anaconda2/bin/python

  3. cachedir: .cacheUsing--randomly-seed=1522925202rootdir: /home/kevin/learn/python-web/tox/case2, inifile:plugins: randomly-1.0.0, mock-1.2, cov-2.0.0collected 3 items

  4. pytest1.py::test_1 PASSED

  5. ============================================================================= pytest-warning summary =============================================================================WC1None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0. Please remove the prefix and use the @pytest.fixture decorator instead.===============================================================================2 tests deselected ==========================================================================================================================================1 passed, 2 deselected, 1 pytest-warnings in0.00 seconds ============================================================

通过 -m "not website" 执行没有website标记的test方法

  1. $ pytest -v -m "not website" pytest1.py

  2. ============================================================================== test session starts ===============================================================================platform linux2 --Python2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1--/home/kevin/soft/anaconda2/bin/python

  3. cachedir: .cacheUsing

  4. --randomly-seed=1522925192rootdir: /home/kevin/learn/python-web/tox/case2, inifile:plugins: randomly-1.0.0, mock-1.2, cov-2.0.0collected 3 items

  5. pytest1.py::test_3 PASSED

  6. pytest1.py::test_2 PASSED============================================================================= pytest-warning summary =============================================================================WC1None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0. Please remove the prefix and use the @pytest.fixture decorator instead.===============================================================================1 tests deselected ==========================================================================================================================================2 passed, 1 deselected, 1 pytest-warnings in0.00 seconds ============================================================

Console参数介绍

  • -v 用于显示每个测试函数的执行结果

  • -q 只显示整体测试结果

  • -s 用于显示测试函数中print()函数输出

  • -x, --exitfirst, exit instantly on first error or failed test

  • -h 帮助

Case 1
  1. $ pytest -v pytest1.py

  2. ============================================================================== test session starts ===============================================================================

  3. platform linux2 --Python2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1--/home/kevin/soft/anaconda2/bin/python

  4. cachedir: .cache

  5. Using--randomly-seed=1522920341

  6. rootdir: /home/kevin/learn/python-web/tox/case2, inifile:

  7. plugins: randomly-1.0.0, mock-1.2, cov-2.0.0

  8. collected 3 items

  9. pytest1.py::test_1 PASSED

  10. pytest1.py::test_3 PASSED

  11. pytest1.py::test_2PASSED

  12. ============================================================================= pytest-warning summary =============================================================================WC1None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0. Please remove the prefix and use the @pytest.fixture decorator instead.==================================================================3 passed, 1 pytest-warnings in0.01 seconds ===================================================================

Case 2

  1. $ pytest -s pytest1.py

  2. ============================================================================== test session starts ===============================================================================

  3. platform linux2 --Python2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1

  4. Using --randomly-seed=1522920508

  5. rootdir: /home/kevin/learn/python-web/tox/case2, inifile:

  6. plugins: randomly-1.0.0, mock-1.2, cov-2.0.0

  7. collected 3 items

  8. pytest1.py setup_function called.Test_1

  9. called..teardown_function called.setup_module called.Test_2 called..Test_3 called..teardown_module called.============================================================================= pytest-warning summary =============================================================================WC1None pytest_funcarg__cov: declaring fixtures using"pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0. Pleaseremove the prefix and use the @pytest.fixture decorator instead.==================================================================3 passed, 1 pytest-warnings in0.01 seconds ===================================================================

03扩展插件

测试报告

安装与样例
  1. pipinstallpytest-cov # 计算pytest覆盖率,支持输出多种格式的测试报告

  2. pytest --cov-report = html --cov = ./ test_code_target_dir

Console参数介绍
  • --cov=[path], measure coverage for filesystem path (multi-allowed)

    指定被测试对象,用于计算测试覆盖率

  • --cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed)

    测试报告的类型

  • --cov-config=path, config file for coverage, default: .coveragerc, coverage

    配置文件

  • --no-cov-on-fail, do not report coverage if test run fails, default: False

    如果测试失败,不生成测试报告

  • --cov-fail-under=MIN, Fail if the total coverage is less than MIN.

    如果测试覆盖率低于MIN,则认为失败

Console Result
  1. ---------------------------------------------------------------- coverage: platform linux2, python 2.7.14-final-0 ----------------------------------------------------------------

  2. Name Stmts Miss Cover

  3. --------------------------------

  4. pytest1.py 18 0 100%

Html Result

测试顺序随机

pip install pytest-randomly

分布式测试

pip install pytest-xdist

出错立即返回

pip install pytest-instafail

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 10:04:56

手把手教你用通义千问2.5-7B-Instruct构建智能对话应用

手把手教你用通义千问2.5-7B-Instruct构建智能对话应用 随着大语言模型在自然语言理解与生成能力上的持续突破,越来越多开发者希望将这些先进模型集成到实际应用中。Qwen2.5-7B-Instruct 是通义千问系列最新发布的指令调优模型,具备强大的对话理解、长文…

作者头像 李华
网站建设 2026/9/9 10:04:56

ADAS软件开发

ADAS(Advanced Driver Assistance Systems,高级驾驶辅助系统)软件开发是一个融合了计算机视觉、传感器融合、控制算法、嵌入式系统和人工智能等多领域技术的复杂工程。以下是ADAS软件开发的关键组成部分、开发流程和技术栈概览:一…

作者头像 李华
网站建设 2026/9/9 10:05:14

混元翻译模型1.5版:格式化翻译功能详解

混元翻译模型1.5版:格式化翻译功能详解 1. 技术背景与核心价值 随着全球化进程的加速,跨语言沟通需求日益增长,高质量、低延迟的翻译服务成为多语言应用的核心基础设施。传统翻译模型在处理复杂文本结构时往往破坏原始格式,导致…

作者头像 李华
网站建设 2026/9/9 10:04:55

OpenCode版本升级:新特性迁移指南

OpenCode版本升级:新特性迁移指南 1. 引言 1.1 技术背景与升级动因 OpenCode 自 2024 年开源以来,凭借其“终端优先、多模型支持、隐私安全”的设计理念,迅速在开发者社区中获得广泛认可。项目以 Go 语言构建,采用客户端/服务器…

作者头像 李华
网站建设 2026/9/9 10:04:54

LessMSI(MSI安装包查看和提取工具)

LessMSI是开源、轻量级的工具,基于.NET构建,集图形界面和命令行接口于一体。它主要用于查看、提取、解析和管理MSI文件的内容,无需安装原始应用程序,为开发人员、系统管理员以及IT专业人员在软件部署和管理过程中提供了极大的便利…

作者头像 李华