您现在的位置是:首页 >学无止境 >pytest使用手册网站首页学无止境
pytest使用手册
1. pytest寻找测试项的具体规则
- 如果未指定命令行参数,则从pytest命令运行的当前目录开始收集。
- 如果在命令行参数中指定了目录、文件名则按参数来寻找。
- 寻找过程会按照目录层层递归,在这些目录中,搜索 test_*.py 或 *_test.py 文件。
- 从这些文件中,收集如下测试项:
- test为前缀的函数
- Test为前缀的类里面的 test为前缀的方法
2. 编写测试用例代码
首先,我们编写的测试用例代码文件, 必须以 test_ 开头,或者以 _test 结尾。比如,我们创建一个 文件名为 test_错误登录.py ,放在目录 autotestcases登录下面。其中autotest是我们创建的自动化项目根目录。
class Test_错误密码:
def test_C001001(self):
print('
用例C001001')
assert 1 == 1
def test_C001002(self):
print('
用例C001002')
assert 2 == 2
def test_C001003(self):
print('
用例C001003')
assert 3 == 2
如果我们把测试用例存放在类中, 则类名必须以 Test 为前缀,类中的测试用例对应的方法必须以 test为前缀。
pytest 中用例的检查点直接用Python的 assert 断言。
assert后面的表达式结果为True ,则表示检查点通过;结果为False ,则表示检查点不通过。
显示找到3个测试项,2个执行通过,1个不通过。
通过的用例 是用一个绿色小点表示, 不通过的用例用一个红色的F表示
并且会在后面显示具体不通过的用例 和不通过的检查点 代码细节。
3. 编写初始化清除(setup、teardown)
对自动化测试框架来说,初始化清除功能至关重要。
- 模块级别(setup_module、teardown_module):模块级别的初始化、清除分别在整个模块的测试用例执行前后执行,并且只会执行1次 。它主要是用来为该模块中所有的测试用例做公共的初始化和清除。
- 类级别(setup_class、teardown_class):类级别的初始化、清除分别在整个类的测试用例执行前后执行,并且只会执行1次。它主要是用来为该类中的所有测试用例做公共的初始化和清除。
- 方法级别(setup_method、teardown_method):方法级别的初始化、清除分别在类的每个测试方法执行前后执行,并且每个用例分别执行1次。它主要是用来为具体的某个测试用例做初始化和清除。
- 目录级别:目标级别的初始化、清除就是针对整个目录执行的初始化、清除。它主要是用来为该目录下的所有的测试用例做公共的初始化和清除。
4. 目录级别的初始化清除
4.1 conftest.py文件
我们在需要初始化的目录下面创建一个名为conftest.py的文件,里面内容如下所示:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture(scope="session")
def login():
print("====登录功能,返回账号,token===")
name = "testyy"
token = "npoi213bn4"
yield name, token
print("====退出登录!!!====")
@pytest.fixture(autouse=True)
def get_info(login):
name, token = login
print(f"== 每个用例都调用的外层fixture:打印用户token: {token} ==")
pytest在执行 test_i2c.py 文件之前,会先执行 conftest.py 文件中的方法,然后再执行 test_i2c.py 文件。
举例说明:上述代码块中共两个方法:login()、get_info()。并且方法使用pytest.fixture()装饰器来标记,这样在其他函数、模块、类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
conftest.py的作用
首先, conftest.py 的文件名称是固定的, pytest 会自动识别该文件,我们可以理解成一个专门存放 fixture 的配置文件。
一个工程下可以建多个conftest.py文件,一般我们都是在工程根目录下设置conftest文件,这样会起到一个全局的作用。 我们也可以在不同的子目录下放 conftest.py ,这样作用范围只能在该层级的子目录下生效。
4.2 conftest.py 配置注意事项
- pytest 会默认读取 conftest.py 里面的所有 fixture。
- conftest.py 文件名称是固定的,不能改动。
- conftest.py 只对同一个目录下的所有测试用例生效。
- 不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py。
- 测试用例文件中不需要手动 import conftest.py,pytest 会自动查找。
- 用 fixture 实现 teardown 并不是一个独立的函数,而是用 yield 关键字来开启 teardown 操作。
4.3 pytest.fixture()参数介绍
1. scope:
- 当 pytest.fixture(scope=“session”) 时,作用域是整个测试会话,即开始执行pytest 到结束测试只会执行一次。
- 当 pytest.fixture(scope=“function”) 时,如果不写参数,默认就是scope=“function”,它的作用范围是每个测试用例来之前运行一次。
- 当 pytest.fixture(scope=“class”) 时,它的作用范围是每个测试类前执行一次。
- 当 pytest.fixture(scope=“module”) 时, module 作用是整个 .py 文件都会生效(整个文件只会执行一次),用例调用时,参数写上函数名称就可以。
- 注:同一个模块里出现多个范围的装饰时,优先实例化范围优先级高的。也就是优先级从大到小:session–>module–->class–->function
2. name:
fixture的重命名。通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名。如果使用了name,那只能将name传入,函数名不再生效。
3. autouse:
默认False。若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名。
4.4 调用fixture的四种方法
1. 函数或类里面方法直接传fixture的函数参数名称@pytest.fixture()
2. 使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例,该方式获取不到fixture标识函数的返回值
3. 叠加usefixtures
4. autouse设置为True,自动调用fixture功能
5. pytest的配置文件
- pytest.ini:pytest的主配置文件,可以改变pytest的默认行为,有很多可配置的选项。
- conftest.py:是本地的插件库,其中的fixture将作用于该文件所在的目录以及所有子目录。(上文已介绍)
- init.py:每个测试子目录都包含该文件时,那么在多个测试目录中可以出现同名测试文件。
下面具体介绍pytest.ini文件:
[pytest]
markers=
smoke:冒烟测试
huigui:回归测试
addopts= -m=dailybuild
#指定文件名称
python_files=test_*.py
#指定类名称
python_classes=Test*
#指定方法名称
python_functions=test_*
- markers:pytest打标签以筛选测试用例,下文会进行详细介绍
- addopts:指定默认的 pytest 选项。-m=标签:执行被@pytest.mark.标签名标记的用例
- python_files:指定 pytest 只查找包含指定文件名模式的文件。例如,只查找 test_*.py 文件
- python_classes:指定 pytest 只查找包含指定类名模式的类。例如,只查找以 Test 开头的类
- python_functions:指定 pytest 只查找包含指定函数名模式的函数。例如,只查找以 test_ 开头的函数
6. pytest打标签
- 在pytest.ini文件中markers这个配置项注册标签
- 通过pytest.mark.标签名给单个用例加一条或多条标签
import pytest
class TestClass():
@pytest.mark.smoke
@pytest.mark.huigui
def test_one(self):
assert 1 == 1
@pytest.mark.smoke
def test_two(self):
assert 2 == 2
def test_three(self):
assert 3 == 3
- pytestmark=[pytest.mark.smoke]给测试类所有的用例添加标签
import pytest
pytestmark = [pytest.mark.huigui]
class TestClass():
@pytest.mark.smoke
def test_one(self):
assert 1 == 1
@pytest.mark.smoke
def test_two(self):
assert 2 == 2
def test_three(self):
assert 3 == 3
-
执行用例的时候可以通过pytest -m 标签名去筛选用例执行。运行时会收集所有的测试用例的数量,显示未选中和选中的数量,执行选中的测试用例。
-
扩展:筛选多个标签(and or not)
pytest -m “not smoke”----------运行除了smoke标签的用例
pytest -m “smoke or huigui”-----------运行smoke或者huigui的用例