API 接口自动化测试详细图文教程学习系列20--结合Pytest框架使用
测试学习记录仅供参考Pytest 框架本文实际结合测试项目接口服务进行 API 接口自动化测试建议可参考学习从 0 到 1 搭建完整 Python 语言 Web UI自动化测试学习系列 17--测试框架Pytest基础 1--介绍使用一、pytest 的简介pytest 是一个流行的测试框架广泛用于单元测试、集成测试和功能测试。它具有简单、灵活、可扩展的特点提供了丰富的功能和插件生态系统它简化了测试的编写和组织pytest 通过提供丰富的功能和简洁的语法让测试变得容易、灵活且易于理解。二、安装自行选择一种安装方法例如命令行安装pip install pytestPython 解释器→软件包安装三、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 -- 接收命令行参数并应用到整个测试里面去指定某个目录例如userManageraddopts -s -v -k userManager指定某个文件例如test_deleteUseraddopts -s -v -k test_deleteUser11、修改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_*.py17、再运行run.py文件发现一个测试都没有找到因为testcases目录下没有符合设定的条件ctest_开头的测试用例文件18、这时把配置项条件python_files中ctest_修改为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表示在运行测试时不会遍历这些目录。未完待续。。。