01-pytest 框架介绍
1. pytest 框架介绍
1.1 pytest框架引入
什么是框架?简单来说就是一套抽象出来的工具集合,可以提供大量组件、工具和功能等。一般把重复工作通过代码封装好,实现多次重复调用。对于测试框架而言,通常包含用例发现、用例管理、用例执行、配置管理、日志管理、数据管理、测试报告等功能。
1.1.1 测试框架能解决什么问题
在整个测试过程中,常见的流程为编写测试计划、用例设计与编写、用例执行、Bug生命周期管理与跟踪、编写测试报告,在此期间也会包含团队或跨团队间的开会、沟通等。
在用例执行期间和Bug生命周期管理与跟踪阶段是会一直重复出现。那么我们可以把整个执行过程封装成为一个框架,每次只要我们把测试用例提交,让框架帮忙执行用例和管理。在Bug生命周期管理期间,提交Bug也是重复的,而在提交Bug时,是需要运行结果做为支撑,这个时候,我们也可以通过框架生成一份完整漂亮的测试报告。
基于以上原因,所有重复工作,我们都可以使用框架的方式实现,所以需要自行设计和编写代码,而用例执行和生成测试报告则可以由pytest和其插件辅助完成。
1.1.2 测试框架分类
- 测试执行:Selenium、PlayWright、Appium、Requests等
- 用例管理与执行:pytest、unittest
- 测试报告:allure
- 环境部署:Kubernetes、Docker
- DevOps: Jenkins
1.1.3 pytest是什么
pytest是一款基于Python语言的测试框架,可用于编写和执行测试代码,通常应用于自动化测试领域,可进行单元测试、接口测试、Web/App自动化测试。
1.pytest 特点
随着DevOps的不断落地,pytest也越来越流行。其主要特点如下所示:
- 免费开源
- 拥有活跃和社区
- 语法简单,上手容易
- 支持数据驱动
- 支持用例的skip/xfail处理
- 自发现测试文件
- 可以运行指定的测试文件,最小可至用例级别
- 既支持简单的单元测试,也可以支持复杂的功能测试
- 可与Jenkins实现集成
- 拥有丰富的第三方插件
- 支持并行测试
- 兼容unittest框架
与Selenium/PlayWright/Appium等工具实现UI自动化测试,也可以与Requests实现API自动化测试
2.官网
1.2 技术前提
1.2.1 技术前提
- 需要Python基础
- 有过测试基础
1.2.2 适合人群
- 功能测试转自动化测试/测试开发
- 开发人员想提高自身代码质量
1.3 环境准备
pytest 依赖于 Python ,需要先安装Python,然后再安装 pytest,安装pytest命令:
pip -U install pytest # Windows
pip3 -U install pytest # Linux/MacOS
安装指定版本的pytest: pip install pytest==8.3.5
查看已经安装的pytest: pip show pytest
查看pytest 支持的命令和参数
pytest --help # 第一种方式
pytest -h # 第二种方式
1.4 pytest 快速上手
创建文件 test_run_pytest.py,输入以下内容:
def test_01():
assert 1==1
pytest 有三种启动方式:
- 通过命令
pytest test_run_pytest.py # 方式一
pytest # 方式二
- 通过代码
import pytest
def test_01():
assert 1==1
if __name__ == '__main__':
pytest.main([" -s"],"test_run_pytest.py")
- 通过鼠标
以PyCharm为例,在对应的测试用例前面点击Run 'Python tests for tes...'
1.5 pytest 框架结构
在执行测试过程中,我们通常会做一些准备工作,再进行测试,测试完成后也会尽量恢复原状。因此我们也希望测试框架也提供类似的功能,即测试前和测试完成后的一些方法。
大多数的测试框架都会提供setup和teadown,在setup中做测试前准备,在teardown中提供测试完成后的测试清理,恢复原状等。pytest提供了相对自由和层次丰富的setup和teardown框架结构,支持5个层级的setup和teardown,分别为session会话级、module模块级、function函数级、class类级、method方法级。
- 模块级(setup_module/teardown_module): 作用域于模块的开始与结束,不包含在类中
- 函数级(setup_function/teardown_function):作用域于函数的开始与结束,不包含在类中
- 方法级(setup_method/teardown_method): 作用域方法的开始与结束,包含在类中
- 类级(setup_class/teardown_class):作用域类的开始与结束,仅在类中运行一次,包含在类中
- 兼容类里面的层级(setup/teardown):在每个调用方法前后运行
以上级别用在初始化setup和销毁teardown中,也可以配合pytest中的fixture,使得功能变得更强大。
- 模块和方法级的setup/teardown示例
# @IDE: PyCharm
# @Project: PyCharmProjects
# @File: test_setup_teardown.py
# @Time 2025-03-10 22:28
# @Author: Surpass Lee
# @E-mail: surpassmebyme@gmail.com
import pytest
def setup_module():
print("调用 module 中的 setup")
def teardown_module():
print("调用 module 中的 teardown")
def setup_function():
print("调用 function 中的 setup")
def teardown_function():
print("调用 function 中的 teardown")
def test_setup_teardown():
print("调用 测试方法...")
if __name__ == '__main__':
pytest.main(" -s ","test_setup_teardown.py")
运行结果如下所示:
调用 module 中的 setup
调用 function 中的 setup
调用 测试方法...
调用 function 中的 teardown
调用 module 中的 teardown
- 类级的setup/teardown示例
# @IDE: PyCharm
# @Project: PyCharmProjects
# @File: test_setup_teardown_class.py
# @Time 2025-03-10 22:37
# @Author: Surpass Lee
# @E-mail: surpassmebyme@gmail.com
import pytest
class TestClass():
def setup_class(self):
print("调用 class 中 setup")
def teardown_class(self):
print("调调用 class 中 teardown")
def setup_method(self):
print("调用 method 中 setup")
def teardown_method(self):
print("调用 method 中 teardown")
def testcase_01(self):
print("调用testcase_01")
def testcase_02(self):
print("调用testcase_02")
if __name__ == '__main__':
pytest.main(" -s ","test_setup_teardown_class.py")
运行结果如下所示:
test_setup_teardown_class.py::TestClass::testcase_01
调用 class 中 setup
调用 method 中 setup
PASSED [ 50%]调用testcase_01
调用 method 中 teardown
test_setup_teardown_class.py::TestClass::testcase_02
调用 method 中 setup
PASSED [100%]调用testcase_02
调用 method 中 teardown
调用 class 中 teardown
1.6 pytest 查找原则和命名方法
pytest 根据一定的规则搜索并运行测试,标准和测试搜索规则如下所示:
- 从一个或多个目录开始查找,可以在命令行指定文件名或目录名,如果未指定,则使用当前目录
- 在该目录和所有子目录递归查找测试模块
测试模块是指文件名以test开头或结尾的文件,例如test_*.py或 *_test.py 的文件
- 在测试模块中查找以test开头或结束的函数
- 在测试模块中查找以Test开头或结束的类,再查找以test开头或结束的方法
通常测试模块、测试类、测试函数/方法的命名都是以test开头或结束。如果不遵守这个命令规则,则无法搜索到测试模块、测试类、测试函数/方法,导致无法运行测试用例。
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

作者: Surpassme
来源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 ,否则保留追究法律责任的权利。如有问题,可发送邮件 联系。让我们尊重原创者版权,共同营造良好的IT朋友圈。

浙公网安备 33010602011771号