如何在单元测试中检查值是否为nan?

tam*_*gal 16 python unit-testing assert nan

我有功能,有时返回NaNs float('nan')(我不使用numpy).

我怎么为它写一个测试,因为

assertEqual(nan_value, float('nan'))
Run Code Online (Sandbox Code Playgroud)

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

tam*_*gal 17

我想出来了

assertTrue(math.isnan(nan_value))
Run Code Online (Sandbox Code Playgroud)


LaG*_*tte 10

math.isnan(x)会提出一个TypeErrorif x既不是a float也不是a Real.

最好使用这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。您可以通过简单地使用比较“value != value”来实现相同的目的,而无需导入数学模块,该比较对于 nan 值计算为 True。 (2认同)

use*_*711 5

使用 NumPy 更新:我知道 OP 没有使用numpy. 然而,我不得不使用numpy并没有找到任何帖子。因此,我将在这里为任何可能需要帮助的人留下答案。它也与图书馆完美配合unittest

import numpy as np
np.testing.assert_equal(nan_value, np.nan)
Run Code Online (Sandbox Code Playgroud)