测试框架pytest教程(11)-pytestAPI

常量

pytest.__version__ #输出pytest版本

 

 

pytest.version_tuple #输出版本的元组形式

 

 

功能

pytest.approx

`pytest.approx` 是一个用于进行数值近似比较的 pytest 断言工具。

在测试中,有时候需要对浮点数或其他具有小数部分的数值进行比较。然而,由于浮点数精度限制,直接使用相等判断可能会导致测试不稳定或失败。这时,就可以使用 `pytest.approx` 工具来进行近似比较。

`pytest.approx` 可以用于比较单个值或列表、字典等数据结构的值。

以下是 `pytest.approx` 的常见用法示例:

```python
import pytest

def test_approx():
    assert 0.1 + 0.2 == pytest.approx(0.3)
    
def test_list_approx():
    assert [0.1, 0.2, 0.3] == pytest.approx([0.1, 0.2, 0.3])
    
def test_dict_approx():
    assert {"a": 0.1, "b": 0.2} == pytest.approx({"a": 0.1, "b": 0.2})
```

在上述示例中,第一个测试用例使用 `pytest.approx(0.3)` 来判断 `0.1 + 0.2` 是否近似于 `0.3`。第二个测试用例使用 `pytest.approx([0.1, 0.2, 0.3])` 来比较两个列表是否近似相等。第三个测试用例使用 `pytest.approx({"a": 0.1, "b": 0.2})` 来比较两个字典是否近似相等。

`pytest.approx` 在进行比较时会考虑到浮点数的精度问题,具有一定的容错性。可以通过设置 `rel` 和 `abs` 参数来调整容忍度。例如 `pytest.approx(0.3, rel=1e-3, abs=1e-5)` 可以设置相对误差不超过 `1e-3`,绝对误差不超过 `1e-5`。

pytest.fail

`pytest.fail` 是一个用于强制测试用例失败的 pytest 断言工具。

在某些情况下,您可能希望在测试中明确主动地使测试用例失败,而不是依赖其他断言条件或业务逻辑来触发失败。

`pytest.fail` 函数可以用于在测试中显式地引发 AssertionError,导致当前测试用例立即失败。

以下是 `pytest.fail` 的示例用法:

```python
import pytest

def test_fail():
    pytest.fail("Test case intentionally fails")
```

在上述示例中,`test_fail` 函数调用 `pytest.fail("Test case intentionally fails")` 来强制使测试用例失败,并提供一个可选的错误信息。

当测试运行到 `pytest.fail` 调用时,将引发 `AssertionError`,并且测试用例会立即失败。测试运行将停止,并且不会执行该用例后续的代码。

`pytest.fail` 函数还支持其他参数,例如 `pytrace=True` 用于显示堆栈跟踪信息,`skip=True` 用于标记测试用例为跳过状态。

请注意,在正常的测试编写中,尽量避免过多使用 `pytest.fail`,它应该被视为一种辅助工具,用于某些特殊场景下的测试目的。

pytest.skip

`pytest.skip` 是一个用于跳过测试用例的 pytest 断言工具。

在某些情况下,您可能希望在测试中主动跳过某些用例,而不是执行它们。`pytest.skip` 函数可以用于在测试运行时标记测试用例为跳过状态,告诉 pytest 不要执行这些用例。

以下是 `pytest.skip` 的示例用法:

```python
import pytest

def test_skip():
    pytest.skip("This test case is skipped intentionally")
```

在上述示例中,`test_skip` 函数调用 `pytest.skip("This test case is skipped intentionally")` 来标记测试用例为跳过状态,并提供一个可选的跳过说明。

当测试运行到 `pytest.skip` 调用时,该用例将被跳过,在测试报告中被标记为跳过状态。测试运行将继续进行,并且不会执行该用例后续的代码。

`pytest.skip` 函数还支持其他参数,例如 `allow_module_level=True` 用于允许跳过整个模块。

请注意,在正常的测试编写中,应该根据测试需要谨慎使用 `pytest.skip`。它通常用于某些特殊场景下,例如在某些条件不满足时跳过某些用例,或者在暂时无法实现某些功能时跳过相关的测试。

pytest.importorskip

`pytest.importorskip` 是一个 pytest 工具,用于在测试中动态导入所需的模块,如果导入失败则跳过测试用例。

有时,测试用例可能依赖于外部模块或库,如果在运行测试用例之前无法导入所需的模块,则这些用例可能会失败。为了避免因为缺少依赖而导致测试用例无法执行,您可以使用 `pytest.importorskip` 来跳过这些用例。

以下是 `pytest.importorskip` 的示例用法:

```python
import pytest

def test_dependency():
    module = pytest.importorskip("module_name")
    # 使用module进行进一步的测试
```

在上述示例中,`test_dependency` 函数使用 `pytest.importorskip` 导入名为 "module_name" 的模块。如果无法导入该模块,则测试用例将被跳过,不会执行后续的代码。

`pytest.importorskip` 函数会尝试导入指定的模块,如果导入失败,则会引发 `pytest.skip` 异常,该异常会被 pytest 捕获,并将相应的测试用例标记为跳过状态。

请注意,`pytest.importorskip` 可以接受其他参数,用于控制导入的行为,例如 `minversion` 参数用于指定要求的最低版本号,`reason` 参数用于提供跳过用例的说明。

无法导入,该条用例跳过 

pytest.xfail

预期用例失败

pytest.exit

`pytest.exit` 函数是 pytest 的一个工具,用于在测试运行期间提前退出测试过程。

在某些情况下,您可能希望在测试执行过程中主动退出,而不继续执行后续的测试用例。`pytest.exit` 函数可以用于在测试运行时提前终止测试过程。

以下是 `pytest.exit` 的示例用法:

```python
import pytest

def test_exit():
    pytest.exit("Testing is interrupted")
```

在上述示例中,`test_exit` 函数调用 `pytest.exit` 来提前终止测试执行,并提供一个可选的退出信息。

当测试运行到 `pytest.exit` 调用时,测试过程将立即终止,当前运行的测试用例将被中断,后续的测试用例将不会执行。同时,测试报告中会记录异常退出信息。

请注意,使用 `pytest.exit` 函数需要小心,并且只应在特殊情况下使用。正常情况下,测试用例应该按照规定的顺序执行,并且尽量避免意外退出测试过程。

pytest.main

执行入口

pytest.param

`pytest.param` 是 pytest 提供的一个装饰器函数,用于给测试参数化过程中的每个参数提供自定义的元数据。

在 pytest 中,参数化是一种技术,用于在执行同一个测试函数时,多次运行该函数,并为每次运行传递不同的参数组合。`pytest.param` 装饰器函数可以为每个参数组合提供自定义的元数据,这些元数据可以在测试报告中提供更多的信息。

以下是 `pytest.param` 的示例用法:

import pytest

@pytest.mark.parametrize("param", [
    pytest.param("good", marks=pytest.mark.first),
    pytest.param("morning", marks=pytest.mark.second)
])
def test_param(param):
    assert len(param) > 0

在上述示例中,`test_param` 函数通过 `@pytest.mark.parametrize` 装饰器实现参数化。`pytest.param` 函数用于为每个参数提供自定义的元数据。在示例中,第一个参数值 "value1" 标记为 `pytest.mark.first`,第二个参数值 "value2" 标记为 `pytest.mark.second`。

通过为每个参数组合提供自定义的元数据,您可以在测试报告中识别和过滤特定的用例,以及运行自定义的处理逻辑,比如添加标记、过滤用例等。

请注意,使用 `pytest.param` 装饰器需要在参数化过程中使用 `@pytest.mark.parametrize` 装饰器进行配合。

pytest.raises

`pytest.raises` 是 pytest 提供的一个上下文管理器,用于检查测试用例中是否引发了指定的异常。

在测试过程中,有时您可能会希望测试某些代码在特定情况下是否会引发预期的异常。`pytest.raises` 上下文管理器可以帮助您捕获和断言这些异常。

以下是 `pytest.raises` 的示例用法:

```python
import pytest

def test_raises():
    with pytest.raises(Exception):
        # 在此处编写可能引发异常的代码
        raise Exception("An error occurred")
```

在上述示例中,`test_raises` 函数使用 `with pytest.raises(Exception):` 语句块来标识捕获异常的范围。在 `with` 代码块中,您可以编写可能引发异常的代码。在示例中,我们手动引发了一个 `Exception` 类型的异常。

当代码块中引发了指定类型的异常时,`pytest.raises` 将捕获该异常,测试将继续进行,并进行后续的断言。如果代码块中没有引发指定类型的异常,`pytest.raises` 将引发一个断言错误,测试将被标记为失败。

通过使用 `pytest.raises`,您可以确保代码在预期情况下引发了异常,并可以对异常进行进一步的检查和断言。

请注意,`pytest.raises` 还支持对异常对象进行断言,例如检查异常的具体信息、属性等。可以通过使用 `as` 关键字来捕获异常对象,并对其进行断言。

fixture

record_property

`record_property` 是 pytest 的一个内置函数,用于在测试运行期间记录自定义的属性。

在测试过程中,您可能希望记录一些额外的信息或元数据,以便于后续分析和报告。`record_property` 函数提供了一种将自定义属性与测试用例关联起来的方法。

以下是 `record_property` 的示例用法:


def test_example(record_property):
    record_property("priority", "high")
    record_property("severity", "medium")

    # 编写测试断言...
    assert 1 + 1 == 2

在上述示例中,`record_property` 函数被用于记录两个自定义的属性:`priority` 和 `severity`。这些属性与测试用例 `test_example` 相关联。

在运行测试时,`record_property` 函数将记录这些属性值,并将其与该测试用例关联。这些属性值将显示在测试报告中,可以帮助您更好地理解和分析测试结果。

通过记录适当的属性,您可以为测试结果提供更多的上下文,例如标记测试的优先级、严重性级别等。这对于组织和分析大规模测试套件非常有用。

`record_property` 函数可以在测试用例的任何位置调用,以记录所需的属性。通常,它在测试用例顶部作为一种常见的做法,以便更容易找到和识别相关属性。

record_testsuite_property

 记录testsuite的属性

def test_foo(record_testsuite_property):
    record_testsuite_property("ARCH", "PPC")
    record_testsuite_property("STORAGE_TYPE", "CEPH")

request

`request` 是 pytest 中的一个固定参数,用于访问测试用例运行时的上下文信息和功能。

在 pytest 的测试用例中,可以通过使用 `request` 参数来获取有关当前测试用例和测试运行环境的信息。`request` 参数是一个固定的 pytest fixture,可以在测试用例函数或其他 fixture 中使用。

以下是一些常见的 `request` 对象的用法:

1. 获取当前测试用例的名称:

def test_example(request):
    test_name = request.node.name
    print(f"Running test: {test_name}")
    # 其他测试断言和操作...

2. 获取当前测试用例的标记信息:

import pytest

@pytest.mark.smoke
def test_example(request):
    marker = request.node.get_closest_marker("smoke")
    if marker:
        print("This test is marked as smoke test")
    # 其他测试断言和操作...

3. 获取测试用例函数的 docstring:

def test_example(request):
    """这是一个test"""
    docstring = request.node.function.__doc__
    print(f"Test function docstring: {docstring}")
    # 其他测试断言和操作...

 

 

4. 访问配置文件中的自定义参数:

def test_example(request):
    my_param = request.config.getoption("--my-param")
    print(f"My custom parameter: {my_param}")
    # 其他测试断言和操作...

通过使用 `request` 对象,您可以在测试用例运行时获得更多的上下文信息,并根据需要执行各种操作,例如获取标记、访问配置等。

对象

Item

在 pytest 中,`Item` 类代表着一个测试项目,可以是一个测试用例、一个测试集合或一个测试模块。`Item` 类是 pytest 框架中的一个重要概念,用于管理和操作测试项目的相关信息和行为。

`Item` 类的实例包含了诸如测试项目的名称、位置、标记、参数、测试路径等信息。它也提供了一组方法和属性,用于操作和访问测试项目的各个方面。

以下是 `Item` 类的一些常见方法和属性:

1. `name` - 返回测试项目的名称。

```python
def test_example(item):
    print(f"Test name: {item.name}")
```

2. `nodeid` - 返回测试项目的唯一标识符。

```python
def test_example(item):
    print(f"Node ID: {item.nodeid}")
```

3. `get_closest_marker(name)` - 返回最接近的标记对象。

```python
import pytest

@pytest.mark.smoke
def test_example(item):
    marker = item.get_closest_marker("smoke")
    if marker:
        print("This test is marked as smoke test")
```

4. `get_marker(name)` - 返回与指定名称匹配的第一个标记对象。

```python
import pytest

@pytest.mark.slow
@pytest.mark.smoke
def test_example(item):
    marker = item.get_marker("smoke")
    if marker:
        print("This test is marked as smoke test")
```

5. `keywords` - 返回测试项目的关键字。

```python
def test_example(item):
    print(f"Test keywords: {item.keywords}")
```

`Item` 类还提供了其他一些方法和属性,用于获取和操作测试项目的参数、位置、路径以及与测试框架相关的信息。

config

在 pytest 中,`Config` 类是一个重要的概念,它代表了 pytest 的配置对象。`Config` 类提供了访问和配置 pytest 运行时的各种选项和参数的方法和属性。

`Config` 对象可以通过在自定义的 pytest 插件中使用 `pytest_configure(config)` 钩子函数中的 `config` 参数来获取。

下面是 `Config` 类的一些常见方法和属性:

1. `getoption(name)` - 获取命令行选项或配置文件中的选项的值。

def pytest_configure(config):
    my_option = config.getoption("--my-option")
    print(f"My option value: {my_option}")

2. `addinivalue_line(name, value)` - 在配置文件中添加一行配置。

def pytest_configure(config):
    config.addinivalue_line("markers", "smoke: mark a test as a smoke test.")

3. `getini(name)` - 获取配置文件中的值。

def pytest_configure(config):
    my_value = config.getini("my_option")
    print(f"My value from config file: {my_value}")

4. `getoption(name, default=None)` - 获取命令行选项或配置文件中的选项的值,如果不存在则返回指定的默认值。

def pytest_configure(config):
    my_option = config.getoption("--my-option", default="default_value")
    print(f"My option value: {my_option}")

除了上述示例外,`Config` 类还提供了许多其他有用的方法和属性,用于访问和配置 pytest 的各种选项和功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/86713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux面试笔试题(6)

91、6块300G的硬盘做raid5,新的设备容量是多大(C) A 900G B 1800G C 1500G D 300G 6300G−300G 1500G 由于一块硬盘用于奇偶校验,所以设备容量将是1500G. Raid 5是一种磁盘阵列,将数据分散到多个硬盘上以提高性能和可…

【⑬MySQL | 数据类型(一)】简介 | 整数 | 浮点 | 定点类型

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据类型简介 | 整数 | 浮点 | 定点类型的分享✨ 目录 前言0.数据类型简介1 整数类型2 浮点类型3 定点类型4 日期/时间类型总结 0.数据类型简介 数据类型(data_type)是指系统中所允许的…

LeetCode算法递归类—二叉树中的最大路径和

目录 124. 二叉树中的最大路径和 - 力扣(LeetCode) 题解: 代码: 运行结果: 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该…

【图论】拓扑排序

一.定义 拓扑排序是一种对有向无环图(DAG)进行排序的算法,使得图中的每个顶点在排序中都位于其依赖的顶点之后。它通常用于表示一些任务之间的依赖关系,例如在一个项目中,某些任务必须在其他任务之前完成。 拓扑排序的…

SQL注入之延时注入

文章目录 延时注入是什么?延时注入获取数据库版本号 延时注入是什么? 延时注入就是利用sleep()函数通过if语句判断所写的语句真假,如果为真返回我们想要的东西(例如:数据库的长度,数据库的名字等&#xff0…

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 (1)轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务&…

达梦数据库读写分离集群原理

概述 本文就达梦数据库读写分离原理进行介绍。 达梦读写分离集群特点: 可以配置8个即时备库或8个实时备库;读写操作自动分离、负载均衡;提供数据同步;备库故障自动处理,故障恢复自动数据同步等功能,也支持…

无涯教程-TensorFlow - Keras

Keras易于学习的高级Python库,可在TensorFlow框架上运行,它的重点是理解深度学习技术,如为神经网络创建层,以维护形状和数学细节的概念。框架的创建可以分为以下两种类型- 顺序API功能API 无涯教程将使用Jupyter Notebook执行和…

会计如何使用ChatGPT提高工作效率

文章目录 ChatGPT改变了会计行业微软重新定义了PC交互应对ChatGPT带来的冲击给财务人员的建议总结 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社…

LInux之例行工作

目录 场景 单一执行例行任务 --- at(一次性) 安装 命令详解 语法格式 参数及作用 时间格式 案例 at命令执行过程分析 循环执行的例行性任务--crontab(周期性) crontd服务安装 linux 任务调度的工分类 crontab工作过程…

js案例:小球碰壁反弹

目录 一.效果预览图​编辑 解析 二.完整代码 代码讲解 html部分 js部分 一.效果预览图 解析 这个效果是为了以后(过段时间会发的一个小游戏)做js小游戏做准备的,基本结构是,定义两个div盒子,小盒子设置成圆球形状…

代码pytorch-adda-master跑通记录

前言 最近在学习迁移学习,ADDA算法,由于嫌自己写麻烦,准备先跑通别人的代码。 代码名称:pytorch-adda-master 博客:https://www.cnblogs.com/BlairGrowing/p/17020378.html github地址:https://github.com…

关于Springboot项目打包的配置问题

一、打包方式的不同致使jar包运行性能及docker部署的效率问题 1.1方式一 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source&…

Flash 空间大小的选择以及8MB和8M bit单位与转换关系

他V hezkz17进数字音频系统研究开发交流答疑群(课题组) log打印 [09:54:27.565] FLASH_SIZE0x800000 这个是 8MB 字节 芯片手册Flash是以字节为单位 注意单位与转换关系 ifeq ($(FLASH_SIZE),0x100000) # 8M bits LOG_DUMP_SECTION_SIZE ? 0x10000 endif 0x1000001MB为 …

C# 观察者模式

一、概述 观察者模式是一种常用的设计模式&#xff0c;它属于行为型模式。在C#中&#xff0c;观察者模式通过定义一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合&#xff0c;…

精密图纸被窃,知名手表品牌Seiko遭BlackCat勒索软件攻击

据BleepingComputer消息&#xff0c;日本著名手表制造商Seiko在7月末遭到了网络攻击&#xff0c;8月21日&#xff0c;BlackCat&#xff08;又名ALPHV&#xff09;勒索软件组织在其网站上宣布对这起攻击事件负责。 8 月 10 日&#xff0c;Seiko发布了一份数据泄露通知&#xff0…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

【雷达】接收和去噪L波段雷达接收到的信号研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

单链表的多语言表达:C++、Java、Python、Go、Rust

单链表 是一种链式数据结构&#xff0c;由一个头节点和一些指向下一个节点的指针组成。每个节点包含一个数据元素和指向下一个节点的指针。头节点没有数据&#xff0c;只用于表示链表的开始位置。 单链表的主要操作包括&#xff1a; 添加元素&#xff1a;在链表的头部添加新…