想象一下,你在一次技术面试中满怀信心,答完所有问题,结果却被告知没通过,原因竟然是——你没用过Pytest框架!是的,在当今软件测试的世界里,Pytest已经成为了许多公司的“必备”技能。
那么问题来了,为什么Pytest如此重要?为什么越来越多的公司在招聘测试开发人员时,都会特别关注你是否掌握了Pytest?今天,我们就来一起探讨Pytest在测试领域中的关键作用,以及它如何影响你的面试表现。
1. Pytest的简洁与强大
Pytest是Python中最流行的测试框架之一,以其简洁、灵活和强大的功能著称。相比于传统的unittest框架,Pytest支持更灵活的测试组织方式,支持参数化测试,还能轻松整合第三方插件,简化了测试代码的编写。例如,在某次面试中,面试官直接问我如何使用Pytest参数化来简化测试用例的编写,而我当时只能依赖unittest,显得力不从心。
2. 企业对Pytest的重视
许多企业尤其是那些注重自动化测试的公司,会优先选择Pytest作为其测试框架。比如,某大型电商平台曾在面试中要求候选人现场编写基于Pytest的API测试脚本,而没有Pytest经验的候选人,往往会被淘汰。通过Pytest,你可以轻松扩展测试功能,处理更多的测试场景,提升测试覆盖率。
3. Pytest与DevOps的整合
Pytest不仅限于本地测试,它还能与CI/CD管道无缝集成,如与Jenkins、GitLab等工具结合,实现自动化测试。这也是为什么很多大厂都青睐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方法
$ pytest -v -m "website" pytest1.py
============================================================================== test session starts ===============================================================================platform linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /home/kevin/soft/anaconda2/bin/pythoncachedir: .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 itemspytest1.py::test_1 PASSED=============================================================================
pytest-warning summary =============================================================================
WC1 None 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 in 0.00 seconds
============================================================
-
通过 -m "not website" 执行没有website标记的test方法
$ pytest -v -m "not website" pytest1.py============================================================================== test session starts ===============================================================================platform linux2 -- Python 2.7.14, pytest-3.0.0, py-1.5.2, pluggy-0.3.1 -- /home/kevin/soft/anaconda2/bin/pythoncachedir: .cacheUsing --randomly-seed=1522925192rootdir: /home/kevin/learn/python-web/tox/case2, inifile:plugins: randomly-1.0.0, mock-1.2, cov-2.0.0collected 3 itemspytest1.py::test_3 PASSEDpytest1.py::test_2 PASSED============================================================================= pytest-warning summary =============================================================================WC1 None 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 in 0.00 seconds ============================================================
Console参数介绍
-
-v 用于显示每个测试函数的执行结果
-
-q 只显示整体测试结果
-
-s 用于显示测试函数中print()函数输出
-
-x, --exitfirst, exit instantly on first error or failed test
-
-h 帮助
Case 1
Case 2
03 扩展插件
测试报告
安装与样例
pip install pytest-cov # 计算pytest覆盖率,支持输出多种格式的测试报告
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
---------------------------------------------------------------- coverage: platform linux2, python 2.7.14-final-0 ----------------------------------------------------------------
Name Stmts Miss Cover
--------------------------------
pytest1.py 18 0 100%
Html Result
测试顺序随机
pip install pytest-randomly
分布式测试
pip install pytest-xdist
出错立即返回
pip install pytest-instafail
如果你还没有掌握Pytest,现在正是学习的好时机!通过熟练掌握Pytest,你不仅能轻松通过面试,还能在实际工作中快速提高测试效率,真正做到事半功倍。
Pytest不仅是一个测试框架,它是现代自动化测试不可或缺的工具。熟练掌握Pytest,能够让你在技术面试中脱颖而出,更重要的是,它可以帮助你在实际工作中构建更加高效的自动化测试体系,推动测试流程的标准化与自动化。
“掌握Pytest,才真正掌握了现代测试的脉搏,让测试工作更轻松,让面试更自信!”