无效!有装饰器时不运行单元测试

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)。并且由于我没有在函数体中处理的函数签名中的更改参数,单元测试从未被断言为失败,而应该是。骗我相信我的装饰器有问题。

【讨论】:

以上是关于无效!有装饰器时不运行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何在单元(鼻子)测试期间忽略装饰器?

领域模型在运行单元测试时不存储数据

为啥不能识别“异步无效”单元测试?

运行单元测试时禁用winston日志记录?

使用单元测试时避免运行部分代码

Python单元测试--使用装饰器实现测试跳过和预期故障