如何检查单元测试中的值是不是为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
也不是Real
,math.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 测试检查表格视图中的单元格是不是可见?