【问题标题】:How to check if value is nan in unittest?如何检查单元测试中的值是否为nan?
【发布时间】:2013-05-29 06:13:28
【问题描述】:

我有一些函数,有时会返回带有 float('nan') 的 NaN(我没有使用 numpy)。

我该如何为它写一个测试,因为

assertEqual(nan_value, float('nan'))

就像float('nan') == float('nan') 总是假的。可能有类似assertIsNan 的东西吗?我找不到任何关于它的信息……

【问题讨论】:

标签: python unit-testing assert nan


【解决方案1】:

我想出了

assertTrue(math.isnan(nan_value))

【讨论】:

    【解决方案2】:

    如果x 既不是float 也不是Realmath.isnan(x) 将引发TypeError

    最好使用这样的东西:

    import math
    
    
    class NumericAssertions:
        """
        This class is following the UnitTest naming conventions.
        It is meant to be used along with unittest.TestCase like so :
        class MyTest(unittest.TestCase, NumericAssertions):
            ...
        It needs python >= 2.6
        """
    
        def assertIsNaN(self, value, msg=None):
            """
            Fail if provided value is not NaN
            """
            standardMsg = "%s is not NaN" % str(value)
            try:
                if not math.isnan(value):
                    self.fail(self._formatMessage(msg, standardMsg))
            except:
                self.fail(self._formatMessage(msg, standardMsg))
    
        def assertIsNotNaN(self, value, msg=None):
            """
            Fail if provided value is NaN
            """
            standardMsg = "Provided value is NaN"
            try:
                if math.isnan(value):
                    self.fail(self._formatMessage(msg, standardMsg))
            except:
                pass
    

    然后您可以使用self.assertIsNaN()self.assertIsNotNaN()

    【讨论】:

    • 不错。您可以在不导入数学模块的情况下通过简单地使用比较 value != value 来实现相同的效果,该比较对于 nan 值的计算结果为 True。
    • @Richard 这很危险,根本不是问题的重点。上下文:float("NaN") != float("NaN") 将评估为True,但float("NaN") != 3 也将评估为,这根本不是用户想要做的事情(如果值 is nan 则断言)。
    • @SlobodanIlic 我认为您误解了我的评论。如果你有变量a = 3,那么你就不会写float('nan') != a来检查它的值是否为nan。你会写is_nan = (a != a)。这样is_nan 只是 True,如果 a 确实是 nan。
    猜你喜欢
    • 2019-05-12
    • 2015-03-01
    • 2020-07-28
    • 2018-09-28
    • 2017-07-28
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多