鼻子:基于TestCase的类的生成器

时间:2013-03-07 21:14:33

标签: python python-3.x nose

我想为TestCase派生类的变体创建一个生成器。

我试过的是:

import unittest

def create_class(param):
    class Test(unittest.TestCase):
        def setUp(self):
            pass

        def test_fail(self):
            assert False
    return Test

def test_basic():
    for i in range(5):
        yield create_class(i)

我得到的是:

======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.3/site-packages/nose/case.py", line 268, in setUp
    try_run(self.test, names)
  File "/usr/lib/python3.3/site-packages/nose/util.py", line 478, in try_run
    return func()
TypeError: setUp() missing 1 required positional argument: 'self'

产生实例而不是类(yield create_class(i)())给我留下了这个错误:

======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/usr/lib/python3.3/unittest/case.py", line 492, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.3/unittest/case.py", line 423, in run
    testMethod = getattr(self, self._testMethodName)
AttributeError: 'Test' object has no attribute 'runTest'

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

实例化TestCase时,您应该传递测试的方法名称:

yield create_class(i)('test_fail')

否则名称默认为runTest(因此您获得的最后一个错误)。

另请注意,测试生成器与TestCase之间存在奇怪的交互。使用以下代码:

import unittest

def create_class(param):
    class Test(unittest.TestCase):
        def setUp(self):
            pass

        def test_fail(self):
            print('executed')
            assert False
            print('after assert')

    return Test

def test_basic():
    for i in range(5):
        yield create_class(i)('test_fail')

我获得了这个输出:

$ nosetests -s
executed
.executed
.executed
.executed
.executed
.
----------------------------------------------------------------------
Ran 5 tests in 0.004s

OK

正如您所看到的,即使assert有效,测试也不会失败。这可能是因为TestCase处理AssertionError,但nose不期望处理它,因此无法看到测试失败。

这可以从TestCase.run的文档中看出:

  

运行测试,将结果收集到作为result传递的测试结果对象中。如果省略结果或None,则为临时结果   创建对象(通过调用defaultTestResult()方法)和   用过的。结果对象不会返回给run()的调用者。

The same effect may be had by simply calling the TestCase instance.

因此,nose没有看到生成器产生的对象是TestCase应该以特殊方式处理,它只是期望一个可调用的。运行TestCase,但结果将被放入丢失的临时对象中,这会消除测试中发生的所有测试失败。因此屈服TestCase es根本不起作用。

答案 1 :(得分:0)

我已经运行了您提供的代码。我没有收到任何错误。我使用的版本是python2.7。系统是ubuntu12.10。也许你需要检查python2.7。