Nosetest初始化错误

Nosetest initialisation error

调用 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

现在很多文件中有很多测试,这个错误没有告诉我错误来自代码中的哪个位置。关于如何找到它的任何想法?到目前为止,我能想到的最好办法是删除所有测试文件,然后将它们一个一个地放回去,但这并不完全理想。

解决方法:

从脚本顶部删除导入语句。

为什么:

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

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

唯一不在测试用例中的是导入语句。所以我只是把它们搬到了它们被使用的地方。

可是为什么会这样呢?加分给知道的人

同样,我不想通读大量代码来寻找答案


说明代码:

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

通常的原因是您在其中一个未导入的测试中使用了 class 或者其中的导入已损坏。或者有一个单独损坏的测试或导入 class ,当通过全局 nose 测试用例运行器环境与其他测试一起初始化时是可以的,例如由于在另一个测试中导入丢失的导入。 但是在初始加载测试 class 或单独加载时 - 它会引发未找到或其他错误。但是 nose 并没有说得很清楚,尽管它可能显示 class.

的初始化错误

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

或者,您在 class 中意外地调用了一个方法 test_something,这并不意味着测试 class(例如,在好吃的地方或 class 被它使用)并且 nose 在没有所需参数的情况下找到并初始化它。

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

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

如果您 运行 使用 --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 查找不在测试目录中的任何内容。