self.assertTrue(False)它究竟测试了什么

时间:2015-09-23 22:53:56

标签: python django unit-testing django-testing

我正在为我们的应用程序编写一些测试,但我不确定我在这里测试正确的东西。这是我的考验。

def test_ReservationExtensionFalseWrongResource(self):
        'does not create a reservation that is an extension if different resource'
        try:
            reservation1 = Reservation.objects.create(user=self.regularUser1, resource=self.resource1, modality=self.modality, timeFrom=datetime(2015, 6, 11, 20, tzinfo=pytz.utc), timeTo=datetime(2015, 6, 11, 21, tzinfo=pytz.utc), count=1, notes=None, extendedReservation=None)
            reservation = create_reservation(self.regularUser2, self.regularUser2, None, self.resource2, self.modality, datetime(2015, 6, 11, 20, tzinfo=pytz.utc), datetime(2015, 6, 11, 21, tzinfo=pytz.utc), 1, reservation1.uuid)
            self.assertTrue(False, "Should not create reservation")
        except Exception, e:
            self.assertTrue(True, "Not authorized")

我想确定如果保留扩展名属于不同的资源,则无法创建保留扩展名,因此此行应在try块中失败:

 reservation = create_reservation(self.regularUser2, self.regularUser2, None, self.resource2, self.modality, datetime(2015, 6, 11, 20, tzinfo=pytz.utc), datetime(2015, 6, 11, 21, tzinfo=pytz.utc), 1, reservation1.uuid)

这是:

self.assertTrue(False, "Should not create reservation")

断言保留创建导致False值?或者我是否正确理解断言匹配器。我已经尝试过浏览文档,但是我在一个对我来说很明显的try catch块中看不到类似这样的例子。

非常感谢帮助。

3 个答案:

答案 0 :(得分:2)

python docs的函数签名

 assertTrue(expr, msg=None)

检查给定expr是否为True。如果exprFalse,则会使用提供的消息(msg)引发错误

self.assertTrue(True, "Not authorized") # Is always True 

self.assertTrue(False, "Should not create reservation")  # Is always False and it will throw an error saying "Should not create reservation"

因此,在您的try块中,如果未引发任何异常,self.assertTrue(False, "Should not create reservation")将引发错误,因为False不是True

如果引发异常,那么您的代码将进入Except blockself.assertTrue(True, "Not authorized")不会引发任何错误,因为True为True。

因此,如果您想抛出异常,如果发生任何异常,请将self.assertTrue(False, "Should not create reservation")移至阻止

except Exception, e:
    self.assertTrue(False, "Should not create reservation")

答案 1 :(得分:1)

虽然不是标题的直接答案,但这应该可以解答您的实际问题。

  1. 你永远不应该抓住Exception(除非你之后再重新加注)。

    except Exception, e:
    

    处理异常时,必须指定要捕获的确切错误。例如,调用create_reservation的代码可能会捕获您定义的ReservationError异常。

    如果您希望此代码有效,则必须先测试并确保create_reservation引发正确错误。因此,即使在测试中,您仍然必须使用正确的错误。

  2. 如果您需要测试某些代码会引发异常,请使用相应的断言assertRaises。它可以以两种方式使用。要么作为电话:

    self.assertRaises(ReservationError, create_reservation, self.regularUser2, .........)
    

    或者您可以使用with关键字(需要python 2.7或python 3.1或更新版本)将其用作上下文管理器:

    with self.assertRaises(ReservationError):
        create_reservation(self.regularUser2, ...........)
    

    两个示例都会运行create_reservation,检查是否会引发异常,如果 ,则传递,否则会失败。

答案 2 :(得分:0)

我可能不会那样设置我的测试。您要做的是确定您的方法的确切行为并进行相应的测试。

所以,如果你正在测试一个失败案例,并且让我们说,例如,如果失败,你的方法会返回类似“预订失败”的内容,那么你应该做这样的事情:

# where msg is the response of your call
self.assertEqual(msg, "reservation failed", "assertion failed")