一、Pytest背景与优势
1.1 Pytest介绍
- Pytest是一个功能强大的Python测试框架,用于编写和运行测试。
- 它支持简单的单元测试,也能够处理复杂的功能测试。
- Pytest是开源的,并且被广泛使用,特别是在开发过程中测试Python代码。
- Pytest还兼容unittest。
1.2 Pytest优势
-
简洁和易用:Pytest的语法非常简洁,写测试非常方便。测试函数只需以
test_
开头,不需要任何样板代码。 -
强大的功能:
- 自动发现测试:Pytest能够自动发现符合命名规范的测试文件和测试函数。
- 灵活的测试夹具:Pytest的fixture机制非常强大,能够很方便地实现资源的设置和拆卸。
- 参数化测试:支持参数化,可以用多组数据运行同一个测试函数,从而减少代码重复。
- 接口/自动化测试:结合Requests实现接口测试;结合Selenium、Appium实现自动化功能测试。
- 详细的错误报告:Pytest提供详细的错误报告,帮助开发者快速定位问题。
- 丰富的插件生态:Pytest有很多插件,可以扩展其功能,比如测试覆盖率(coverage)、测试顺序控制、并行执行等。而且支持定制化插件开发。
- 与其他工具集成:可以与其他工具很好地集成,如CI/CD工具、IDE等。结合Allure集成到Jenkins中可以实现持续集成。
1.3 Pytest对软件测试工程师发展的帮助
- 提高测试效率:Pytest的简洁和易用性,使得测试编写和维护变得更简单和高效,帮助测试工程师节省时间。
- 增强测试能力:通过使用Pytest,测试工程师可以轻松编写复杂的测试,从而提高测试覆盖率和质量。
- 掌握先进工具:熟悉并掌握Pytest,能够帮助测试工程师跟上行业发展的步伐,增强自身的竞争力。
- 提高问题排查能力:Pytest提供详细的错误报告,有助于测试工程师快速定位和解决问题。
- 推动自动化测试:Pytest支持自动化测试,测试工程师可以借助其功能实现自动化测试流程,提高测试的效率和可靠性。
- 丰富的社区资源:Pytest拥有广泛的社区支持,测试工程师可以从中获得丰富的资源和帮助,不断提升自己的技能。
二、Pytest安装
- 方法一:pip install pytest或者pip install -U pytest
- 方法二:Pycharm直接安装
-
- 进入 Tools->Python Intergrated Tools
-
- 选择 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")