Python unittest加载器在调用_uinit__;()时抛出TypeError

Python unittest加载器在调用_uinit__;()时抛出TypeError,python,python-unittest,Python,Python Unittest,我已经为我的Python应用程序编写了一系列测试,但它们突然之间似乎不再正常工作了 我在测试模块中创建了一系列测试: 在测试中,我包含了以下代码来加载我的测试套件: import unittest if __name__ == "__main__": loader = unittest.TestLoader() start_dir = "." suite = loader.discover(start_dir=start_dir, pattern='*_test.py

我已经为我的Python应用程序编写了一系列测试,但它们突然之间似乎不再正常工作了

我在
测试
模块中创建了一系列测试:

测试中,我包含了以下代码来加载我的测试套件:

import unittest

if __name__ == "__main__":
    loader = unittest.TestLoader()
    start_dir = "."
    suite = loader.discover(start_dir=start_dir, pattern='*_test.py')

    runner = unittest.TextTestRunner()
    runner.run(suite)
我知道我会听起来像个彻头彻尾的傻瓜,但这些测试在大约一小时前对我来说非常有效。我会通过在我的基本目录中键入
python3-m tests
来发布它们。然而,我现在收到一个非常奇怪的
类型错误

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/Users/yuchen/Desktop/myproj/myapp/tests/__main__.py", line 6, in <module>
    suite = loader.discover(start_dir=start_dir, pattern='*_test.py')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 341, in discover
    tests = list(self._find_tests(start_dir, pattern))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 406, in _find_tests
    yield from self._find_tests(full_path, pattern, namespace)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 406, in _find_tests
    yield from self._find_tests(full_path, pattern, namespace)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 398, in _find_tests
    full_path, pattern, namespace)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 452, in _find_test_path
    return self.loadTestsFromModule(module, pattern=pattern), False
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 123, in loadTestsFromModule
    tests.append(self.loadTestsFromTestCase(obj))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 92, in loadTestsFromTestCase
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/suite.py", line 24, in __init__
    self.addTests(tests)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/suite.py", line 57, in addTests
    for test in tests:
TypeError: __init__() takes 0 positional arguments but 2 were given
但是,
\uuu init\uuu()
签名似乎不需要0个位置参数。此外,它显然正在执行,因为我在上面的代码中添加了
print(“Tests”,Tests)
之后,在抛出错误之前,我看到了以下输出:

Tests: []
Tests: <map object at 0x11033c0b8>
Tests: <map object at 0x11033c0b8>
Tests: <map object at 0x11033c0b8>
Tests: [<unittest.suite.TestSuite tests=[... a list of my tests]]
Tests: <map object at 0x110483978>
Tests: <map object at 0x110483978>
Traceback (most recent call last):

然后我忘记了它,开始做其他的事情,然后进行测试。就在那时,我开始意识到我的错误。从我的测试模块中删除此类后,测试运行顺利。

回溯看起来有点混乱的原因之一是:

for test in tests
实际上是击中了一台发电机,它正在发现并动态加载测试

所以我猜这是:

TypeError: __init__() takes 0 positional arguments but 2 were given
实际上,这意味着发现过程发现了一个无法加载的测试类,这可能是因为该类有自己的
\uuuu init\uuuu
方法,该方法的参数数量与发现所期望的不同

我将仔细检查您的测试类中是否有
\uuuu init\uuuu
方法,并可能更改这一行:

start_dir = "."
致:


这意味着发现过程将开始从
tests
文件夹向下查看,这比“.”(当前工作目录)更安全,因为当前工作目录可能会根据您启动测试的位置而变化(并可能最终选择您不期望的测试).

我在我的开发环境中尝试了你的代码。工作正常。您还更改了什么吗?没有,我的
\uuuuu main\uuuuuu.py
文件中没有任何内容。您为什么将其命名为“main”。将它命名为其他名称,tryI将其命名为
\uuuuu main\uuuuuu.py
,因为我想执行该模块中的所有测试。因此,调用它
\uuuu main\uuuu.py
允许我编写
python3-m测试。我刚刚将它重命名为
base.py
,并尝试了
python3测试/base.py
,但收到了相同的错误。这正是原因所在。我编辑了我的答案,以提供一些解决问题的方法。
TypeError: __init__() takes 0 positional arguments but 2 were given
start_dir = "."
start_dir = os.path.dirname(__file__)