如何在 unittest 中的 setUpClass 上设置条件装饰器?

Posted

技术标签:

【中文标题】如何在 unittest 中的 setUpClass 上设置条件装饰器?【英文标题】:How can I set conditional decorators on setUpClass in unittest? 【发布时间】:2013-01-23 08:20:13 【问题描述】:

我想在 python 的 unitest 中为setUpClass 设置一个条件装饰器。我已经尝试了以下方法(暂时没有条件,以证明这一点):

import unittest

class conditional_decorator(object):
    def __call__(self, func):
        print ("Extra output")
        return func

class First(unittest.TestCase):

    @classmethod
    @conditional_decorator
    def setUpClass(cls):
        print ("setting up")

    def test1(self):
        pass


if __name__ == '__main__':
    unittest.main()

但我得到一个错误

TypeError: object.__new__() takes no parameters

我该如何解决这个问题?此外,有没有一种简单的方法可以为setUpClass 方法“组合”两个装饰器?

【问题讨论】:

【参考方案1】:

首先实例化您的 conditional_decorator 类:

class First(unittest.TestCase):

    @classmethod
    @conditional_decorator() # Note the class is instantiated first.
    def setUpClass(cls):
    print ("setting up")

    def test1(self):
        pass

或者使用函数而不是类作为装饰器:

def conditional_decorator(func):
    print ("Extra output")
    return func

class First(unittest.TestCase):

    @classmethod
    @conditional_decorator
    def setUpClass(cls):
        print ("setting up")

    def test1(self):
        pass


if __name__ == '__main__':
    unittest.main()

现在可以了:

$ python my_test.py 
Extra output
setting up
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

【讨论】:

【参考方案2】:

当您查看回溯行时,它会告诉您错误发生的位置。我最好的猜测是,因为我不知道你的代码的其余部分,是在你的代码主体中你留下了一个额外的参数或添加了一个额外的逗号。

至于提问的两位装饰师在这里提问:Can I combine two decorators into a single one in Python?

*同时从 setUpClass 中删除 Class,因为 setUp 是它自己的函数

【讨论】:

以上是关于如何在 unittest 中的 setUpClass 上设置条件装饰器?的主要内容,如果未能解决你的问题,请参考以下文章

unittest中的如何判断结果是不是满足预期?

pytest学习和使用5-Pytest和Unittest中的断言如何使用?

如何在 XCode4 中运行单元测试而无需切换到 UnitTest 配置文件/目标?

如何将未编译的 .mlmodel 添加到 Xcode UnitTests 包

python接口自动化测试-unittest-批量用例管理

python 接口自动化测试使用unittest 批量用例管理