这个问题不是上述问题的重复,我不是要求比较实例的方法,而是要求方法assertEqual
和它的目的是什么< /强>
assertEqual(a, b)
检查a == b
是否返回True或False,
文档说,
测试第一个和第二个是否相等。如果值不比较 相等,测试将失败。
我在一个简单的类上运行了assertEqual
的三个测试,
考试中的课程
class Car:
def __init__(self, name):
self.name = name
The TestCase
class CarTest(unittest.TestCase):
def test_diff_equal(self):
car1 = Car('Ford')
car2 = Car('Hyundai')
self.assertEqual(car1, car2)
def test_name_equal(self):
car1 = Car('Ford')
car2 = Car('Ford')
self.assertEqual(car1, car2)
def test_instance_equal(self):
car1 = Car('Ford')
self.assertEqual(car1, car1)
结果
F.F
======================================================================
FAIL: test_diff_equal (cartest.CarTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "cartest.py", line 10, in test_diff_equal
self.assertEqual(car1, car2)
AssertionError: <car.Car instance at 0x7f499ec12ef0> != <car.Car instance at 0x7f499ec12f38>
======================================================================
FAIL: test_name_equal (cartest.CarTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "cartest.py", line 15, in test_name_equal
self.assertEqual(car1, car2)
AssertionError: <car.Car instance at 0x7f499ec12fc8> != <car.Car instance at 0x7f499ec12f38>
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (failures=2)
assertEqual
是否用于检查两个实例是否相同?或者我的设置有什么问题?为什么test_name_equal()
失败了?
答案 0 :(得分:6)
您的测试工作正常,并且发现了一个错误。乌拉!
您的两个Car对象可能具有相同的名称,但为什么这意味着它们是同一辆车?您的代码中没有任何内容可以实现这一点。
如果您希望如此,请在Car类上实现__eq__
:
def __eq__(self, other):
"""Return True if other is also a car and has the same name as
this one."""
return isinstance(other, Car) and self.name == other.name
然后该测试应该通过。
答案 1 :(得分:1)
整个问题可以简化为&#34; Python如何比较对象&#34;官方文件Section 5.9: Comparisons中精确定义的内容。
引用官方文件(强调我的)来澄清你所要求的方面。
内置类型的大多数其他对象比较不相等,除非它们是 同一个对象;选择是否一个对象被认为更小 或大于另一个是任意但一致的 一次执行程序。
test_instance_equal
涵盖的内容以及基本上是什么:
o1 = object()
o1 == o1 # will always be True
运算符&lt;,&gt;,==,&gt; =,&lt; =和!=比较两个值 对象。对象不必具有相同的类型。如果两者都是数字, 它们被转换为普通类型。否则,对象不同 类型总是比较不相等,并且一致地排序但是 随意。 您可以控制对象的比较行为 非内置类型,通过定义__cmp__方法或丰富的比较 像__gt__这样的方法,在第Special method names节中描述。
引用特殊方法名称:
object.__lt__(self, other) object.__le__(self, other) object.__eq__(self, other) object.__ne__(self, other) object.__gt__(self, other) object.__ge__(self, other)
2.1版中的新功能。
这些是所谓的“丰富比较”方法,并且需要这些方法 比较运算符优先于
__cmp__()
以下。该 运算符符号和方法名称之间的对应关系为 如下:(...)x==y calls x.__eq__(y)
,(...)
test_diff_equal
和test_name_equal
显示的内容。没有定义__eq__
魔术方法,因此,它会回退到默认实现(他们比较不相等,除非它们是同一个对象)。
问题与单元测试模块无关。
答案 2 :(得分:0)
添加到已经说过的内容中:对于给定的示例,您需要直接比较对象的属性而不是对象本身,以使unittest.TestCase.assertEqual
起作用。
class CarTest(unittest.TestCase):
def test_diff_equal(self):
car1 = Car('Ford')
car2 = Car('Hyundai')
self.assertEqual(car1.name, car2.name)
def test_name_equal(self):
car1 = Car('Ford')
car2 = Car('Ford')
self.assertEqual(car1.name, car2.name)
def test_instance_equal(self):
car1 = Car('Ford')
self.assertEqual(car1.name, car1.name)
这现在应该可以正常工作(并且失败)。