Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Nose:基于测试用例类的生成器_Python_Python 3.x_Nose - Fatal编程技术网

Python Nose:基于测试用例类的生成器

Python Nose:基于测试用例类的生成器,python,python-3.x,nose,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

我想为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'

有什么想法吗?

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

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

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
不希望处理该错误,因此它无法看到测试失败

这可以从以下文件中看出:

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

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

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

好吧,那么对我来说这似乎是一个bug。我在Python3.3上使用nose,也许这就是问题所在。我不能(也不想)将项目切换回Python2.x,所以我只想同时解决这个问题……如果我在
测试中有多个方法怎么办?明确地传递这些似乎是对干燥原则的严重违反…@dom0我认为你应该仔细阅读关于鼻子的文档。你把事情搞混了
TestCase
es并不是设计成这样使用的,显然这会导致次优代码。