为什么 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
所以这是我的代码:
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