如何检查单元测试中的值是不是为nan?

Posted

技术标签:

【中文标题】如何检查单元测试中的值是不是为nan?【英文标题】: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 的东西吗?我找不到任何关于它的信息……

【问题讨论】:

How do you test to see if a double is equal to NaN in Java?的可能重复 如果语言不同,则不能重复。 【参考方案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。

以上是关于如何检查单元测试中的值是不是为nan?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xcode 7 UI 测试检查表格视图中的单元格是不是可见?

检查单元测试中是不是抛出参数

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?

如何在 Ember 模型单元测试中检查属性属性类型?

Swift UI 测试,如何检查单元格是不是有图像视图

如何检查是不是在单元测试中调用了 sync.WaitGroup.Done()