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 框架结构

    在执行测试过程中,我们通常会做一些准备工作,再进行测试,测试完成后也会尽量恢复原状。因此我们也希望测试框架也提供类似的功能,即测试前和测试完成后的一些方法。

    大多数的测试框架都会提供setupteadown,在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 根据一定的规则搜索并运行测试,标准和测试搜索规则如下所示:

  1. 从一个或多个目录开始查找,可以在命令行指定文件名或目录名,如果未指定,则使用当前目录
  2. 在该目录和所有子目录递归查找测试模块

测试模块是指文件名以test开头或结尾的文件,例如test_*.py*_test.py 的文件

  1. 在测试模块中查找以test开头或结束的函数
  2. 在测试模块中查找以Test开头或结束的类,再查找以test开头或结束的方法

    通常测试模块、测试类、测试函数/方法的命名都是以test开头或结束。如果不遵守这个命令规则,则无法搜索到测试模块、测试类、测试函数/方法,导致无法运行测试用例。

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

posted @ 2025-06-02 21:44  Surpassme  阅读(171)  评论(0)    收藏  举报