【问题标题】:Python unittest.TestCase object has no attribute 'runTest'Python unittest.TestCase 对象没有属性“runTest”
【发布时间】:2013-10-05 21:37:52
【问题描述】:

对于以下代码:

import unittest

class Test(unittest.TestCase):
    def test1(self):
        assert(True == True)

if __name__ == "__main__":
    suite = unittest.TestSuite()
    suite.addTest(Test())
    unittest.TextTestRunner().run(suite)

使用Python 3执行,出现如下错误:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    unittest.TextTestRunner().run(suite)
  File "/usr/lib/python3.2/unittest/runner.py", line 168, in run
    test(result)
  File "/usr/lib/python3.2/unittest/suite.py", line 67, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.2/unittest/suite.py", line 105, in run
    test(result)
  File "/usr/lib/python3.2/unittest/case.py", line 477, in __call__
    return self.run(*args, **kwds)
  File "/usr/lib/python3.2/unittest/case.py", line 408, in run
    testMethod = getattr(self, self._testMethodName)
AttributeError: 'Test' object has no attribute 'runTest'

但是unittest.main() 有效。

【问题讨论】:

    标签: python unit-testing python-3.x python-unittest


    【解决方案1】:

    你需要调用TestLoader:

    if __name__ == "__main__":
        suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)
        unittest.TextTestRunner().run(suite)
    

    【讨论】:

      【解决方案2】:

      您必须指定测试方法名称(test1):

      import unittest
      
      class Test(unittest.TestCase):
          def test1(self):
              assert(True == True)
      
      if __name__ == "__main__":
          suite = unittest.TestSuite()
          suite.addTest(Test('test1')) # <----------------
          unittest.TextTestRunner().run(suite)
      

      或者,如果你想运行文件中的所有测试,只需调用unittest.main() 就足够了:

      if __name__ == "__main__":
          unittest.main()
      

      【讨论】:

        【解决方案3】:

        任何TestCase 子类的实际测试都是在runTest() 方法中执行的。只需将您的代码更改为:

        class Test(unittest.TestCase):
            def runTest(self):
                assert(True == True)
        

        【讨论】:

        • 是的,它有效。但是有没有办法让它在不改变 Test 类的情况下工作? @bhajun-singh。
        • 只说pass而不是assert(True == True)
        • 这个documentation 似乎另有说法。也就是说:“TestCase 的每个实例都将运行一个基本方法:名为 methodName 的方法。在 TestCase 的大多数使用中,您既不会更改 methodName,也不会重新实现默认的 runTest() 方法。”
        【解决方案4】:

        你可以这样运行它:

        python -m unittest <your-module-name>
        

        我不完全理解它为什么会起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-05
          • 2014-05-14
          • 1970-01-01
          • 2012-10-04
          • 2021-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多