摘要:本文系统性地介绍了 Python 主流测试框架 Pytest 的核心概念、快速上手方法、运行结果解读、用例编写规则以及常用配置技巧。通过对比分析、代码示例和实战练习,帮助读者从零开始掌握 Pytest 的使用,构建高效的自动化测试流程。
文章大纲
本文将围绕以下核心章节展开,每个章节都配有详细的讲解和实战代码:
- 测试框架概述与 Pytest 优势– 阐述测试框架的五大核心步骤,对比 unittest 与 pytest,明确学习 Pytest 的必要性。
- 环境搭建与三种启动方式– 详细讲解 Pytest 的安装、验证方法,并通过图文演示命令、代码和 IDE 三种启动方式。
- 深入解读测试运行结果– 分析终端输出的结构,解释六种用例状态(PASSED, FAILED, ERROR, SKIPPED, XFAIL, XPASS)及其含义。
- Pytest 用例编写核心规则– 详解用例的发现机制(文件、类、函数命名规则)和内容规范(可调用、无参数、无返回值)。
- 常用配置与参数详解– 介绍如何通过命令行参数和 pytest.ini 配置文件定制测试行为,重点讲解 -v, -s, -x, -m 等常用参数。
接下来,让我们正式进入正文。
一、什么是测试框架
测试框架是抽象出来的工具集合,提供了大量的组件、工具以及功能。
其中以下五个步骤是测试必不可少的,只有依托于测试框架才能帮助我们完成测试:
- 用例发现
- 用例管理
- 环境管理
- 用例执行
- 测试报告
大部分的编程语言都会有测试框架,例如:
Java:Junit、testNG
Python:unittest、pytest
这里,将Python的这两种框架以一个表格的形式来做一个对比,可以直观地看出两个测试框架的区别与联系。
| unittest | pytest | |
| 安装、卸载 | 无须安装 | 手动安装 |
| 升级、降级 | 无法改变版本 | 可以指定版本 |
| 代码风格 | Java | Python |
| 插件生态 | 只有几个插件 | 1400+插件可用 |
| 备注(其他) | 由Python官方来进行维护 | 完全兼容unittest |
这里不难看出,pytest的优点,插件多,还能指定版本使用,完全兼容了unittest,pytest是很主流的测试框架,因此学习这个测试框架是很必要的。
二、快速上手Pytest测试框架
这里pytest安装非常简单,直接使用这个命令就能安装:
pip install pytest #第一次安装
pip install pytest -U #升级到最新版本,电脑上很早之前安装过
在安装之前,可以先查看一下自己电脑上是否安装了pytest,如果是Anaconda 内置 Python,那你就需要像我一样这样操作:
- Windows 左下角搜索:Anaconda Prompt
- 打开这个黑色专属终端(不是普通 CMD/PowerShell)
- 直接输入:pip install pytest
这里就会弹出:
说明pytest 早已安装成功!版本 为8.4.2。这样的情况下就不需要安装了。
如果不放心,可以使用以上命令查看pytest的版本。
这里你可以使用Pycharm这个代码编辑软件来创建一个名为my_pytest的项目,如果没有安装这个软件,可以参考这篇文章来安装和创建新项目:2025年最新版Python安装&PyCharm安装教程 (图文超级详细)_python下载安装教程-CSDN博客
这是创建之后的页面,可以使用pip install pytest -U来更新到最新版本。
这里我新建了一个简单的测试脚本,用来测试pytest的三种启动方式。
1.命令——直接输入pytest命令
当你看到这张图片的内容时,说明pytest框架已经工作了,环境搭建已经没问题了。
2.代码
import pytest
pytest.main()
这里新建了一个main.py的文件,然后输入了这段代码,点击运行,看到如上图所示图片,表明pytest已经启动成功。
3.鼠标(新手小白不推荐)——原因:1.图标上的绿色箭头是由Pycharm这个软件提供的,并不是pytest,容易出现BUG。2.行为与前两种方式不一致,不适合复杂的项目。
通过进一步学习pytest,你可以发现pytest在简单的基础上,对断言进行了高级封装(AST),因此它对python数据结构断言是非常友好的。
三、详细分析终端pytest运行结果
这里我写了三个简单的测试用例,然后执行。在刚才新建的项目中添加即可,以下是具体的代码展示:
def test_str(): a='aaabbbb' b='aaaabcc' assert a==b def test_list(): a=list('aaabbbb') b=list('aaaabcc') assert a==b def test_dict(): a={"a":1,"b":2,"c":3} b={"a":2,"b":2,"c":3} assert a==b接下来具体解释一下终端的运行结果。
platform win32 -- Python 3.11.7, pytest-9.1.1, pluggy-1.6.0 rootdir: E:\PyProject collected 3 itemstest_base.py FFF [100%]
============================================================ FAILURES ============================================================ ____________________________________________________________ test_str ____________________________________________________________
def test_str(): a='aaabbbb' b='aaaabcc'> assert a==b E AssertionError: assert 'aaabbbb' == 'aaaabcc' E
E - aaaabcc E + aaabbbbtest_base.py:4: AssertionError ___________________________________________________________ test_list ____________________________________________________________
test_base.py:15: AssertionError ==================================================== short test summary info ===================================================== FAILED test_base.py::test_str - AssertionError: assert 'aaabbbb' == 'aaaabcc' ======================================================= 3 failed in 0.07s ========
因为终端展示的运行内容比较多,这里只保留一个来解释分析。
输出的主要内容有:
1.执行环境:版本、根目录、用例数量
2.执行过程:用例名称、用例结果、以及执行进度
3.失败详情:用例内容、断言提示
4.整体摘要:结果情况、结果数量、花费时间
补充:这里可以使用pytest test_base.py -v这个命令来分开展示进度条。
接下来,再补充一下用例结果缩写的知识,表格如下:
| 缩写 | 单词 | 含义 |
| . | passed | 通过 |
| F | failed | 失败(用例执行时报错) |
| E | error | 出错(fixture执行报错) |
| s | skipped | 跳过 |
| X | xpassed | 预期外的通过(不符合预期) |
| x | xfailed | 预期内的失败(符合预期) |
这个表格不需要死记硬背,在项目中见多了就记住了。
接下来,可以模拟一下六种不同情况的测试用例,看一下终端提示结果。
import pytest 1、正常通过 PASS def test_pass(): assert 1 == 1 2、断言失败 FAILED(业务逻辑不满足) def test_fail(): assert 1 == 2 3、代码异常 ERROR(用例/夹具内部代码报错,非断言失败) @pytest.fixture def error_fixture(): # 字符串+数字直接相加,运行时报错 return 1 + "1" def test_error(error_fixture): pass 4、标记跳过 SKIPPED @pytest.mark.skip(reason="功能暂未开发完成,暂时跳过执行") def test_skip(): assert True 5、预期失败 XFAIL(明确知道这条用例有bug,标记预期失败,不算失败用例) @pytest.mark.xfail(reason="已知接口bug待修复,预期执行失败") def test_xfail(): assert 99 == 1 6、允许失败 XPASS(标记预期失败,但实际执行通过,属于意外通过) @pytest.mark.xfail(reason="本应失败,结果代码修复意外通过") def test_xpass(): assert 10 == 10这是运行结果,可以看到表格中出现的六种情况。
四、pytest用例规则
1.用例发现规则
简单来说,这个规则就是测试框架识别和加载用例过程,故称之为用例发现。
pytest的用例发现步骤:
- 能够遍历所有的目录,例外:'venv'、.开头的目录。
- 打开python文件,需要保证以test_开头或者是test_结尾。
- 可以遍历所有的以Test开头的类。
- 收集所有的以test开头的函数和方法(类、变量都不是用例)。
2.用例内容规则
pytest对用例的要求:
- 是可调用的(函数、方法、类、对象)。
- 名字以test_开头。
- 没有参数(参数是有另外含义的)。
- 没有返回值(默认为None)。
3.练习
有函数add来接收两个参数,并返回它们相加的结果,请你为此来编写测试用例。
这是参考代码:
def add(a,b): return a+b class TestAdd: # 数字 def test_int(self): res = add(1, 2) assert res == 3 # 返回字符串(字符串拼接) def test_str(self): res = add("1", "2") assert res == "12" # 列表拼接 def test_list(self): res = add([1], [2,3,4]) assert res == [1, 2, 3, 4]运行之后可以看到终端结果为:
三个点代表测试用例全部通过。
这里提醒一下大家,千万不要乱删电脑上的软件,即使计算机能力很强,删东西也要慎重。我在记笔记学习的过程中,删掉了一个有关python的软件,结果提示我不能正常使用了,直接哭死,重新配置环境又花了很长时间。┭┮﹏┭┮
五、pytest配置框架
配置能够改变pytest默认的规则。这里有两种方式可以改变:
1.命令参数2.ini配置文件
也就是所有的配置方式,都能够通过这个命令一键获取。
pytest -h
如图所示。
我们可以简单的了解一下里面的配置内容。这里主要讲了,有哪些配置,分别是什么方式。
首先是positional arguments:file_or_dir,文件或者目录,这里表示的是用来执行哪个用例的。
后面的有-,或者两个--的表示的是参数。
再往后,不带-的是给配置文件去用的。最后大写字母是环境变量。
总结一下,就是:
-开头:参数
小写字母开头:ini配置
大写字母开头:环境变量
一般来说,配置文件在根目录创建,以pytest.ini命名。
接下来,了解一下常用的参数。
-v:增加详细程度
-s:在用例中正常的使用输入和输出
先输入这个测试用例,
def test_input(): a=input("请输入手机号")然后输入pytest -vv -ss,会得到上面的提示。
随机输入一段数字,回车,该测试用例才会通过。
这是输入测试用例,只有加-s才能看到,输出用例同样如此。
def test_print(): print('张三联系方式是12345678')-x:快速退出,如果收到失败用例,后面的用例不再执行。
-m:用例筛选(具体筛选细则在下一篇——标记mark当中讲)
笔记有点多,先学习前五章~,下面的内容参考第二篇有关pytest的文章~今天就学到这里,可以点个关注哦,还会更新更多有关测试的学习内容(* ̄︶ ̄)。