Krz*_*ski 4 python equality nan python-unittest
在我的测试用例中,我假设如果两个值NaN相等,则它们相等。使用unittest断言的表达方式是什么?下面介绍的两个常用函数不处理这种情况。
v1 = np.nan
v2 = np.nan
self.assertEquals(v1, v2)
self.assertTrue(v1 == v2)
Run Code Online (Sandbox Code Playgroud)
现在对我有用的解决方案是在内部使用布尔表达式assertTrue:
self.assertTrue(v1 == v2 or (np.isnan(v1) and np.isnan(v2))
Run Code Online (Sandbox Code Playgroud)
你可以使用:
numpy.testing.assert_equal(v1, v2)
Run Code Online (Sandbox Code Playgroud)
从文档:
此函数处理 NaN 比较,就好像 NaN 是“正常”数字一样。也就是说,如果两个对象在相同位置都有 NaN,则不会引发断言。这与关于 NaN 的 IEEE 标准形成对比,后者说 NaN 与任何东西相比都必须返回 False。
当值不相等时它会抛出 AssertionError 并且它应该可以与 pytest 一起正常工作,但它可能不适合单元测试测试。
另一种选择是:
numpy.isclose(v1, v2, equal_nan=True)
Run Code Online (Sandbox Code Playgroud)
但显然它是替代math.isclose,而不是替代==。
检查两个 NaN 是否相等是没有意义的。您能做的最好的事情就是以不同的方式检查它,例如:
check = numpy.isnan(v1) and numpy.isnan(v2)
self.assertTrue(check)
Run Code Online (Sandbox Code Playgroud)