【发布时间】:2019-01-20 13:21:32
【问题描述】:
我的 pytest 测试装饰器在调用函数后立即退出装饰器。如果我使用 python 而不是 pytest 运行文件,效果很好。
代码如下:
def dec(func):
def wrapper(*args, **kwargs):
print('do some stuff')
result = func(*args, **kwargs)
print('ran function')
return False if result else return True
return wrapper
@dec
def test_something_is_not_true():
return False # assert False
@dec
def test_something_is_true():
return True # assert True
print(test_something_is_not_true())
print(test_something_is_true())
我用python运行这个文件的结果如下:
C:\tests> python test.py
do some stuff
ran function
True
do some stuff
ran function
False
效果很好!
但是当我使用 pytest 运行它时,它会停在 result = func(*args, **kwargs) 行并且永远不会执行 print('ran function') 行:
C:\tests>pytest test.py
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: C:\, inifile:
plugins: metadata-1.7.0, jira-0.3.6, html-1.19.0
collected 2 items
test.py F. [100%]
================================== FAILURES ===================================
_________________________ test_something_is_not_true __________________________
args = (), kwargs = {}
def wrapper(*args, **kwargs):
print('do some stuff')
> result = func(*args, **kwargs)
test.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
@dec
def test_something_is_not_true():
> assert False
E assert False
test.py:31: AssertionError
---------------------------- Captured stdout call -----------------------------
do some stuff
===================== 1 failed, 1 passed in 0.11 seconds ======================
如您所见,装饰器函数实际上并没有做任何事情......但如果我能让它工作,那么我可以查看测试是否在该函数中通过,如果是,则根据结果执行一些额外的逻辑测试的通过或失败。也许使用装饰器来完成捕获测试的输出不是最好的方法吗?
你会怎么做?
【问题讨论】:
-
使用装饰器绝对不是解决这个问题的好方法。改用固定装置。
-
return False和assert False是两个不同的东西。断言将引发AsserionError,中止程序。我怀疑使用解释器“正常”执行脚本会打印出你ran function。
标签: python pytest python-decorators