pytest教程-7-用例前后置方法

news2024/11/20 6:27:27

上一小节,我们学习了pytest跳过测试用例的方法,本小节我们讲解一下pytest用例的前后置方法。

在unittest中就有前置setup和后置teardown来处理测试用例执行前的准备工作(浏览器驱动实例化,数据库连接等)以及执行后的处理工作(清理数据,关闭浏览器驱动,关闭数据库连接等),那么pytest同样也提供了前置后置的方法来满足这个需求。

pytest提供了以下5个前置后置方法:

  • setup_module、teardown_module(模块级别):整个py文件,测试用例执行前后只执行一次
  • setup_class、teardown_class:(类级别):整个测试类中,测试用例执行前后只执行一次
  • setup、teardown(函数级别):每条用例执行前后都会执行一次,既可以作用于类中测试函数,也可以作用于类外测试函数
  • setup_method、teardown_method(方法级别):每条用例执行前后都会执行一次,只作用于类中测试函数
  • setup_function、teardown_function(函数级别):每条用例执行前后都会执行一次,只作用于类外测试函数使用

1、setup_module、teardown_module(模块级别)示例

#test_demo.py

import pytest


class Test_04:
    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


def test_03():
    print('类外用例03执行')


def setup_module():
    print('\n我是setup_module前置执行\n')


def teardown_module():
    print('\n我是teardown_module后置执行')


def test_04():
    print('类外用例04执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:整个py文件,测试用例执行前后只执行了一次

Launching pytest with arguments D:\PycharmProjects\Source_Code\pytest_demo\test_demo.py --no-header --no-summary -q in D:\PycharmProjects\Source_Code\pytest_demo

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 
我是setup_module前置执行

PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

test_demo.py::test_03 PASSED                                             [ 75%]类外用例03执行

test_demo.py::test_04 PASSED                                             [100%]类外用例04执行

我是teardown_module后置执行


============================== 4 passed in 0.03s ==============================

2、setup_class、teardown_class:(类级别)示例

import pytest


class Test_04:
    def test_01(self):
        print('用例01执行')

    def setup_class(self):
        print('\n我是setup_class前置执行\n')

    def teardown_class(self):
        print('\n我是teardown_class后置执行')

    def test_02(self):
        print('用例02执行')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:整个测试类中,测试用例执行前后只执行了一次

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 
我是setup_class前置执行

PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

我是teardown_class后置执行

test_demo.py::test_03 PASSED                                             [ 75%]类外用例03执行

test_demo.py::test_04 PASSED                                             [100%]类外用例04执行


============================== 4 passed in 0.02s ==============================

3.1、setup、teardown(函数级别) 作用于类中测试函数 示例

import pytest


class Test_04:
    def setup(self):
        print('\nsetup前置执行\n')

    def teardown(self):
        print('\nteardown后置执行\n')

    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:每条用例执行前后都会执行一次,既可以作用于类中测试函数

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup前置执行

PASSED                                    [ 50%]用例01执行

teardown后置执行


test_demo.py::Test_04::test_02 
setup前置执行

PASSED                                    [100%]用例02执行

teardown后置执行



======================== 2 passed, 4 warnings in 0.03s ========================

3.2、setup、teardown(函数级别) 作用于类外测试函数 示例

import pytest


def setup():
    print('\n类外setup前置执行\n')


def teardown():
    print('\n类外teardown后置执行\n')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:每条用例执行前后都会执行一次,也可以作用于类外测试函数


test_demo.py::test_03 
类外setup前置执行

PASSED                                             [ 50%]类外用例03执行

类外teardown后置执行


test_demo.py::test_04 
类外setup前置执行

PASSED                                             [100%]类外用例04执行

类外teardown后置执行



============================== 2 passed in 0.03s ==============================

4、setup_method、teardown_method(方法级别)示例

import pytest


class Test_04:
    def setup_method(self):
        print('\nsetup_method前置执行\n')

    def teardown_method(self):
        print('\nteardown_method后置执行\n')

    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:每条用例执行前后都会执行一次,只作用于类中测试函数

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup_method前置执行

PASSED                                    [ 50%]用例01执行

teardown_method后置执行


test_demo.py::Test_04::test_02 
setup_method前置执行

PASSED                                    [100%]用例02执行

teardown_method后置执行



============================== 2 passed in 0.02s ==============================

5、setup_function、teardown_function(函数级别)示例

import pytest

class Test_04:
    def test_01(self):
        print('用例01执行')
    def test_02(self):
        print('用例02执行')

def setup_function():
    print('\nsetup_function前置执行\n')
def teardown_function():
    print('\nteardown_function后置执行\n')

def test_03():
    print('类外用例03执行')
def test_04():
    print('类外用例04执行')

if __name__ == '__main__':
    pytest.main()

运行结果如下:每条用例执行前后都会执行一次,只作用于类外测试函数使用

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

test_demo.py::test_03 
setup_function前置执行

PASSED                                             [ 75%]类外用例03执行

teardown_function后置执行


test_demo.py::test_04 
setup_function前置执行

PASSED                                             [100%]类外用例04执行

teardown_function后置执行



============================== 4 passed in 0.03s ==============================

前、后置执行顺序

1、测试类中前、后置执行顺序 示例

import pytest

class Test_04:
    def setup(self):
        print('setup前置执行')
    def teardown(self):
        print('teardown后置执行')
    def setup_class(self):
        print('\nsetup_class前置执行\n')
    def teardown_class(self):
        print('\nteardown_class后置执行\n')
    def setup_method(self):
        print('setup_method前置执行')
    def teardown_method(self):
        print('teardown_method后置执行')

    def test_01(self):
        print('用例01执行')
    def test_02(self):
        print('用例02执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup_class前置执行

setup_method前置执行
PASSED                                    [ 50%]用例01执行
teardown_method后置执行

test_demo.py::Test_04::test_02 setup_method前置执行
PASSED                                    [100%]用例02执行
teardown_method后置执行

teardown_class后置执行



============================== 2 passed in 0.02s ==============================

2、测试类外前、后置执行顺序 示例

import pytest


def setup():
    print('类外setup前置执行')


def teardown():
    print('类外teardown后置执行')


def setup_function():
    print('\nsetup_function前置执行\n')


def teardown_function():
    print('\nteardown_function后置执行\n')


def setup_module():
    print('\nsetup_module前置执行\n')


def teardown_module():
    print('teardown_module后置执行')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


if __name__ == '__main__':
    pytest.main()

运行结果如下:前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)
 

test_demo.py::test_03 
setup_module前置执行


setup_function前置执行

类外setup前置执行
PASSED                                             [ 50%]类外用例03执行
类外teardown后置执行

teardown_function后置执行


test_demo.py::test_04 
setup_function前置执行

类外setup前置执行
PASSED                                             [100%]类外用例04执行
类外teardown后置执行

teardown_function后置执行

teardown_module后置执行


============================== 2 passed in 0.02s ==============================

总结:

1、测试类中:setup_class、teardown_class

setup_method、teardown_method

测试类外:setup_function、teardown_function

setup_module、teardown_module

测试类中、类外均可:setup、teardown

2、执行顺序:

类中前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)

类外前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)


最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之位图与布隆过滤器

数据结构之位图与布隆过滤器 文章目录 数据结构之位图与布隆过滤器一、位图1、位图概念2、位图的实现3、位图的应用 二、布隆过滤器1、布隆过滤器的提出2、布隆过滤器概念3、布隆过滤器的插入4、布隆过滤器的查找5、布隆过滤器删除6、布隆过滤器优点7、布隆过滤器缺陷8、布隆过…

Vulnhub-dc6

信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-25 14:39 CST Nmap scan report for 192.168.1.1 Host is up (0.00075s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.1.2…

总结红包雨项目的所有代码,包括添加图片,分享按钮,红包雨,用户是否有抽奖逻辑判断

整体实现效果: 需要用的图片: html: <body><div id"app"><!-- <div class"share-box"><img src"./share_box.png" alt"share-button"></div> --><!-- img图片 --><div class"gif-…

必应聊天在当前安全搜索设置下不可用

使用Bing必应搜索引擎&#xff0c;想用必应AI聊天功能会提示&#xff1a;必应聊天在当前安全搜索设置下不可用。 当安全搜索设置设置为“严格”时&#xff0c;不支持必应聊天。 那么怎么修改安全搜索设置呢&#xff1f; 点击右上角的菜单图标&#xff0c;在下拉菜单里点击安全…

【Qt】跨平台UI布局,以Windows + Android安卓为例

文章目录 使用Qt Designer直接拖放Label结合Horizontal Layout Horizontal Spacer 使用纯代码如何改用纯代码方式布局为不同平台设置不同文字 Qt适合跨平台开发&#xff0c;但跨平台时如何实现UI布局这种基础只是都鲜有人提及。当然也有可能是太基础&#xff0c;大家觉得没有提…

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道&#xff0c;信号保存以后&#xff0c;会在合适的时候进行处理这个信号。 那么信号是如何被处理的&#xff1f;什么时候进行处理呢&#xff1f; 当我们的进程从内核…

数据结构三:线性表之单链表(带头结点单向)的设计与实现

线性表的链式存储结构正是所谓的单链表&#xff0c;何谓单链表&#xff1f;通过地址将每一个数据元素串起来&#xff0c;进行使用&#xff0c;这可以弥补顺序表在进行任意位置的插入和删除需要进行大量的数据元素移动的缺点&#xff0c;只需要修改指针的指向即可&#xff1b;单…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

扭蛋机小程序开发:探索用户体验与商业价值的融合

一、引言 随着移动互联网的快速发展&#xff0c;小程序作为一种新型的应用形态&#xff0c;正逐渐改变着人们的生活方式。扭蛋机小程序便是其中一例&#xff0c;它结合了线上线下的互动体验&#xff0c;为用户带来了全新的娱乐方式。本文将探讨扭蛋机小程序的开发过程&#xf…

遇到字符串拼接用它就对啦!什么你居然不知道Java中对象作为方法参数和基本数据类型作为参数的区别?有巨坑!

今天刷代码随想录&#xff0c;在使用字符串拼接时&#xff0c;发现String类确实比StringBuilder慢了不是&#xff0c;总结了StringBuilder类&#xff08;详见下面文章内容&#xff0c;点击可跳转&#xff09;&#xff0c;还有在做后两题时&#xff0c;发现了Java中集合作为参数…

二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

理论 写链表之类的真的很痛苦&#xff0c;赶紧跳到回溯&#xff01;这次我想结合算法设计这本书&#xff0c;把java版写出来。放在第三部分吧。希望能够在研一完成这项工作&#xff01; 从一刷总结以下的几个要点&#xff1a; 回溯方法模板性非常强&#xff01;&#xff01;可…

redis报错:WRONGTYPE Operation against a key holding the wrong kind of value

这个是在redis存取的数据时&#xff0c;存数据时的数据类型和取数据时的数据类型不一致导致的 原因分析 首先需要明白的是&#xff0c;出现这种错误的原因是因为我们在取值的时候&#xff0c;使用的命令不对&#xff0c;比如你用获取string类型的get命令去取列表list类…

前端工程化之上cdn

一、cdn介绍 cdn的使用还是和前端打包相关&#xff0c;我们都希望前端最后的打包页面越小越好。那么可不可以把一些包不pack进去&#xff0c;让用户的流浪器自行下载呢&#xff1f;答案是可以的&#xff0c;那这些包就会被托管到分发站点上&#xff0c;就是在全国都有服务器&a…

Vue3探索编辑部——关于Pinia(1)

目录 什么是Pinia&#xff1f; Vue3中的Pinia 创建项目 数据准备和引入Pinia 使用Pinia 采用action修改数据 总结 什么是Pinia&#xff1f; Pinia是Vue3的专属的状态管理工具&#xff0c;什么是状态呢&#xff1f;其实我们可以把状态理解为数据&#xff0c;或者一个业务…

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …

Linux:命名管道及其实现原理

文章目录 命名管道指令级命名管道代码级命名管道 本篇要引入的内容是命名管道 命名管道 前面的总结中已经搞定了匿名管道&#xff0c;但是匿名管道有一个很严重的问题&#xff0c;它只允许具有血缘关系的进程进行通信&#xff0c;那如果是两个不相关的进程进行通信&#xff0…

C#,计算几何,二维贝塞尔拟合曲线(Bézier Curve)参数点的计算代码

Pierre Bzier Bzier 算法用于曲线的拟合与插值。 插值是一个或一组函数计算的数值完全经过给定的点。 拟合是一个或一组函数计算的数值尽量路过给定的点。 这里给出 二维 Bzier 曲线拟合的参数点计算代码。 区别于另外一种读音接近的贝塞耳插值算法&#xff08;Bessels int…

市场复盘总结 20240123

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票&#xff0c;只有10%的时间是可以操作&#xff0c;90%的时候都应该空仓 昨日主题投资 连板进级率 7/1…

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…