[TOC]

本文是学习了《Selenium自动化测试完全指南》和其他网络上的教程写出的学习笔记

Pytest简介

Pytest是目前最成熟、功能最全面的Python测试框架之一。

简单灵活,容易上手,而且支持参数化与测试编排功能,对其他测试框架(例如Nose、UnitTest等)也能完全兼容。Pytest的第三方插件非常丰富,拥有非常良好的扩展性

安装

1
pip install pytest

使用

使用Pytest编写测试,必需遵守以下基本规则,否则测试无法正常运行

  • 测试文件的名称以“test_”开头(或以“_test”结尾)
  • 测试类的名称以Test开头,并且不能带有__init__方法
  • 测试函数的名称以“test_”开头
  • 断言使用基本的“assert {表达式}”即可。如果表达式为True,则断言通过;否则,断言失败。

举例:test_example.py

1
2
3
4
5
6
7
8
9
class TestClass:
def test_char_in_string(self):
string = "this"
char = "h"
assert char in string

def test_calculation(self):
result = 20 + 21
assert 41 == result

运行方式

  • 默认全部执行

在测试文件目录下打开命令行,输入pytest,即可执行该目录下所有测试文件

  • 选择指定文件
1
2
3
4
5
6
7
8
9
10
11
12
# 方法一:使用带参数的pytest命令
pytest 测试文件名称::测试类名称::测试函数名称

pytest test_example.py #运行test_example.py中的所有测试
pytest test_epubit_common.py::TestEpubit #运行test_epubit_common.py里TestEpubit类中的所有测试函数
pytest test_example.py::TestClass::test_char_in_string # 运行test_example.py里TestClass类中test_char_in_string测试函数。

#方法二:在代码中使用pytest.main()执行指定测试
import pytest
if __name__ == '__main__':
# 相当于pytest test_epubit_common.py命令
pytest.main(["test_epubit_common.py"])
  • 命令参数
参数 作用 描述
-v 显示每个函数的测试结果 默认只有模块的结果
-q 只显示整体测试结果
-s 显示测试函数的print()输出 在命令行上

设定测试函数的先后顺序

Pytest默认的测试函数执行顺序:

文件级执行顺序:在Pytest中,文件级别的执行顺序为先从上到下依次执行同一个文件夹下的.py文件,然后依次执行同一个文件夹下的子文件夹。(正常的文件顺序)

函数级执行顺序:从上到下依次执行

自定义顺序:pytest-ordering插件

1
2
3
4
5
#安装
pip install pytest-ordering

# 在各个测试函数前添加以下装饰器,就可以自定义测试的顺序
@pytest.mark.run(order=顺序编号) #从1开始

ps:如果测试之间存在顺序依赖,通常是规划不合理导致的。这种顺序依赖不仅会导致维护困难,还会导致以后难以修改测试执行方式(例如执行并发测试)。如无特殊需求,请尽量不要设定测试的顺序。

测试粒度规划

小粒度的测试:功能,页面流程中的相续操作都被分散到各个测试函数当中,因此很可能需要考虑测试函数的先后顺序以及前后置操作的影响。

在小粒度的测试中,一个测试函数只对应一个功能点,看起来非常明确。但并不推荐粒度过小的测试,因为这种粒度的测试结构太过脆弱,比较难维护

中粒度的测试:一个类对应一个页面,因此可以考虑类级别的前后置操作

适用于非常多的场景,尤其适合大型的、专门的、独立的自动化测试项目。这类项目通常会要求较高的页面覆盖比例,对各个页面的功能往往挖掘得比较深入。

大粒度的测试:各个测试函数绝对独立,一个测试函数直接对应一个页面,测试函数通常会调用较多的非测试子函数,所以通常无须在类中添加前后置操作。

适用于应用程序研发流程中的快速回归测试。此时的测试并不要求高比例覆盖每个页面的每个功能点,而是要求快速验证应用程序中的重要业务点是否正确。