Pytest测试框架

一、Pytest背景与优势

1.1 Pytest介绍

  • Pytest是一个功能强大的Python测试框架,用于编写和运行测试。
  • 它支持简单的单元测试,也能够处理复杂的功能测试。
  • Pytest是开源的,并且被广泛使用,特别是在开发过程中测试Python代码。
  • Pytest还兼容unittest。

1.2 Pytest优势

  1. 简洁和易用:Pytest的语法非常简洁,写测试非常方便。测试函数只需以test_开头,不需要任何样板代码。

  2. 强大的功能

  • 自动发现测试:Pytest能够自动发现符合命名规范的测试文件和测试函数。
  • 灵活的测试夹具:Pytest的fixture机制非常强大,能够很方便地实现资源的设置和拆卸。
  • 参数化测试:支持参数化,可以用多组数据运行同一个测试函数,从而减少代码重复。
  • 接口/自动化测试:结合Requests实现接口测试;结合Selenium、Appium实现自动化功能测试。
  1. 详细的错误报告:Pytest提供详细的错误报告,帮助开发者快速定位问题。
  2. 丰富的插件生态:Pytest有很多插件,可以扩展其功能,比如测试覆盖率(coverage)、测试顺序控制、并行执行等。而且支持定制化插件开发。
  3. 与其他工具集成:可以与其他工具很好地集成,如CI/CD工具、IDE等。结合Allure集成到Jenkins中可以实现持续集成。

1.3 Pytest对软件测试工程师发展的帮助

  1. 提高测试效率:Pytest的简洁和易用性,使得测试编写和维护变得更简单和高效,帮助测试工程师节省时间。
  2. 增强测试能力:通过使用Pytest,测试工程师可以轻松编写复杂的测试,从而提高测试覆盖率和质量。
  3. 掌握先进工具:熟悉并掌握Pytest,能够帮助测试工程师跟上行业发展的步伐,增强自身的竞争力。
  4. 提高问题排查能力:Pytest提供详细的错误报告,有助于测试工程师快速定位和解决问题。
  5. 推动自动化测试:Pytest支持自动化测试,测试工程师可以借助其功能实现自动化测试流程,提高测试的效率和可靠性。
  6. 丰富的社区资源:Pytest拥有广泛的社区支持,测试工程师可以从中获得丰富的资源和帮助,不断提升自己的技能。

二、Pytest安装

  • 方法一:pip install pytest或者pip install -U pytest

image

  • 方法二:Pycharm直接安装
      1. 进入 Tools->Python Intergrated Tools
      1. 选择 Default test runner 为 pytest


三、Pytest命名规则

类型 规则
文件 test_开头 或者 _test 结尾
Test 开头
方法/函数 test_开头
  • 注意:测试类中不可以添加__init__构造函数。

根据Python之父Guido的建议所置制定的规范
https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules.html#id15

类型 公有 内部
小写下划线
模块 小写下划线 下划线+小写下划线
大驼峰 下划线+大驼峰
异常 大驼峰
函数 小写下划线 下划线+小写下划线
全局常量/类常量 大写下划线 下划线+大写下划线
全局变量/类变量 小写下划线 下划线+小写下划线
实例变量 小写下划线 下划线+小写下划线 (受保护)
方法名 小写下划线 下划线+小写下划线 (受保护)
函数参数/方法参数 小写下划线
局部变量 小写下划线

例子

类型 公有 内部
lower_with_under
模块 lower_with_under _lower_with_under
CapWords _CapWords
异常 CapWords
函数 lower_with_under() _lower_with_under()
全局常量/类常量 CAPS_WITH_UNDER _CAPS_WITH_UNDER
全局变量/类变量 lower_with_under _lower_with_under
实例变量 lower_with_under _lower_with_under
方法名 lower_with_under() _lower_with_under()
函数参数/方法参数 lower_with_under
局部变量 lower_with_under

四、Pytest用例结构

由三部分构成:用例名称、用例步骤、用例断言

测试用例示例

def test_XXX(self):
    # 测试步骤1
    # 测试步骤2
    # 断言  实际结果 对比 预期结果
    assert ActualResult == ExpectedResult

类级别的用例示例

class TestXXX:
    def setup(self):
        # 资源准备
        pass

    def teardown(self):
        # 资源销毁
        pass

    def test_XXX(self):
        # 测试步骤1
        # 测试步骤2
        # 断言  实际结果 对比 预期结果
        assert ActualResult == ExpectedResult

五、Pytest测试用例断言

5.1 定义

断言(assert):是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑式判断),目的是表示与验证软件开发者预期的结果。
当程序执行到断言的位置时,对应的断言应该为真。
若断言不为真时,程序会自动终止,并给出错误提示。

5.2 用法

  • assert <表达式 >
  • assert <表达式 >,<描述>

六、Pytest测试框架结构(setup/teardown)

测试装置介绍

类型 规则
setup_module/teardown_module 全局模块级
setup_class/teardown_class 类级,只在类中前后运行一次
setup_function/teardown_function 函数级,在类外
setup_method/teardown_method 方法级,类中的每个方法执行前后
setup/teardown 在类中,运行在调用方法的前后(已弃用)
  • 函数级:


  • 模块级:

  • 方法级:

  • 类级:

源码

# 模块级别:只被调用一次
def setup_module():
    print("资源准备:setup module")

# 模块级别:只被调用一次
def teardown_module():
    print("资源准备:teardown module")

def test_case1():
    print("测试用例1")

def test_case2():
    print("测试用例2")

def test_case3():
    print("测试用例3")

def setup_function():
    print("资源准备:setup function")

def teardown_function():
    print("资源销毁:teardown function")

class TestDemo:

    # 执行类,前后分别执行setup_class、teardown_class
    def setup_class(self):
        print("TestDemo setup_class")

    def teardown_class(self):
        print("TestDemo teardown_class")

    # 每个类里面的方法,前后都分别执行setup,teardown
    def setup_method(self):
        print("TestDemo setup_method")

    def teardown_method(self):
        print("TestDemo teardown_method")

    def test_demo1(self):
        print("test demo1")

    def test_demo2(self):
        print("test demo2")