无效!有装饰器时不运行单元测试
Posted
技术标签:
【中文标题】无效!有装饰器时不运行单元测试【英文标题】:NOT VALID! Unittest is not run when it has a decorator 【发布时间】:2015-09-02 22:00:39 【问题描述】:编辑:正如我在下面回答的那样,这个问题是无效的,因为这完全是我的误解。
我为自定义错误制作了一个 try-except 装饰器,我想在我的单元测试中应用这个装饰器。但是,当完成并且在装饰单元测试范围内有 raise SomeError
语句(如果不满足某些特定测试要求,从测试用例调用的函数将抛出 SomeError
),并且此错误类是陷入我的装饰器,然后测试永远不会执行。但是,如果我在测试用例中删除任何 raise SomeError
语句,它运行良好。
我的装饰师:
def try_exceptor(f):
@functools.wraps(f)
def inner(self):
try:
return f(self)
except KeyError as k:
print k
except MyLocustFailError as mlfe:
print mlfe.message
newer_assert(mlfe.load_test, mlfe.response, mlfe.message)
return inner
【问题讨论】:
你到底想用这个做什么?当测试抛出KeyError
时,你想发生什么?你想自己重写unittest.TestCase.assertRaises
吗?
KeyError 只是为了解决我的问题中描述的行为而添加的。我正在将要与 Python unittest 和 Locust 负载测试模块一起使用的测试源(测试用例函数)结合起来。装饰器允许我将每个测试用例中的 try-except 语句移动到一个装饰器中。
对不起,我还是不明白。为什么在测试用例中使用 try-except ?相同的代码抛出异常或不抛出异常真的是正确的吗?也许您需要举一个更具体的例子? assertRaises()
怎么没有给你想要的功能?
Locust 负载测试模块有它自己的方法来设置测试用例失败(必须说我不是 Locust 专家,所以这个解决方案是我现在想出的)。因此,如果我想在 Locust 运行期间设置失败状态并终止执行,我会抛出我的自定义错误。还应该说,执行总是作为单元测试(使用单元测试模块)或作为蝗虫测试。如果不涉及 Locust 模块,我将永远不会使用装饰器和 tr-except 的这种方法..
Dan Getz,感谢您的意见,但正如您在我的回答中看到的那样,问题是我的误解。
【参考方案1】:
我有点尴尬,但我必须承认,从来没有我在问题中描述过的问题。刚刚意识到由于我的日志记录设置错误,在某些情况下,输出部分进入了我的日志文件(facepalm)。并且由于我没有在函数体中处理的函数签名中的更改参数,单元测试从未被断言为失败,而应该是。骗我相信我的装饰器有问题。
【讨论】:
以上是关于无效!有装饰器时不运行单元测试的主要内容,如果未能解决你的问题,请参考以下文章