- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章pytest进阶教程之fixture函数详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
与python自带的unitest测试框架中的setup、teardown类似,pytest提供了fixture函数用以在测试执行前和执行后进行必要的准备和清理工作。但是相对来说又比setup、teardown好用.
通过将fixture声明为参数名,测试用例函数可以请求fixture。fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 定义的夹具函数,使用装饰器pytest.fixture
@pytest
.fixture
def
my_fruit():
print
(
"login:用户执行登录操作"
)
# 使用夹具函数的测试用例
def
test_my_fruit_in_basket(my_fruit):
print
(
"hello world"
)
if
__name__
=
=
'__main__'
:
pytest.main([
'test_login.py::test_my_fruit_in_basket'
,
'-s'
])
#执行结果:
collected
1
item
test_login.py login:
用户执行登录操作
hello world
.
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
1
passed
in
0.02s
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
|
Fixture名字作为测试用例的参数 。
可以直接使用fixture名称作为输入参数(是个典型的高阶函数),在这种情况下,fixture函数返回的fixture实例将被注入,最终在测试用例执行前执行这个装饰过的函数。如下列代码,①将返回值传递给测试用例,②通过函数入参方式,可以传入多个fixture函数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
pytest
@pytest
.fixture
def
first_entry():
return
"a"
@pytest
.fixture
def
order(first_entry):
return
[first_entry]
def
test_string(order):
order.append(
"b"
)
assert
order
=
=
[
"a"
,
"b"
],
"断言执行失败"
if
__name__
=
=
'__main__'
:
pytest.main([
'test_login.py::test_string'
,
'-s'
])
|
使用@pytest.mark.usefixtures('fixture')装饰器 。
每个函数或者类前使用@pytest.mark.usefixtures('fixture')装饰器进行装饰.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import
pytest
@pytest
.fixture
def
my_fruit():
print
(
"login:用户执行登录操作"
)
# 被夹具函数装饰的测试用例
@pytest
.mark.usefixtures(
"my_fruit"
)
def
test_my_fruit_in_basket():
print
(
"hello world"
)
if
__name__
=
=
'__main__'
:
pytest.main([
'test_login.py'
,
'-s'
,
'-q'
])
# 执行结果
login:用户执行登录操作
hello world
.
1
passed
in
0.01s
|
使用autouse参数 。
指定fixture的参数autouse=True这样模块内的每个测试用例会自动调用fixture.
1
2
3
4
5
6
7
8
9
10
11
12
|
import
pytest
@pytest
.fixture(autouse
=
True
)
def
my_fruit():
print
(
"login:用户执行登录操作"
)
# 被夹具函数装饰的测试用例
def
test_my_fruit_in_basket():
print
(
"hello world"
)
if
__name__
=
=
'__main__'
:
pytest.main([
'test_login.py'
,
'-s'
,
'-q'
])
|
备注: 如果fixture有返回值,那么usefixture以及autouse就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。 因此最常用的是通过参数传递的方法.
Fixture中的scope的参数,控制Fixture函数的作用范围 。
scope = ‘function' 测试函数维度,默认范围,则在测试结束时销毁fixture.
scope = ‘class' 测试类维度,在class中最后一次测试的拆卸过程中,夹具被破坏.
scope = ‘module' 测试文件维度,在模块中最后一次测试的拆卸过程中,夹具被破坏.
scope = ‘session' 测试会话维度,夹具在测试会话结束时被销毁.
fixture函数的返回值:return 和 yield 和 addfinalizer终结函数 。
return:
通过下面的代码,我们已经发现可以通过测试用例函数传入参数的形式,直接使用fixture函数的返回值,这个相对来说比较简单.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
pytest
@pytest
.fixture
def
first_entry():
return
"a"
@pytest
.fixture
def
order(first_entry):
return
[first_entry]
def
test_string(order):
order.append(
"b"
)
assert
order
=
=
[
"a"
,
"b"
],
"断言执行失败"
if
__name__
=
=
'__main__'
:
pytest.main([
'test_login.py::test_string'
,
'-s'
])
|
yield:
yeild也是一种函数的返回值类型,是函数上下文管理器,使用yield被调fixture函数执行遇到yield会停止执行,接着执行调用的函数,调用的函数执行完后会继续执行fixture函数yield关键后面的代码。因此利用fixture函数,我们可以说pytest集合了setup、teardown,既做了初始化,又做了后置的清理工作.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import
pytest
from
emaillib
import
Email, MailAdminClient
@pytest
.fixture
def
mail_admin():
return
MailAdminClient()
# 配置发送者的fixture函数
@pytest
.fixture
def
sending_user(mail_admin):
user
=
mail_admin.create_user()
#setup:创建发件人
yield
user
# 返回发件人
admin_client.delete_user(user)
#teardown:删除发件人
# 配置收件人的fixture函数
@pytest
.fixture
def
receiving_user(mail_admin):
user
=
mail_admin.create_user()
#setup:创建收件人
yield
user
#返回收件人
admin_client.delete_user(user)
#teardown:删除收件人
def
test_email_received(sending_user, receiving_user, email):
email
=
Email(subject
=
"Hey!"
, body
=
"How's it going?"
)
sending_user.send_email(email, receiving_user)
assert
email
in
receiving_user.inbox
|
翻译下面代码,在调用Entry_into_index前,启动APP,遇到yield关键字,中止fixture函数调用,执行调用函数Entry_into_index内容,在Entry_into_index函数调用后,执行yield函数后的driver.close_app(),关闭APP.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@pytest
.fixture(scope
=
'session'
)
def
startApp_fixture(start_app):
driver
=
start_app
res
=
lp(driver).get_agree_info()
try
:
assert
res
=
=
"同意"
except
Exception as e:
log.error(
"启动APP失败"
)
log.exception(e)
raise
e
else
:
lp(driver).click_agree()
lp(driver).click_next_step()
lp(driver).click_alert()
lp(driver).click_pass()
# 创建首页
index_page
=
indexPage(driver)
yield
index_page, driver
# 后置条件
time.sleep(
3
)
driver.close_app()
# 调用fixture函数
@pytest
.fixture(scope
=
'session'
)
def
Entry_into_index(startApp_fixture)
index_page
=
startApp_fixture()[
0
]
driver
=
startApp_fixture()[
1
]
|
工厂作为固定装置:可以使用闭包,通过外部去调用函数里面函数.
工厂固定装置原因:
上面已经说过,调用fixture函数A可以通过用fixture名称作为调用函数B参数,在这种情况下,fixture函数返回的fixture实例将被注入,最终在测试用例B执行前执行这个装饰过的函数def B(A):pass。但是有个问题在给测试用例添加装饰函数时,传入的参数是fixture函数的函数名,如果需要给fixture函数添加参数时,是不可以用下面形式,代码会直接报错。原因是测试用例传入参数为fixture函数名,如果fixture函数名添加(参数)后,表现形式为add(params)实际为函数调用。可参考高阶函数与装饰器,并无此用法.
解决方式使用闭包,如下图代码:make_customer_record函数返回的是内部函数_make_customer_record(夹具不直接返回数据,而是返回一个生成数据的函数),注意此处未加(),非函数调用,因此在测试用例中customer_1 = make_customer_record("Lisa")此处可拆解为两部分,customer_1 = make_customer_record的结果为_make_customer_record对象 ,加上("Lisa") 实际是对调_make_customer_record函数进行调用:函数名+(参数),以达到可以传参的目的.
1
2
3
4
5
6
7
8
9
|
@pytest
.fixture
def
make_customer_record():
def
_make_customer_record(name):
return
{
"name"
: name,
"orders"
: []}
return
_make_customer_record
#注意此处不加(),非函数调用
def
test_customer_records(make_customer_record):
customer_1
=
make_customer_record(
"Lisa"
)
|
到此这篇关于pytest进阶教程之fixture函数的文章就介绍到这了,更多相关pytest fixture函数内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/dy99/p/14587252.html 。
最后此篇关于pytest进阶教程之fixture函数详解的文章就讲到这里了,如果你想了解更多关于pytest进阶教程之fixture函数详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在做一个关于代码学院的教程,我在这里收到一个错误,说“看起来你的函数没有返回‘唉,你没有资格获得信用卡。资本主义就是这样残酷。’”当收入参数为 75 时。”但是该字符串在控制台中返回(由于某种原因
我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
作为 iOS 新手,有大量书籍可以满足学习基础知识的需求。现在,我想转向一些高级阅读,例如 OAuth 和 SQLite 以及动态 API 派生的 TableView 等。您可以推荐任何资源吗? 最佳
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制。在这种赛制下,我们战队会拿到一个或多个服务器。服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有
Memcached是一个自由开源的,高性能,分布式内存键值对缓存系统 Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、A
Perl 又名实用报表提取语言, 是 Practical Extraction and Report Language 的缩写 Perl 是由 拉里·沃尔(Larry Wall)于19
WSDL 是 Web Services Description Language 的缩写,翻译成中文就是网络服务描述语言 WSDL 是一门基于 XML 的语言,用于描述 Web Services 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在寻找解释在 WPF 中创建自定义用户控件的教程。 我想要一个控件,它结合了一个文本 block 、一个文本框和一个启动通用文件打开对话框的按钮。我已经完成了布局,一切都连接好了。它有效,但它是三
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我接近 fourth page of the Django tutorial 的开始看着vote查看,最后是这样的: # Always return an HttpResponseRedirect a
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何好的 Qt QSS 教程,或者在某个地方我可以看到样式小部件的示例?如果某处可用,我想要一些完整的引用。除了有关如何设置按钮或某些选项卡样式的小教程外,我找不到任何其他内容。 最佳答案 Qt
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!