pytest框架的基本使用

1. 测试框架的作用

测试框架不关系用例的内容

它关心的是:用例编排和结果收集

2. pytest框架的特点

1. 适用于python语言

2. 用法符合python风格

3. 有丰富的生态

3. 安装pytest框架

1. 新建一个项目

2. 在项目终端窗口输入如下命令,用于安装pytest,其中-U是表示更新到最新的版本(如果你已经有了pytest,但是不是最新版,也会进行下载最新版)

pip install pytest -U

3. 下载完成后可以输入如下命令查看pytest是否安装成功

pip list

如果输出的列表中存在pytest,并且版本为最新,则安装成功。

4. pytest的用例发现规则

1. 以test_开头和以_test为结尾的文件 中收集用例

2. 从 以Test_开头的类 中收集用例(类不能包含__init__()方法)

3. 以test_开头的函数和方法 会作为测试用例

注意:作为测试用例的函数不能含有参数和返回值

5. 编写和执行测试用例

编写测试用例

编写测试用例就是通过代码实现用例的逻辑,可以通过assert来确定用例是否执行成功

class Test_A:
    def test_1(self):
        assert 1 == 1

    def test_2(self):
        assert 2 == 2

执行测试用例

方法一:通过执行pytest自带的main方法,该方法会执行项目中的所有用例

方法二:通过在终端输入命令行的方式,如下

pytest

执行不符合规则的文件中的用例

通过在终端中执行如下命令,符合的文件也可以通过此方法执行:

pytest 文件路径

6. 用例执行结果

结果缩写:

.测试通过
F测试失败
E出现错误
s跳过执行
x预期内失败
X预期外通过

结果的缩写是按照用例的执行顺序依次往后输出的

7. 配置

约定大于配置对于成熟的工具来说(如:pytest),默认配置是一种比较好的配置,如非必要,请勿修改

添加配置

1. 新建一个.ini结尾的文件

2. 加上如下内容

[pytest]

3. 查看所有的配置项:在终端中输入如下内容

pytest -h

4. 选择需要添加的配置项,将其按照对应的格式填写到.ini文件中

常用的命令行参数

额外的命令行选项 - addopts

v增加详细程度
q减少详细程度
s不进行内容捕捉,让所有的输出内容可以正常展示(成功的用例不会将里面的执行过程打印出来,可以通过-s来设置)
x快速退出(只要发现失败用例就立即停止运行)

一般情况下可以使用-vs,打印详细执行结果+用例输出内容打印

[pytest]
addopts = -vs

用户自定义标记 - mark

1. 注册标记

在.ini文件中添加mark,并添加标记

# 用户自定义标记
markers =
    name1
    name2
    name3

2. 打上标记

在函数上面添加标记,应该函数可以添加多个标记

class Test_A:
    @pytest.mark.name1
    def test_1(self):
        print('用例1')

    @pytest.mark.name1
    def test_2(self):
        print('用例2')

    @pytest.mark.name1
    @pytest.mark.name2
    def test_3(self):
        print('用例3')

    @pytest.mark.name2
    def test_4(self):
        print('用例4')

3. 筛选标记

通过筛选标记,筛选出需要执行的用例

在终端输入如下命令(可以结合前面的筛选文件):

pytest -m 标记名

也支持逻辑运算

pytest -m "标记1 and 标记2" # 执行包含标记1和标记2的用例
pytest -m "标记1 or 标记2"  # 执行包含标记1或标记2的用例

框架内置标记

特点:

1. 不需要注册,可以直接使用

2. 标记不仅仅用于筛选,还有特殊的效果

常用内置标记:

skip无条件跳过用例
skipif有条件跳过用例
sfail预期用例失败
parametrize参数化测试
class Test_A:
    def test_1(self):
        print('用例1')

    @pytest.mark.skip()
    def test_2(self):
        print('用例2')

    @pytest.mark.xfail(reason='预期失败')
    def test_3(self):
        print('用例3')
        assert 1 == 2

    @pytest.mark.skipif(1 == 2, reason='当1 == 2时用例跳过')
    def test_4(self):
        print('用例4')

参数化执行带参数的用例

1. 在用例中添加参数

2. 再用力中使用参数

3. 给用例添加parametrize注解

        3.1 添加第一个参数:参数名称(与用例参数名相同且对应)

        3.2 添加第二个参数:用例传入参数的数据(有几组数据就意味着这个用例要执行几次,只是参数不同)

        3.3 添加第三个参数(非必填):给每组参数添加用例名称

        如果名称带有中文可以在.ini配置文件中添加如下内容,否则会乱码

# 用例的id可以包含各类字符,并且自负风险
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = true
def add(a, b):
    return a + b

@pytest.mark.parametrize(  # 3. 添加parametreze标记
    'a, b',  # 3.1 第一个参数为参数名称(要与用例参数对应)
    [
        (1, 1),  # 3.2 第二个参数添加用例的参数数据(有几组参数就相当于是几个用例,只是参数不一样)
        (2, 2),
        (3, 3)
    ],
    ids=[
        "1 + 1",  # 3.3 给每组参数添加用例名称(非必填,且使用中文需要添加相应的配置)
        "2 + 2",
        "3 加 3"
    ]
)
def test_add(a, b): # 1. 给用例添加参数
    print(f'执行add的结果为: {add(a, b)}') # 2. 再用例中使用参数

8. 夹具fixture

创建和使用夹具

夹具就是一个带有fixture标记的函数,然后将夹具作为参数传入用例的形参中即可。

如果夹具中正常去写,其所有内容会在用例执行之前执行

@pytest.fixture()
def fixture1(): # 夹具
    print('执行前置代码,用例执行前使用') # 夹具的内容



def test_1(fixture1): # 在用例中使用夹具
    print('执行用例内容')

如果想在前后都执行部分夹具的代码,也需要加上yield关键字

@pytest.fixture()
def fixture1():
    print('执行前置代码,用例执行前使用')
    
    # yield之前的代码会在用例执行前执行
    yield  
    # yield之后的代码会在用例执行后执行
    
    print('执行后置代码,用例执行后使用')



def test_1(fixture1):
    print('执行用例内容')

夹具的返回值

夹具可以带有返回值,并且其返回值可以在用例中使用

@pytest.fixture()
def fixture1():
    print('执行前置代码,用例执行前使用')

    # yield之前的代码会在用例执行前执行
    yield 5
    # yield之后的代码会在用例执行后执行

    print('执行后置代码,用例执行后使用')



def test_1(fixture1):
    print(f'输出夹具返回值:{fixture1}')

夹具的作用域

function每个用例直接不共享fixture的返回值(默认)
class每个类中的用例共享fixture的返回值
module每个文件中的用例共享fixture的返回值
package每个目录中的用例共享fixture的返回值
session全部用例共享fixture的返回值

下面以class和function作用域举例

注意:一个用例可以添加多个夹具,使用逗号分隔

@pytest.fixture(scope='class')
def fixture2():
    print('class作用域下,执行夹具前置代码')

    yield []  # 返回一个空列表,让用例之间传递数据

    print('class作用域下,执行夹具后置代码')


@pytest.fixture()
def fixture3():
    print('function作用域下,执行夹具前置代码')

    yield

    print('function作用域下,执行夹具后置代码')


# Test_A中的用例共享同一个 fixture2 夹具的返回值
class Test_A:
    def test_1(self, fixture2, fixture3):
        fixture2.append('A-test_1')
        print(fixture2)

    def test_2(self, fixture2, fixture3):
        fixture2.append('A-test_2')
        print(fixture2)

    def test_3(self, fixture2, fixture3):
        fixture2.append('A-test_3')
        print(fixture2)


# Test_B中的用例共享同一个 fixture2 夹具的返回值
class Test_B:
    def test_1(self, fixture2, fixture3):  # 一个用例可以添加多个夹具,用 逗号 分隔
        fixture2.append('B-test_1')
        print(fixture2)

    def test_2(self, fixture2, fixture3):
        fixture2.append('B-test_2')
        print(fixture2)

    def test_3(self, fixture2, fixture3):
        fixture2.append('B-test_3')
        print(fixture2)

在结果中可以看到function作用域的夹具对每个用例都执行了一次

class作用域的夹具对类在执行用例的前后执行了一次,并且夹具的返回值对类中的用例共享

conftest.py文件

上面提到的夹具作用域中的session作用域虽然为作用在全局,但是它的返回值无法在目录之间进行传递,如果想要在目录之间传递fixture的返回值就需要使用conftest.py文件

特点:

1. conftest.py中可以添加夹具,并且conftest.py中夹具的返回值可以在全局使用

2. 每个目录中都可以一个创建conftest.py文件

3. 如果在多个conftest.py文件中有同名的fixture,其优先级为:

        (1)优先调用文件中的fixture

        (2)其次调用当前目录下conftest.py中的fiture

        (3)最后从上级目录下conftest.py中的fixture

之后同理

举例:

有一个如下层级结构

chrome目录和firefox目录中的conftest.py都有一个名为f的夹具,夹具只有里面的打印内容不同

chrome目录下的conftest.py:

import pytest


@pytest.fixture
def f():
    return 'chrome'

firefox目录下的conftest.py:

import pytest


@pytest.fixture
def f():
    return 'firefox'

chrome目录下的test_chrome.py中和firefox目录下的test_firefox.py中的用例,内容相同且都使用了一个名为f的fixture

def test_1(f):
    print(f)

现在执行这两个目录下的用例

可以看到不同目录下的用例会优先执行,其目录中conftest.py文件的fixture

现在将结构设计成如下:

此时再运行:

内容一致

9. pytest中的断言

pytest中是直接调用python中的断言

python中断言使用如下:

除了断言内容的真假,还可以添加断言的错误提示,如果断言失败则会打印,成功则不会打印

assert 1 == 1
assert 1 == 2, '错误提示'
  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pytest框架是一个Python自动化测试框架,它已经成为Python系自动化测试必学必备的一个框架。如果你已经掌握了基本Python基础,那么学习和搭建Pytest框架将会很有帮助。在搭建Pytest框架时,你可以参考以下步骤: 1. 首先,确保你已经安装了Pytest框架。你可以使用pip命令来安装Pytest,例如:`pip install pytest` 2. 创建一个测试目录,用于存放测试用例和相关文件。 3. 在测试目录中创建一个`conftest.py`文件,这个文件用于存放一些框架的配置和共享的fixture。 4. 在测试目录中创建测试用例文件,用于编写测试用例。测试用例文件的命名应该以`test_`开头,例如`test_example.py`。 5. 在测试用例文件中,使用`@pytest.fixture()`装饰器来定义fixture,fixture可以用于在测试用例之前或之后执行一些操作,例如准备测试数据或清理测试环境。 6. 编写测试用例,使用`def test_`开头的函数来定义测试用例。在测试用例中,可以使用Pytest提供的丰富的断言方法来验证测试结果。 7. 运行测试用例。你可以在终端窗口中进入到测试目录下,使用`pytest`命令来运行所有的测试用例。你也可以使用`pytest -m`命令来运行指定标签的测试用例,或者使用`pytest -s`命令来打印详细的运行信息。此外,你还可以使用`pytest --html`命令来生成HTML格式的测试报告,或者使用Allure来生成更加详细和美观的测试报告。 总结起来,搭建Pytest框架的步骤包括安装Pytest、创建测试目录、编写`conftest.py`文件和测试用例文件、定义fixture和编写测试用例、运行测试用例。希望这些步骤对你搭建Pytest框架有所帮助。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [pytest接口自动化测试框架搭建](https://blog.csdn.net/Yanan990830/article/details/123285116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦不止~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值