什么是Python UnitTest中的assertEqual应该做什么?

时间:2016-01-11 18:32:55

标签: python unit-testing assert

这个问题不是上述问题的重复,我不是要求比较实例的方法,而是要求方法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()失败了?

3 个答案:

答案 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_equaltest_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)

这现在应该可以正常工作(并且失败)。