使用Unittest Python进行测试

时间:2010-05-20 14:38:00

标签: python testing exception unit-testing

我使用Python Unittest进行runninig测试。我正在运行测试,但我想进行负面测试,我想测试函数是否抛出异常,它会通过,但如果没有抛出异常,则测试失败。我的脚本是:

    try:
        result = self.client.service.GetStreamUri(self.stream, self.token)
        self.assertFalse
    except suds.WebFault, e:                        
        self.assertTrue
    else:
        self.assertTrue

即使功能完美无缺,它也会传递给True。我还尝试了其他各种方式,包括:

    try:
        result = self.client.service.GetStreamUri(self.stream, self.token)
        self.assertFalse
    except suds.WebFault, e:                        
        self.assertTrue
    except Exception, e:
        self.assertTrue

有人有任何建议吗?

由于

我试过没有运气的assertRaises。

    try:
        result = self.client.service.GetStreamUri(self.stream, self.token)
        self.assertRaises(WebFault)
    except suds.WebFault, e:                        
        self.assertFalse
    except Exception, e:                        
        self.assertTrue

它仍然通过。出于某种原因,它不会尝试执行assertRaises语句。我也尝试过:(函数应该失败,但测试应该通过)

    try:
        result = self.client.service.GetStreamUri(self.stream, self.token)

    except suds.WebFault, e:                        
        self.assertFalse
    except Exception, e:                        
        self.assertTrue
    else:
        self.assertFalse

由于某种原因,即使函数通过它也不会引发错误。它始终不管异常。除非有其他声明,否则就是这样。

找到一种有效的方法,但它似乎是一种非常糟糕的做事方式:

有人能建议更清洁的方式吗?

    try:
        result = self.client.service.GetStreamUri(self.stream, self.token)

    except suds.WebFault, e:                        
        self.assertFalse
    except Exception, e:
        pass

    try:
        result==result
    except:
        result=None
    if result==None:
        assert True
    else:
        assert False

4 个答案:

答案 0 :(得分:4)

TestCase.assertRaises 是您需要的,但在您的示例中,您似乎略微误用了它。你需要这样的东西:

def test_GetStreamUri(self):
    self.assertRaises(WebFault, self.client.service.GetStreamUri)
    result = self.client.service.GetStreamUri(self.stream, self.token)

在调用callable之前,你需要告诉unittest有关可调用的问题。

答案 1 :(得分:1)

您是否尝试过assertRaises

答案 2 :(得分:1)

优秀的nose unit testing提供@raises decorator

@raises(TypeError)
def test_raises_type_error():
    raise TypeError("This test passes")

答案 3 :(得分:0)

您应该拨打self.assertTrue(True)self.assertFalse(True),因为您现在并没有真正调用这些功能,只是引用它们。不过,必须有一种更清洁的方法来做到这一点。