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作用域的夹具对类在执行用例的前后执行了一次,并且夹具的返回值对类中的用例共享

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

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

相关文章

基于springboot网吧管理系统源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

Zygote的启动流程

在zygote进程对应的文件是app_main.cpp文件,在app_main.cpp文件的main()方法中先解析了init.rc中配置的参数并根据配置的参数设置zygote的状态。 在状态设置阶段主要做了: 设置进程名称为zygote通过startSystemServer true标示启动的是systemServer调…

6.s081 学习实验记录(三)system calls

文章目录 一、use gdb二、syscall:trace注意:实验代码:实验结果: 三、sysinfotips:实验代码实验结果 需要切换到 syscall 分支 一、use gdb 学习使用 gdb 调试 make qemu-gdb打开一个新的终端: gdb-mult…

换个思路快速上手UML和plantUML——时序图

上一章我们介绍了类图,我们很清楚,类图是从更加宏观的角度去梳理系统结构的,从类图中我们可以获取到类与类之间:继承,实现等关系信息,是宏观逻辑。下面我们继续换一个思路:作为一名软件工程结构…

【周赛】第382场周赛

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 从这一场(第382场周赛)周赛开始记录,目标是尽快达到准确快速AC前三道题,每场比赛…

贝莱德里程碑

作者:秦晋 见证奇迹的时刻。 1月27日,全球资产管理巨头贝莱德在美国证监会于1月10日审批通过比特币ETF的17天内,其比特币现货ETF资产管理规模已经突破20亿美元。持有比特币总数已达49952个。领跑其他9只比特币ETF机构参与者。不包括灰度GBTC&…

【JavaScript 漫游】专栏介绍

专栏介绍 本专栏旨在记录 JavaScript 核心语法,作为笔者日常学习和工作中的参考手册和代码示例仓库。 内容上力求覆盖 ES5、DOM、BOM 和 ES6 规范的所有内容。对于常用且重要的知识点,应该详细描述并附带有大量的代码示例。对于在工作场景中很少用到的…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 (1)查找元素是否存在 (2)查找最小元素 (3)查找最大元素 5.二分搜索…

算法39:统计全 1 子矩形(力扣1504)----单调栈

题目: 给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat [[1,0,1],[1,1,0],[1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩…

(2024|ICLR,MAD,真实数据与合成数据,自吞噬循环)自消耗生成模型变得疯狂

Self-Consuming Generative Models Go MAD 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 自吞噬生成模型 2.1 自吞噬过程 2.2 自吞噬过程的变体 2.3 自吞噬循环中的偏…

Advanced EFS Data Recovery:恢复 Windows NTFS 中 EFS 加密文件

Advanced EFS Data Recovery 数据恢复软件可以破解 NTFS 加密,并解密受 Windows 加密文件系统 (EFS) 保护的文件。 Advanced EFS Data Recovery 功能列表 通过破解加密文件系统 (EFS) 来解除 NTFS 加密 解密转移到另…

Java面试题(11)

59.说一说springMVC的运行流程 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获; 2. DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,…

STM32 E18-D80NK红外避障传感器

E18-D80NK-N是一款红外光电传感器,它同时具备发射和接收功能。通过对发射光进行调制后发出,并通过接收头对反射光进行解调输出。 E18-D80NK-N采用了透镜来增强传感器的性能,使其能够检测更远的距离。根据红外光的特性,不同颜色的…

VitePress-04-文档中的表情符号的使用

说明 vitepress 的文档中是支持使用表情符号的,像 😂 等常用的表情都是支持的。 本文就来介绍它的使用方式。 使用语法 语法 : :表情名称: 例如 : :joy: 😂 使用案例代码 # 体会【表情】的基本使用 > hello world …

22.Lambda 表达式

Lambda 表达式 1. 概况2. 函数式接口3. 格式3.1 完整格式3.2 省略格式 4. 代码示例5. 输出结果6. 注意事项 学习Lambda表达式之前最好先学会 匿名内部类 具体信息请查看 API 帮助文档 1. 概况 Lambda 表达式是一种在编程中用来表示匿名函数的简洁语法。它是基于函数式编程风格…

2024.1.27每日一题

LeetCode 最大合金数 2861. 最大合金数 - 力扣(LeetCode) 题目描述 假设你是一家合金制造公司的老板,你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用,并且你可以使用 k 台机器来制造合金。每台机器都需…

SpringBoot之JWT登录

JWT JSON Web Token(JSON Web令牌) 是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…

嵌入式学习第十三天

9.指针: (1)const指针 const 关键字 常量(只读) 1.const int *p; 2.int const *p; 1和2是等价的 const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值 3.int *const p; const修饰 p,指针变量p的值不能改变…

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意: 如果搭建在个人服务器或者内网中,需要做内网穿透,可以看这篇博客: 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次,点赞8次,收藏8次。真的很详细https://blog.csd…

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…