Python测试框架:pytest学习笔记

半杯拿铁
半杯拿铁
发布时间:2026-10-15 | 4人浏览过
原创

本文详细介绍Python中功能强大的pytest测试框架。内容涵盖pytest的核心特点、安装验证方法、基础用例编写规则(命名规范与断言),以及五种常用运行模式:生成HTML报告、指定用例执行、多进程并行测试、失败重试机制和打印调试信息。通过具体代码示例,帮助开发者快速掌握pytest在单元测试、接口测试及自动化测试中的应用。

在Python通用测试框架领域,许多开发者习惯于使用unittest结合HTMLTestRunner。近期,随着对pytest官方文档的深入研究,发现该框架配合丰富的插件生态使用体验极佳,因此特此整理一份pytest的学习笔记。

pytest框架核心特点

pytest是一个成熟且功能全面的Python测试框架,其核心优势主要体现在以下几个方面:

  • 1. 简单灵活,易于上手
  • 2. 支持参数化测试
  • 3. 既能处理简单的单元测试,也能应对复杂的功能测试;此外,它还广泛应用于Selenium/Appium自动化测试以及基于requests的接口自动化测试中。
  • 4. 拥有庞大的第三方插件生态,且支持自定义扩展。常用插件包括:pytest-selenium(集成Selenium)、pytest-html(生成完美的HTML测试报告)、pytest-rerunfailures(支持失败用例重跑)以及pytest-xdist(支持多CPU分发并行执行)等。
  • 5. 提供完善的测试用例跳过(skip)和预期失败(xfail)处理机制。
  • 6. 能够与Jenkins等CI工具无缝集成。
  • 7. 支持Allure报告框架,生成更美观的测试报告。

pytest安装与验证

安装pytest非常简单,具体命令如下:


pip install -U pytest

验证安装是否成功及查看版本号:


pytest --version

基础用例编写示例

以下列举几个来自pytest官方文档的经典示例:

示例1:


import pytest

# content of test_sample.py
def func(x):
 return x + 1
def test_answer():
 assert func(3) == 5

在命令行中切换至文件所在目录并执行测试(也可直接在IDE中运行):

该测试将返回失败报告,因为func(3)的计算结果不等于5。

示例2:

当需要编写多个测试样例时,可以将它们封装在一个测试类中,例如:


class TestClass: 
 def test_one(self): 
 x = "this" 
 assert 'h' in x 
 
 def test_two(self): 
 x = "hello" 
 assert hasattr(x, 'check')

运行上述示例:

从测试结果可以看出,该测试共执行了两个测试样例,其中一个失败,另一个成功。同时,我们也看到了失败样例的详细信息以及执行过程中的中间结果。参数-q(即-quiet)用于减少输出冗长,具体表现为不再展示pytest的版本信息。

测试样例编写规范

如何编写pytest测试样例

通过上述两个实例,我们可以发现编写pytest测试样例非常简单,只需遵循以下规则:

  • 1. 测试文件必须以test_开头(或以_test结尾也可以)。
  • 2. 测试类必须以Test开头,且不能包含__init__方法。
  • 3. 测试函数必须以test_开头。
  • 4. 断言直接使用基本的assert语句即可。

常用运行模式详解

运行模式

Pytest提供了多种运行模式,使测试和调试工作更加得心应手。下面介绍5种常用模式。在此需提醒:运行pytest时,它会查找当前目录及其子目录下所有符合test_*.py或*_test.py格式的文件,以及以test开头的方法或类;否则,系统会提示找不到可运行的用例。

生成HTML测试报告

1. 运行后生成测试报告(htmlReport)

首先安装pytest-html插件:


pip install -U pytest-html

运行模式:


pytest --html=report.html

报告效果:

在上述报告中,可以清晰地看到测试结果和错误原因,从而轻松定位问题。

指定用例执行

2. 运行指定的case

当编写的cases较多时,每次全量运行会浪费大量时间。通过指定特定case运行可以显著提高效率。

示例代码:


class TestClassOne(object):
 def test_one(self):
 x = "this"
 assert 't'in x
 
 def test_two(self):
 x = "hello"
 assert hasattr(x, 'check')
class TestClassTwo(object):
 def test_one(self):
 x = "iphone"
 assert 'p'in x
 
 def test_two(self):
 x = "apple"
 assert hasattr(x, 'check')

运行模式:

模式1:直接运行test_se.py文件中的所有cases:


pytest test_se.py

模式2:运行test_se.py文件中TestClassOne类下的两个cases:


pytest test_se.py::TestClassOne

模式3:运行test_se.py文件中TestClassTwo类下的test_one:

注意:定义class时,必须以T开头,否则pytest不会运行该类。

多进程并行测试

3. 多进程运行cases

当cases数量庞大时,运行时间会显著增加。若希望缩短脚本运行时长,可采用多进程运行方式。

安装pytest-xdist插件:


pip install -U pytest-xdist

运行模式:


pytest test_se.py -n NUM

其中NUM代表并发的进程数。

失败用例重试机制

4. 重试运行cases

在进行接口测试时,偶尔会遇到503错误或短暂的网络波动,导致case运行失败,而这并非我们期望的结果。此时,可以通过重试运行cases的方式来解决此类问题。

安装pytest-rerunfailures插件:


pip install -U pytest-rerunfailures

运行模式:


pytest test_se.py --reruns NUM

其中NUM代表重试的次数。

显示调试打印信息

5. 显示print内容

在运行测试脚本时,为了调试或打印某些内容,我们常在代码中加入print语句。但在默认运行pytest时,这些内容不会显示。如果加上-s参数,即可显示这些内容。

运行模式:


pytest test_se.py -s

此外,pytest的多种运行模式可以叠加执行。例如,若想同时运行4个进程并打印出print的内容:

可以使用以下命令:


pytest test_se.py -s -n 4

以上就是Python测试框架pytest学习笔记的详细内容,更多关于python pytest的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表