p2p网上贷款网站建设方案.docx/中国十大网络销售公司
fixture的作用
1.同unittest的setup和teardown,作为测试前后的初始化设置。
fixture的使用
1.作为前置条件使用
2.fixture的的作用范围
1.作为前置条件使用
@pytest.fixture()
def a():return 3def test_b(a):assert a==3
2.fixture的作用范围
首先实例化更高范围的fixture.默认为scope="function",每个测试函数都会执行一次。
session : 多个.py文件执行时,只调用一次
module: 每一个.py调用一次
class : 每个类调用一次
function: 每个函数调用一次
3.fixture 作为setup/teardown执行
yield 前的在测试之前执行,yield后的在测试完后执行
@pytest.fixture
def a():print("setup")yieldprint("teardown")def test_b(a):print("测试")
4.fixture with
# @pytest.fixture()
# def write_file():
# f = open("myfile.txt","w")
# f.write("hello")
# yield
# f.close()
@pytest.fixture()
def write_file():with open("myfile.txt","w") as f:f.write("hello1")def test_write_file(write_file):print("ceshi")
5. fixture request可以请求测试的上下文
@pytest.fixture(params=[1,3])
def a(request):return request.paramdef test_b(a):assert a in [1,3]
6.fixture 工厂模式
在单个测试中,如果想多次调用该fixture,就可以用工厂模式。fixture的结果返回的不是数据,而是返回生成数据的函数。
@pytest.fixture
def make_customer_record():def _make_customer_record(name):return {"name": name, "orders": []}return _make_customer_recorddef test_customer_records(make_customer_record):customer_1 = make_customer_record("Lisa")customer_2 = make_customer_record("Mike")customer_3 = make_customer_record("Meredith")
7.带参数的fixture
params列表有几个值,测试就会执行几次。例params=[1,2],测试用例会执行2次
@pytest.fixture(params=[0, 1, pytest.param(2, marks=pytest.mark.skip)])
def data_set(request):return request.paramdef test_data(data_set):assert data_set in [0,1]
8. 模块化:在一个fixtrue调用另一个fixture
fixture a可以调用另一个fixture c
@pytest.fixture()
def c():print("c")@pytest.fixture()
def a(c):print("a")def test_b(a):pass
9.通过fixture 对测试用例进行分组
pytest在测试运行期间最大程度地减少了fixture的数量。如果有参数化的fixtrue,那么使用它的所有测试将首先使用一个实例执行,然后在创建下一个fixture实例之前调用终结器。除其他外,这简化了对创建和使用全局状态的应用程序的测试。
@pytest.fixture(scope="module", params=[1, 2])
def input_x(request):print("setup")param = request.paramyield paramprint("teardown")
def test_a(input_x):print("test_a")assert input_x in [1,2]def test_b(input_x):print("test_b")assert input_x in [1,2]if __name__ == '__main__':pytest.main(['-q','fixture_1.py'])
运行结果
fixture_1.py setup
.test_a
.test_b
teardown
setup
.test_a
.test_b
teardown
如上所示,设置scope='module',会将所有调用该fixture的用例都执行一遍,而fixture只执行了一次。
10.使用类、模块、项目中的fixture
userfixtures,可以调用在其他模块定义好的fixture.
@pytest.mark.usefixtures("x")
class TestCase:def test_1(self):print("test_1")def test_2(self):print("test_2")if __name__ == '__main__':pytest.main(['-q','test_2.py'])
a.usefixture,可以添加多个fixture
@pytest.mark.usefixtures("a", "b")
def test():pass
b.可以使用标记机制的通用功能在测试模块级别指定fixture
pytestmark = pytest.mark.usefixtures("a")def test_a():def test_b():
c.可以将项目中所有测试所需的fixture放入ini文件中
#pytest.ini[pytest]
usefixtures = x#test_case.py
@pytest.mark.usefixtures
def test_a():pass
11.自动使用fixture
autouse=True
有时你可能希望自动调用fixture, 而无需显示声明函数参数或usefixtures装饰器。
import pytestclass DB:def __init__(self):self.intransaction = []def begin(self, name):self.intransaction.append(name)def rollback(self):self.intransaction.pop()@pytest.fixture(scope="module")
def db():return DB()class TestClass:@pytest.fixture(autouse=True)def transact(self, request, db):db.begin(request.function.__name__)yielddb.rollback()def test_method1(self, db):assert db.intransaction == ["test_method1"]def test_method2(self, db):assert db.intransaction == ["test_method2"]
类级transact夹具标记有autouse = true ,这意味着该类中的所有测试方法都将使用此夹具,而无需在测试函数签名或类级usefixtures修饰器中声明它。
autouse固定装置遵循scope=关键字参数:如果有autouse固定装置,scope='session'则无论定义在何处,都只能运行一次。scope='class'表示它将每节课运行一次,依此类推。
如果在测试模块中定义了自动使用夹具,则其所有测试功能都会自动使用它。
如果在conftest.py文件中定义了自动使用的固定装置,则其目录下所有测试模块中的所有测试都将调用固定装置。
最后,请谨慎使用:如果您在插件中定义了自动使用夹具,它将在安装该插件的所有项目中的所有测试中调用它。如果固定装置仅在某些设置下(例如在ini文件中)仍然可以工作,则这很有用。这样的全局夹具应始终快速确定它是否应该做任何工作,并避免其他昂贵的导入或计算。
请注意,上面的transact灯具很可能是您希望在项目中不启用的灯具。做到这一点的规范方法是将事务处理定义放入conftest.py文件中,而无需使用autouse:
# content of conftest.py
@pytest.fixture
def transact(request, db):db.begin()yielddb.rollback()
然后例如通过声明需要让TestClass使用它:
@pytest.mark.usefixtures("transact")
class TestClass:def test_method1(self):...
该TestClass中的所有测试方法都将使用事务处理夹具,而模块中的其他测试类或功能将不使用它,除非它们也添加了transact引用。
fixture覆盖
1.对于测试文件夹级别,具有相同名称的fixture可以被覆盖
tests/__init__.pyconftest.py# content of tests/conftest.pyimport pytest@pytest.fixturedef username():return 'username'test_something.py# content of tests/test_something.pydef test_username(username):assert username == 'username'subfolder/__init__.pyconftest.py# content of tests/subfolder/conftest.pyimport pytest@pytest.fixturedef username(username):return 'overridden-' + usernametest_something.py# content of tests/subfolder/test_something.pydef test_username(username):assert username == 'overridden-username'
2.在测试模块中覆盖fixture
tests/__init__.pyconftest.py# content of tests/conftest.pyimport pytest@pytest.fixturedef username():return 'username'test_something.py# content of tests/test_something.pyimport pytest@pytest.fixturedef username(username):return 'overridden-' + usernamedef test_username(username):assert username == 'overridden-username'test_something_else.py# content of tests/test_something_else.pyimport pytest@pytest.fixturedef username(username):return 'overridden-else-' + usernamedef test_username(username):assert username == 'overridden-else-username'
3.在文件内覆盖
tests/__init__.pyconftest.py# content of tests/conftest.pyimport pytest@pytest.fixturedef username():return 'username'@pytest.fixturedef other_username(username):return 'other-' + usernametest_something.py# content of tests/test_something.pyimport pytest@pytest.mark.parametrize('username', ['directly-overridden-username'])def test_username(username):assert username == 'directly-overridden-username'@pytest.mark.parametrize('username', ['directly-overridden-username-other'])def test_username_other(other_username):assert other_username == 'other-directly-overridden-username-other'
4.对于某些测试模块,参数化的夹具被非参数化的版本覆盖,而非参数化的夹具被参数化的版本覆盖。显然,测试文件夹级别也是如此。
tests/__init__.pyconftest.py# content of tests/conftest.pyimport pytest@pytest.fixture(params=['one', 'two', 'three'])def parametrized_username(request):return request.param@pytest.fixturedef non_parametrized_username(request):return 'username'test_something.py# content of tests/test_something.pyimport pytest@pytest.fixturedef parametrized_username():return 'overridden-username'@pytest.fixture(params=['one', 'two', 'three'])def non_parametrized_username(request):return request.paramdef test_username(parametrized_username):assert parametrized_username == 'overridden-username'def test_parametrized_username(non_parametrized_username):assert non_parametrized_username in ['one', 'two', 'three']test_something_else.py# content of tests/test_something_else.pydef test_username(parametrized_username):assert parametrized_username in ['one', 'two', 'three']def test_username(non_parametrized_username):assert non_parametrized_username == 'username'
实用技巧
1.conftest.py 共享fixture。如果定义fixture过多且需要多个地方调用,可将fixture放入conftest.py文件中,使用时不需要导入
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
相关文章:

pytest-fixtured自动化测试详解
fixture的作用 1.同unittest的setup和teardown,作为测试前后的初始化设置。 fixture的使用 1.作为前置条件使用 2.fixture的的作用范围 1.作为前置条件使用 pytest.fixture() def a():return 3def test_b(a):assert a3 2.fixture的作用范围 首先实例化更高范围的fixture…...

计算机网络:应用层(一)
我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》࿱…...

mybatis的快速入门以及spring boot整合mybatis(二)
需要用到的SQL脚本: CREATE TABLE dept (id int unsigned PRIMARY KEY AUTO_INCREMENT COMMENT ID, 主键,name varchar(10) NOT NULL UNIQUE COMMENT 部门名称,create_time datetime DEFAULT NULL COMMENT 创建时间,update_time datetime DEFAULT NULL COMMENT 修改…...

lua基本语法使用
Lua 是一个小巧的脚本语言。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。 1.基本语法 注解 -- 单行 -- [[ ]] -- 多行 …...

Git远程操作
目录 1.远程操作 1.1理解分布式版本控制系统 1.2远程仓库. 1.2.1新建远程仓库 1.2.2克隆远程仓库 1.2.3向远程仓库推送 1.2.4拉取远程仓库 1.3配置Git 1.3.1忽略特殊文件 1.3.2给命令配置别名 2.标签管理 2.1理解标签 2.2创建标签 2.3操作标签 1.远程操作 1.1理…...

链表基础知识(一、单链表)
一、链表表示和实现 顺序表的问题及思考 问题: 1. 中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当…...

mysql的ON DELETE CASCADE 和ON DELETE RESTRICT区别
ON DELETE CASCADE 和 ON DELETE RESTRICT 是 MySQL 中两种不同的外键约束级联操作。它们之间的主要区别在于当主表中的记录被删除时,子表中相关记录的处理方式。 ON DELETE CASCADE: 当在主表中删除一条记录时,所有与之相关的子表中…...

如何快速将图片转为excel?
一、打开金鸣表格文字识别软件。 二、点击添加文件按钮,在打开的窗口中选择目标图片,然后点击“打开”,将图片添加进待识别的列表中。 三、点击提交识别或识别全部。 四、识别完成后点击“打开文件”即可打开识别好的结果文件(EXC…...

元编程(Metaprogramming)
本章将介绍第8️⃣种编程范式---元编程,以及它的优缺点、案例分析和小项目的代码示例。 优点 元编程的优点: 灵活性和可重用性:元编程允许在运行时生成代码,使得程序更加灵活和可重用。可以根据需要动态生成代码片段࿰…...

IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知
一、背景 IEEE TIE作为控制领域的TOP期刊,接收机器人、控制、自动驾驶、仪器和传感等方面的论文,当然范围不止这些,感兴趣的可以自行登录TIE官网查看。所投稿论文必须经过实验验证,偏工程应用类,当然也必须有方法上的…...

Linux--操作系统
1. 常见的操作系统 Windowsmac OSLinuxiOSAndroid 2. 操作系统的定义 操作系统直接运行在计算机上的系统软件, 它是控制硬件和支持软件运行的计算机程序。 3. 操作系统的作用 向下控制硬件向上支持软件的运行,具有承上启下的作用。 4.总结 操作系统…...

HarmonyOS—实现UserDataAbility
UserDataAbility接收其他应用发送的请求,提供外部程序访问的入口,从而实现应用间的数据访问。Data提供了文件存储和数据库存储两组接口供用户使用。 文件存储 开发者需要在Data中重写FileDescriptoropenFile(Uriuri,Stringmode)方法来操作文件…...

Java实现插入排序及其动图演示
插入排序是一种简单直观的排序算法。它的基本思想是将一个待排序的元素插入到已经排序好的序列中的适当位置,从而得到一个新的、元素个数加一的有序序列。 具体的插入排序算法过程如下: 从第一个元素开始,认为第一个元素已经是有序序列。取…...

设计模式——原型模式(创建型)
引言 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。 问题 如果你有一个对象, 并希望生成与其完全相同的一个复制品, 你该如何实现呢? 首先, 你必须新建一个属于…...

深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案
机器视觉技术近年来发展迅速,基于计算机对图像的处理与分析,能够识别和辨别目标物体,被广泛应用于人工智能、智能制造等领域。 机器视觉凭借着高精度、高效率、灵活性和可靠性等优势,不断推进工业企业生产自动化和智能化进程&…...

React setState()的两种书写方法对比
在React中,setState()方法是一个非常重要的函数,用于更新组件的状态。它有两种常见的书写方式:对象解构赋值和使用函数。本文将对比这两种方法,并解释它们的优缺点和适用场景。 首先,让我们来看看对象解构赋值这种方法…...

orb-slam2学习总结
目录 视觉SLAM 1、地图初始化 2、ORB_SLAM地图初始化流程 3、ORB特征提取及匹配 1、对极几何 2、对极约束 (epipolar constraint) 3、基础矩阵F、本质矩阵E 5、单目尺度不确定性 6、单应矩阵(Homography Matrix) 6.1 什么是单应矩…...

通过wireshark判断web漏洞的流量特征
sql注入 定位http协议,通过查找get请求定位到关键字 抓到关键字union select xss 定位get请求的关键字 文件上传 找到对应的上传数据包,追踪tcp流 文件包含、文件读取 查看url找到包含的关键字 在根路径写入一个phpinfo(); 使用../进行目录遍…...

Command ‘npm‘ not found, but can be installed with:sudo apt install npm 解决方案
问题描述 今天在执行 npm install -g npx 报错 Command npm not found, but can be installed with: sudo apt install npm 解决方案 sudo apt-get remove npm sudo apt-get remove nodejs-legacy sudo apt-get remove nodejs sudo rm /usr/bin/node sudo apt-get install …...

【Hadoop_04】HDFS的API操作与读写流程
1、HDFS的API操作1.1 客户端环境准备1.2 API创建文件夹1.3 API上传1.4 API参数的优先级1.5 API文件夹下载1.6 API文件删除1.7 API文件更名和移动1.8 API文件详情和查看1.9 API文件和文件夹判断 2、HDFS的读写流程(面试重点)2.1 HDFS写数据流程2.2 网络拓…...

go-zero开发入门之网关往rpc服务传递数据
go-zero 的网关往 rpc 服务传递数据时,可以使用 headers,但需要注意前缀规则,否则会发现数据传递不过去,或者对方取不到数据。 go-zero 的网关对服务的调用使用了第三方库 grpcurl,入口函数为 InvokeRPC: …...

Word插件-好用的插件-批量插入图片-大珩助手
现有100张图片,需要批量插入word中,并在word中以每页6张图片的形式呈现,请问怎样做? 使用word大珩助手,多媒体-插入图片,根据图片的长宽,选择连续图片、一行2个图或一行3个图,可一次…...

小程序域名SSL证书能用免费的吗?
众所周知,目前小程序要求域名强制使用https协议,否则无法上线。但是对于大多数开发者来说,为每一个小程序都使用上付费的SSL证书,也是一笔不小的支出。那么小程序能使用免费的SSL证书吗? 答案是肯定的。目前市面上可选…...

selenium自动化(中)
显式等待与隐式等待 简介 在实际工作中等待机制可以保证代码的稳定性,保证代码不会受网速、电脑性能等条件的约束。 等待就是当运行代码时,如果页面的渲染速度跟不上代码的运行速度,就需要人为的去限制代码执行的速度。 在做 Web 自动化时…...

uniapp app将base64保存到相册,uniapp app将文件流保存到相册
如果是文件流可以先转base64详情见>uniapp 显示文件流图片-CSDN博客 onDown(){let base64 this.qrcodeUrl ; // base64地址const bitmap new plus.nativeObj.Bitmap("test");bitmap.loadBase64Data(base64, function() {const url "_doc/" new Dat…...

Navicat 技术指引 | 适用于 GaussDB 分布式的服务器对象的创建/设计
Navicat Premium(16.3.3 Windows版或以上)正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构…...

五、HotSpot细节实现
一、并发标记与三色标记 问题:三色标记到底发生在什么阶段,替代了什么。并发标记 1、并发标记( Concurrent Marking) 从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗…...

DRBD分布式存储实验
DRBD DRBD的全称为:Distributed Replicated Block Device (DRBD) 分布式块设备复制 与心跳连接结合使用,构建高可用性(HA)的集群。 实现方式是通过网络来镜像(mirror)整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。DRBD负责接收数据…...

go的结构体作为返回值
结构体有两种方式作为返回值 结构体结构体指针 代码 package mainimport ("fmt" )type SS struct {Name stringAge int }func getInfo() (*SS) {var ac SS{}ac.Age 1return &ac }func getInfo1() (aa *SS) {aa.Age 1return }func getInfo2() (SS) {var ac…...

uniapp的subnvue苹果适配(ios)谷歌地图问题
谷歌地图,google地图,调整宽度。这个适配花了点时间,苹果IOS宽度一直无效失灵,赶紧记录分享,很坑。可能所有的ios的subnvue适配都这样。看了网上很多方法无效,最终找到试出答案。 pages.json的配置宽度无效…...