一、Pytest 介绍

pytest是python的一种第三方单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它具有如下特点:

  • 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
  • 能够支持简单的单元测试和复杂的功能测试
  • 支持参数化
  • 执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
  • 支持重复执行(rerun)失败的case
  • 支持运行由nose, unittest编写的测试case
  • 可生成html报告
  • 方便的和持续集成工具jenkins集成
  • 可支持执行部分用例
  • 具有很多第三方插件,并且可以自定义扩展

二、Pytest 安装

1、新建项目

Location 选择项目路径,其余保持默认。

image-20230429201743821

2、安装

进入项目后,点击下方 Terminal ,安装pytest。安装命令如下:

1
pip install pytest

image-20230429222656930

检查安装是否成功以及安装的版本,命令行命令如下:

1
pytest --version

执行上述命令,能够输出版本信息,那就说明安装成功啦。

3、配置默认运行方式

配置测试用例默认运行环境为 pytest ,点击左上角 File >> Settings 。

image-20230430230654498

找到 Python Integrated Tools >> Testing ,配置 Default test runnerpytest

image-20230430230605678

三、Pytest 命名规则

在了解pytest的测试命名规则之前,我们先需要知道 pytest 搜索用例的规则,它默认搜索规则如下:

  • 如果pytest执行命令中指定了目录,则从该指定目录中开始查找测试用例文件,如果没有指定,则从当前运行目录开始查找文件,最终的结果是找到整个项目中符合命名规则的测试用例。
  • 会查找整个项目中符合命令规则的测试模块,再由 测试模块–>测试类/测试函数–>测试方法 一层一层递归查找。

1、默认命名规则

pytest 的测试命名规则如下:

  • 测试模块:以 test_ 开头命名,如:test_login.py,或以 _test 结尾,如:login_test.py
  • 测试类:必须以Test开头命名,且测试类中不能有 init 方法
  • 测试方法/测试函数:必须以 test 开头,如:test_login() 或 testRegister()

最好是将测试模块、测试方法/函数都以 test_ 开头命名,这样可读性更强,如下图:

微信图片_20220424221435.png

2、自定义命名规则(了解)

pytest 框架可以通过pytest.ini配置文件自定义命名规则,在某些特定场景下可能会用到。

在测试项目的根目录下创建pytest.ini文件,并进行如下配置:

1
2
3
4
5
6
7
[pytest]
# 更改测试模块命名规则
python_files = CS*
# 更改测试类命名规则
python_classes = CS*
# 更改测试方法/测试函数命名规则
python_functions = CS*

注意,在.ini文件中直接使用中文注释执行的时候会报错,实际使用如上代码时,需要将中文注释去掉。

除非是特殊情况,否则不太建议自定义命名规则。

四、Pytest 体验

1、创建测试用例

创建测试用例,命名为 test_one.py

1
2
3
4
5
6
def inc(x):
return x + 1


def test_answer():
assert inc(3) == 5

2、运行测试用例

运行方式有很多种,这里简介介绍右键运行和命令行运行,后面会介绍 pytest.ini 运行方式。

(1)右键运行

image-20230430230025321

(2)终端运行

进入终端,使用命令 pytest + 文件名 运行。示例:pytest .\test_one.py

image-20230430230244134

3、用例执行结果

image-20230504105849528

4、编辑运行配置(可选)

如果以 unitest 运行测试用例,则执行以下步骤,更改测试用例运行环境为 pytest 。点击右上角 Edit Configurations 。

image-20230504105627123

找到 Python tests >> pytest ,点击OK。

image-20230430225402228