API 接口自动化测试详细图文教程学习系列20--结合Pytest框架使用

测试学习记录,仅供参考!

Pytest 框架

本文实际结合测试项目接口服务进行 API 接口自动化测试;建议可参考学习:从 0 到 1 搭建完整 Python 语言 Web UI自动化测试学习系列 17--测试框架Pytest基础 1--介绍使用

一、pytest 的简介

pytest 是一个流行的测试框架,广泛用于单元测试、集成测试和功能测试。它具有简单、灵活、可扩展的特点,提供了丰富的功能和插件生态系统,它简化了测试的编写和组织,pytest 通过提供丰富的功能和简洁的语法,让测试变得容易、灵活且易于理解。

二、安装

自行选择一种安装方法,例如:命令行安装;

复制代码
pip install pytest

Python 解释器→软件包安装;

三、pytest 编写规则(默认规则)

  • 测试文件以 test_ 开头或者以 _test 结尾;
  • 测试类以 Test 开头,并且不能带有 init 初始化构造函数方法;
  • 测试函数(在测试类里面要实现的方法)以 test_ 开头;
  • 断言使用基本的 assert 即可;

1、在项目根目录下新建名称为 testcases 的 Python 软件包,用于专门存放统一管理测试用例; 继续在testcases 软件包下新建名称分别为login(登录模块)和userManager(用户管理模块)的目录文件;

2、创建一个测试文件,在登录模块login目录下新建名称为test_login.py的 Python 文件,并输入以下内容;

复制代码
# 创建一个类 TestLogin--测试类以Test开头,后面可自定义
class TestLogin:
    # 定义一个初始化构造函数 __init__--运行时查看结果是否会报错
    def __init__(self):
        print('这是初始化构造函数')

    # 定义一个测试函数(测试方法)test_login_success
    def test_login_success(self):
        print('登录成功场景')

    # 登录失败
    def test_login_failed(self):
        print('登录失败场景')

3、在终端手动输入pytest 后,按下enter 回车键,会自动在项目根目录下查找所有符合条件规则Python 测试用例文件去执行;能够在终端控制台中看到" warning 警告"信息;

4、修改test_login.py文件内容,直接删除或者注释掉初始化构造函数;

复制代码
# 创建一个类 TestLogin--测试类以Test开头,后面可自定义
class TestLogin:

    # 定义一个测试函数(测试方法)test_login_success
    def test_login_success(self):
        print('登录成功场景')

    # 登录失败
    def test_login_failed(self):
        print('登录失败场景')

5、再次终端运行pytest命令,可以执行成功,没有警告信息;

四、pytest 的运行方式

命令行运行方式(一般用于调试)

命令行模式,用于测试调试某个测试用例是否通过的,写代码脚本时,做调试用的;直接在命令行中输入"pytest",它将自动查找并执行当前目录及其子目录中的所有以 test_ 开头的测试用例文件。

复制代码
pytest
指定运行

6、在用户管理模块userManager下新建名称为test_adduser.py的 Python 文件,并输入以下内容;

复制代码
# 创建类 TestAddUser
class TestAddUser():
    # 定义测试用例 test_add_user_01
    def test_add_user_01(self):
        print('新增用户')

7、在用户管理模块userManager下新建名称为test_deleteUser.py的 Python 文件,并输入以下内容;

复制代码
# 创建类 TestDeleteUser
class TestDeleteUser():
    # 定义测试用例 test_delete_user_01
    def test_delete_user_01(self):
        print("删除用户")
运行指定目录的测试用例

指定要运行的目录,pytest 将查找并运行该目录及其子目录下的测试用例;

直接调用 pytest 命令 + 测试文件名(注意文件目录路径层级)

复制代码
pytest testcases/userManager
运行指定文件的测试
复制代码
pytest testcase/userManager/test_deleteUser.py
使用带参数的
复制代码
参数说明:
    -s    表示输出调试信息,包括print打印信息
    -v    显示更加详细的信息
    -vs   把上面两个参数一起使用
    -k    指定运行测试用例的文件、目录

    -n    设置多线程/多进程数量并发去执行测试用例
    --reruns    设置全局的测试用例失败重跑的次数
    -m    运行分组的测试用例

使用"-k"参数并提供测试用例或测试目录的名称,可以运行匹配该名称的测试用例;

复制代码
# 指定目录
pytest -k userManager

# 指定测试文件
pytest -k test_deleteUser

# 指定运行测试函数
pytest -k test_login_failed

使用"-s"参数在控制台输出调试信息,包括打印信息(调试、打印信息);

复制代码
pytest -s -k test_login

使用"-v"参数打印出更多详细的信息(文件路径--类名 函数名--打印信息)

复制代码
pytest -s -v -k test_login

组合使用,可以把参数"-s"、"-v"组成一个"-vs"/"-sv"组合使用;

复制代码
pytest -vs -k test_login

主函数方式运行

主函数模式,一般用于完整框架完成之后,运行主函数时运行,用于执行pytest测试,它可以通过传递命令行参数来配置和控制测试的执行;

复制代码
if __name__ == '__main__':
    pytest.main(['-vs', '-k', 'test_add_user_01'])

8、修改项目根目录 testcase 软件包登录模块login目录下test_login.py文件内容,亦可以在主函数if __name__ == '__main__':中添加参数来输出内容信息;

复制代码
# 导包--引入pytest模块框架
import pytest

# 创建一个类 TestLogin--测试类以Test开头,后面可自定义
class TestLogin:
    # 定义一个测试函数(测试方法)test_login_success
    def test_login_success(self):
        print('登录成功场景')

    # 登录失败
    def test_login_failed(self):
        print('登录失败场景')

# 主函数
if __name__ == '__main__':
    # 通过pytest模块调用 main() 方法--这就是主函数运行了
    # pytest.main()
    # 使用参数--怎么传参数?--使用list类型--
    pytest.main(['-s', '-v', '-k'])

# 但是没有内容输出出来

9、在最外层创建主函数运行入口,在项目根目录下新建一个名称为run.py 的 Python文件,并在文件中输入以下内容;

复制代码
# 导包
import pytest

# 主函数
if __name__ == '__main__':
    # 例如:指定运行登录模块--在参数后面直接写目录名
    pytest.main(['-vs', '-k', 'login'])

通过读取 pytest.ini 配置文件运行

一般用于企业自动化时推荐使用,做真实项目时推荐使用做配置文件运行;pytest.ini 文件是Pytest测试框架的配置文件,它允许设置各种配置选项以自定义测试运行的行为,一般是在项目的根目录下创建pytest.ini文件,其中文件名固定,写法不能任意更改(因为这个文件是pytest里面内置的一个配置文件,所以不能去改它的文件名称);当在项目根目录下创建完这个配置文件之后,再去执行测试时,pytest它将在运行测试时读取该文件,并应用其中的配置信息。(脚本运行时,pytest 首先会去根目录下去查找有没有这个pytest.ini 配置文件,如果有的话,它会查找里面一些参数的配置,并且应用到整个的测试过程中去)。

10、 在项目根目录下新建一个名称固定为pytest.ini 的配置文件,填写第一个配置项;

第一行(第一级)写下:[pytest]

第二行写下命令行默认参数:addopts = -s

复制代码
[pytest]
addopts = -s

|----------------------------|---|---|
| 第一个参数 addopts -- 接收命令行参数,并应用到整个测试里面去; |||
| 指定某个目录(例如:userManager) | addopts = -s -v -k userManager ||
| 指定某个文件(例如:test_deleteUser) | addopts = -s -v -k test_deleteUser ||

11、修改run.py 文件内容;

复制代码
# 导包
import pytest
# 主函数
if __name__ == '__main__':
    # 主函数运行时不传任何命令行参数
    pytest.main()

12、 运行run.py 文件,能够运行成功,可以发现已经成功通过读取配置文件内容去生效了;

13、修改pytest.ini 配置文件内容,书写第二个配置项,注意在配置文件中不能书写中文注释;

复制代码
[pytest]
addopts = -s -v
testpaths = ./testcases

|------------------------------|---|---|
| 第二个参数 testpaths 设置指定测试用例执行路径(路径需要写相对路径设置执行的路径,测试用例的目录设置) |||
| testpaths =./testcases | 默认执行全部的测试用例,执行testcase目录下所有的测试文件(这里因为测试用例都是写在testcase目录下的,所以是全部) ||
| testpaths =./testcases/login | 单个,只执行login目录下的;若传一个不存在的路径,则会提示找不到路径(实际是会默认执行所有的用例) ||
| testpaths =./testcases/login ./testcases/userManager/test_deleteUser.py 多个,多个时使用空格隔开; |||

14、修改pytest.ini 配置文件内容,继续书写第三个配置项;

复制代码
[pytest]
addopts = -s -v
testpaths = ./testcases/login ./testcases/userManager/test_deleteUser.py
python_files = ctest_*.py

|---|---|---|
| 第三个参数 python_files 匹配测试文件的命名规则(可以自定义的去命名测试文件,会通过自定义的命名模式去执行测试用例) |||
| 一般都是默认执行以 test_ 开头的文件,设置为 python_files = ctest_*.py --表示以 ctest_ 开头的测试文件,* 星号则是表示匹配任何数据 |||

15、此时运行run.py 文件,发现只执行了test_deleteUser.py中的删除用户测试用例,这是因为上面testpaths 参数已经指定了删除用户测试用例这个文件;

16、 修改pytest.ini 配置文件配置项;

复制代码
[pytest]
addopts = -s -v
testpaths = ./testcases
python_files = ctest_*.py

17、再运行run.py 文件,发现一个测试都没有找到,因为testcases目录下没有符合设定的条件ctest_开头的测试用例文件;

18、这时把配置项条件python_filesctest_修改为test_或者更改测试用例文件名为ctest_ 开头的(例如:把test_login.py文件名更改为ctest_login.py),再执行run.py文件查看是能够成功找到对应的测试用例文件;

19、修改pytest.ini 配置文件内容,继续写第四个配置项;

复制代码
[pytest]
 = -s -v
testpaths = ./testcases
python_files = ctest_*.py
python_classes = CTest*

|---|---|---|
| 第四个参数 python_classes -- 匹配测试类的命名规则; |||
| 一般测试类都是以 Test 开头的,设置为 python_classes = CTest* -- 如上所诉,也更改为 CTest 开头的 |||

若测试文件中没有符合设定的条件CTest 开头的测试类,运行run.py文件,会发现一个测试用例都没有找到;若更改某个测试文件中的测试类名,例如把 TestLogin 改为CTestLogin 即可成功找到;

20、修改pytest.ini 配置文件内容,继续写第五个配置项;

复制代码
[pytest]
addopts = -s -v
testpaths = ./testcases
python_files = ctest_*.py
python_classes = CTest*
python_functions = ctest_*

|---|---|---|
| 第五个参数 python_functions -- 匹配测试函数的命名规则; |||
| 一般测试函数是以 test_ 开头,设置为 python_functions = ctest_* -- 亦如上所诉,也更改为 ctest_ 开头的 |||

21、运行run.py 文件,会发现亦是一个测试都没有找到,因为没有符合设定的条件ctest_ 开头的测试函数,也是更改名称即可;这里仅作示例使用,所更改的" 测试文件、测试类、测试函数 "名称记得还原回去,后续可根据实际需再优化。

复制代码
[pytest]
addopts = -vs
testpaths = ./testcases
python_files = test_*.py
python_classes = Test*
python_functions = test_*
配置项参数

|----------------------------|---|---|
| 配置项可以帮助控制pytest框架的行为,例如指定测试目录、命名规则、日志输出等。根据项目需求,可以根据需要进行自定义配置。 |||
| addopts = --verbose | 用于在运行测试时传递额外的命令行选项;指定额外的命令行选项。设置为"--verbose",表示在运行测试时显示更详细的信息。 ||
| testpaths = ./TestCases | 用于指定pytest在哪些目录中查找测试文件,它允许定义一个或多个目录,告诉pytest在这些目录下寻找文件;指定测试用例所在的目录。此处设置为"./TestCases",表示测试用例文件位于项目根目录下的"TestCases"目录中。 ||
| python_files = test_*.py | 用于指定测试文件的命名匹配模式;指定测试文件的命名模式。设置为"test_*.py",表示测试文件以"test_"开头并以".py"结尾。 ||
| python_classes = Test_* | 用于指定测试类的命名匹配模式;指定测试类的命名模式。设置为"Test_*",表示测试类以"Test_"开头。 ||
| python_functions = test_* | 用于指定测试函数的命名匹配模式;指定测试函数的命名模式。此处设置为"test_*",表示测试函数以"test_"开头。 ||
| 其他补充 |||
| cache_dir = .pytest_cache | 指定缓存目录的路径。设置为".pytest_cache",表示将缓存文件放在当前目录下的".pytest_cache"目录中 ||
| markers = mark1 mark2 ... | 用于注册自定义标记;在pytest.ini文件中注册自定义标记 ||
| log_cli_level = INFO | 指定日志输出的级别。此处设置为INFO级别,表示只输出INFO及以上级别的日志。 ||
| log_date_format = %Y-%m-%d %H:%M:%S 指定日期的格式。此处设置为"%Y-%m-%d %H:%M:%S",表示日期的格式为年-月-日 时:分:秒。 |||
| log_format = %(asctime)s %(levelname)s %(message)s 指定日志输出的格式。此处设置为"%(asctime)s %(levelname)s %(message)s",表示日志输出包含时间、日志级别和日志消息。 |||
| norecursedirs = TestDatas common conf report 指定不包含在测试中的目录。此处设置为"TestDatas common conf report",表示在运行测试时不会遍历这些目录。 |||

未完待续。。。

相关推荐
nashane3 小时前
HarmonyOS 6学习:PC端悬浮窗模式与智能长截图的协同优化实战
学习·华为·harmonyos
python在学ing3 小时前
前端-CSS学习笔记
前端·css·python·学习
三品吉他手会点灯4 小时前
C语言学习笔记 - 35.数据类型 - printf函数的非输出控制符与格式优化
c语言·开发语言·笔记·学习
sakiko_4 小时前
Swift学习笔记28-缓存
笔记·学习·swift
IT策士4 小时前
Django 从 0 到 1 打造完整电商平台:为什么用 Django 做电商?
后端·python·django
zkkkkkkkkkkkkk5 小时前
Linux进行管理工具Supervisor配置与使用
linux·python·supervisor
2301_783848655 小时前
mysql数据库迁移到云平台流程_使用数据传输服务DTS工具
jvm·数据库·python
xian_wwq5 小时前
【学习笔记】探讨大模型应用安全建设系列3——护栏选型与输入输出防护
笔记·学习
爱喝水的鱼丶5 小时前
SAP-ABAP:ABAP函数 NUMBER_GET_NEXT 详解:从编号范围对象获取下一个编号
运维·数据库·学习·sap·abap