【问题标题】:Unittest setUpClass not working单元测试 setUpClass 不起作用
【发布时间】:2011-08-11 04:19:04
【问题描述】:

我正在尝试开始使用 unittest,但在让 setUpClass() 工作时遇到问题。这是我的测试代码...

import unittest

class TestRepGen(unittest.TestCase):
    """ Contains methods for training data testing """

    testvar = None

    @classmethod
    def setUpClass(cls):
        cls.testvar = 6

    def test_method(self):
        """ Ensure data is selected """
        self.assertIsNotNone(self.testvar,"self.testvar is None!")

# run tests
if __name__ == '__main__':
    unittest.main()

显示assert错误信息,表示self.testvar == None,并没有被setUpClass()更改。我的代码有问题吗?

如果我从我的 IDE (Wing) 中或直接从命令行运行代码,我会得到相同的结果。作为记录,我在 Windows7 下使用 Python 3.2.1。

【问题讨论】:

  • 我已经在 Windows 7 下的 Python 2.7 上尝试过你的代码。它工作正常;测试通过。如果您完全运行上面的脚本,它真的不适合您吗? Python 3.3 的文档没有表明 setUpClass 的行为有任何变化。
  • 您粘贴的代码适用于我在 windows 7 上的 python27 和 python 3.2.1 中。
  • 您使用 setUpClass 有什么原因吗?为什么不直接使用def setUp(self)
  • @Bogdan 正如他们的名字所暗示的那样,setUp()setUpClass() 用于不同的目的。第一个为每个测试用例运行,而后者只为测试套件运行一次。
  • setUpClass() 是否总是需要使用@classmethod?

标签: python unit-testing python-3.x


【解决方案1】:

setUpClass 是 unittest 框架 2.7 和 3.2 的新内容。如果您想将它与旧版本一起使用,则需要使用 nose 作为测试运行器,而不是 unittest。

【讨论】:

  • zope.testing 的 testrunner 也不支持setUpClass()
【解决方案2】:

我猜你不是直接调用这个测试类,而是一个派生类。

如果是这种情况,您必须手动呼叫setUpClass()——它不会自动呼叫。

class TestB(TestRepGen):
    @classmethod
    def setUpClass(cls):
        super(TestB, cls).setUpClass()

另外,对应the docsclass-level fixtures are implemented by the test suite。所以,如果你打电话给 TestRepGentest_method 一些奇怪的方式你没有发帖,setUpClass 可能不会运行。

【讨论】:

  • agf - 我直接调用了这个类,但最终它会被子类化,所以你的 cmets 很有用。谢谢。
  • @Alan - 您应该发布您的解决方案作为答案并接受它。
【解决方案3】:

好的 - 是时候承认这是我的错误了。当我应该(并且认为我是)使用 3.2.1 时,我正在使用 3.1.2。我现在已更改为正确的版本,一切正常,测试通过。非常感谢所有回复的人(很抱歉浪费您的时间:-()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2013-02-20
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多