【问题标题】:Testing with Unittest Python使用 Unittest Python 进行测试
【发布时间】:2010-05-20 14:37:59
【问题描述】:

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

    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

由于某种原因,即使函数通过它也不会引发错误。无论发生什么异常,它总是如此。除非有 else 语句,否则它就是这样。

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

任何人都可以提出一种更清洁的方法吗?

    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

【问题讨论】:

标签: python testing exception unit-testing


【解决方案1】:

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

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

您需要告诉unittest有关可调用对象的信息,在调用可调用对象之前会引发异常。

【讨论】:

    【解决方案2】:

    你试过assertRaises吗?

    【讨论】:

      【解决方案3】:

      优秀的nose unit testing提供了@raises decorator

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2022-10-18
          • 2019-12-29
          • 2011-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多