Nosetest初始化错误

时间:2015-01-06 10:26:44

标签: python nosetests unit-testing

致电nosetests给我以下内容:

======================================================================
ERROR: Failure: TypeError (__init__() takes exactly 2 arguments (1 given))
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/loader.py", line 519, in makeTest
    return self._makeTest(obj, parent)
  File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/loader.py", line 578, in _makeTest
    return MethodTestCase(obj)
  File "/home/sheena/WORK/CriticalID/workspace/flow_env2/local/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/case.py", line 345, in __init__
    self.inst = self.cls()
TypeError: __init__() takes exactly 2 arguments (1 given)

以及其他一些东西。

我的目录结构如下:

MyStuff
   ./__init__.py
   ./tests
        ./some_tests.py
        ./other_tests.py
        ./ ... lots more
        ./a_useful_group_of_tests
           ./more_tests.py
           ./tasty_tests.py
           ./ ...lots more
   ./other_files_and_directories

现在很多文件中都有很多测试,这个错误没有说明我的代码中错误来自哪里。关于我如何找到它的任何想法?到目前为止,我能想到的最好的方法是摆脱所有的测试文件,然后逐个放回去,但这并不完全理想。

3 个答案:

答案 0 :(得分:3)

通常的原因是您在其中一个未导入的测试中使用了一个类,或者在其中导入了导入的类。或者具有单独损坏的测试或导入的类,当通过全局鼻测试案例运行器环境进行其他测试初始化​​时,例如由于在另一个测试中导入缺少的导入,这是可以的。 但是在初始加载测试类或单个加载时 - 它会引发未找到或其他错误。但是鼻子并没有那么清楚,尽管它可能显示出该类的初始化错误。

因此,在测试环境中使用示例代码时,'goodies'中的某些内容不会在模块初始化时传递参数,这是正确初始化所必需的。但如果在测试中稍后进行初始化,则获取它。

或者你有一个方法意外地在一个类中调用了test_something,这个类并不是一个测试类(例如,在某个好东西或它使用的类中),并且鼻子在没有所需参数的情况下找到并初始化它。

你可以尝试逐个完成导入,将它们放回到模块级别 - 然后在python shell上初始化问题类来修复它。

答案 1 :(得分:1)

解决方案:

从脚本顶部删除import语句。

<强>为什么:

根据Evert的建议找到测试文件给我发现问题后,我使用nosetests选项执行了-vv。事实证明,错误消息并非来自任何特定测试。即,测试按预期运行,这些错误只是标记在输出上。输出看起来像:

Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ERROR
Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ERROR
...
test_clear_instructions (the_calculator2.tests.model_tests.workflow_tests.Workflow_tests) ... 
...all my tests follow

测试用例中唯一没有的是import语句。所以我把它们移到了使用它们的地方。

但为什么会发生这种情况?任何知道

的人都可以获得奖励

再次,我不想阅读大量的代码来找到答案


说明性代码:

from my.stuff import goodies    #<----------Error from this line

class My_tests(unittest.TestCase):
    def test_one(self):
        do stuff
    def test_two(self):
        do other stuff

此代码中没有错误:

class My_tests(unittest.TestCase):
    def test_one(self):
        from my.stuff import goodies
        do stuff
    def test_two(self):
        from my.stuff import goodies
        do other stuff

答案 2 :(得分:0)

所以我在这个问题上花了太多时间,想要回馈。

如果您使用--with-xunit运行测试,您会注意到在路径nose.failure.Failure.runTest下预测失败的测试。如果您尝试运行该测试,它会说它不存在。这里有些奇怪的东西。

有趣的是,如果你在--collect-only --verbose下运行它,你会得到Failure: TypeError (__init__() takes exactly 2 arguments (1 given)) ... ok,所以有些事情首先被认为是一个测试,当它可能不应该被认可时,第二个它会立即失败。显然,与失败测试相邻的两个软件包都通过了,所以即使找出哪个文件失败也不是直截了当的。

事实证明,有人创建了一个名称中有test的非测试文件。 Nose试图把它解释为测试,因此错误。

可悲的是,我不得不手动运行每个包来解决这个问题。可以这样做的一种方法是find /path/to/package -name "*test*.py然后grep以查找不在测试目录中的任何内容。