为什么 Python3.4 的 `unittest` 库会出现 AttributeError?

Why do I get an AttributeError with Python3.4's `unittest` library?

所以这是我的代码:

import unittest

class Primes:
    @staticmethod
    def first(n):
    <python code here>

class Test(unittest.TestCase):
    def __init__(self):
        pass
    def assert_equals(self, l, m):
        self.assertEqual(l, m)

Test = Test()
Test.assert_equals(Primes.first(1), [2])

每当我 运行 我的代码时,我都会收到以下错误:

Traceback (most recent call last):
  File "firstNPrimes.py", line 37, in <module>
    Test.assert_equals(Primes.first(1), [2])
  File "firstNPrimes.py", line 34, in assert_equals
    self.assertEqual(l, m)
  File "/usr/lib/python3.4/unittest/case.py", line 796, in assertEqual
    assertion_func = self._getAssertEqualityFunc(first, second)
  File "/usr/lib/python3.4/unittest/case.py", line 777, in _getAssertEqualityFunc
    asserter = self._type_equality_funcs.get(type(first))
AttributeError: 'Test' object has no attribute '_type_equality_funcs'

我不明白这是什么问题。

您收到错误是因为您使用 unittest 不正确。根据 the example in the docs,您的测试应如下所示:

import unittest

class TestPrimes(unittest.TestCase):

    def test_singlePrime_returnsListContainingTwo(self):
        self.assertEqual(Primes.first(1), [2])

    def test_whateverCase_expectedOutcome(self):
        self.assertEqual(Primes.first(...), ...)

if __name__ == '__main__':  # optional, but makes import and reuse easier
    unittest.main()

您不能自己实例化测试用例 class 并调用方法,这样会跳过所有测试发现和设置。

我觉得你的方法很好,并且模仿了我在通过帮助功能提供的示例代码中看到的内容。

导入单元测试 帮助(单元测试)

我在 python 2.7 环境中使用虚拟盒子中的 debs 构建时遇到同样的问题。由于某种原因,只有 assertEqual 方法有问题。 assertAlmostEqual(科学断言相等)、assertSequenceEqual、assertItemEqual等都没有问题。

由于您是子classing unittest.TestCase,您定义的class 继承了unittest.TestCase class 的所有方法,包括方法assertEqual。

对于你的代码,我可以 运行(从 python 2.7 中的命令行):

import testing_code as t

test_object = t.Test()

t.assertSequenceEqual([4,5,6] , [4,5,6])

t.assertNotEqual(4,7)

没问题...我在尝试简单的 assertEqual 方法时遇到了同样的错误。我不认为这是代码 structure/misuse 的单元测试问题,而且我很确定这是一个 environment/build 问题。我决定在 class 上需要一个 assert equal 作为方法,所以我做了一个简单的:

 def AssertEqual(self, a, b):
    if a!=b:
        msg= 'inputs unequal: a, b:', a, b
        raise ValueError, msg