我为几何变换构建了类。当我运行单元测试时,由于我的方法中的操作产生的舍入错误,它会失败。
在我的测试中,我比较了应该返回点(2,2,0)的方法之一的结果,但由于舍入错误,它返回(1.9999999999999996,1.9999999999999996,0.0)
Finding files... done.
Importing test modules ... done.
** DEBUG_45 from the method point=(1.9999999999999996, 1.9999999999999996, 0.0)
======================================================================
FAIL: testPointCoord (vectOper.test.TestNearestPoint.TestNearestPoint)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\src\vectOper\test\TestNearestPoint.py", line 14, in testPointCoord
self.assertEqual(pointCoord, (2,2,0), "nearest point failed")
AssertionError: nearest point failed
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
从计算的角度来看,这是可以接受的,但我不希望我的代码在简单的单元测试中失败。
import unittest
from vectOper.nearestPoint import NearestPoint
class TestNearestPoint(unittest.TestCase):
def testPointCoord(self):
nearestPoint = NearestPoint()
pointCoord = nearestPoint.pointCoord(samplePoint=(2,2,2),lineStart=(0,0,0), lineVect=(1,1,0))
self.assertEqual(pointCoord, (2,2,0), "nearest point failed")
解决这类问题的正确方法是什么?显然我不能将输出数字向上舍入或将它们转换为整数,因为通常情况并非如此。 有没有办法代码单元测试忽略舍入错误? 有没有其他方法可以解决问题?
编辑:
问题可以通过在another回答中正确使用self.assertAlmostEqual
来解决,但问题是我需要测试元组的入口。在我尝试完成所有建议之后:
def testPointCoord(self):
nearestPoint = NearestPoint()
pointCoord = nearestPoint.pointCoord(samplePoint=(2,2,2),lineStart=(0,0,0), lineVect=(1,1,0))
self.assertAlmostEqual(pointCoord[0], 2, places=7, msg="nearest point x-coodr failed")
self.assertAlmostEqual(pointCoord[1], 2, places=7, msg="nearest point y-coodr failed")
self.assertAlmostEqual(pointCoord[2], 0, places=7, msg="nearest point z-coodr failed")
但是我需要以某种方式自动化它,因为稍后我需要测试一个元组列表作为矢量场的样本点坐标。
建议重复的解决方案只有一半,因为如果列表中有100个元组,则会有点单调乏味地写300个比较。
答案 0 :(得分:2)
为什么不使用map在每个维度中使用assertAlmostEqual? 我没有访问你的课程,所以我在这里写了一个类似的例子:
from unittest import TestCase
class Test_Tuple_Equality(TestCase):
def test_tuple_equality_True(self):
p1 = (0.00000001, 0.00000000001, 0)
p2 = (0,0,0)
map(lambda x, y: self.assertAlmostEqual(x,y), p1, p2)
def test_tuple_equality_False(self):
p1 = (0.00000001, 0.00000000001, 0)
p2 = (1,0,0)
map(lambda x, y: self.assertAlmostEqual(x,y), p1, p2)
Map会将你的n维元组comparisson变换成n个浮点数比较。
您甚至可以创建compare_points函数,例如:
def compare_points(self, p1, p2):
map(lambda x,y: self.assertAlmostEqual(x,y), p1,p2)
然后在测试中使用它
另一个解决方案是使用numpy的方法:
import numpy
>>>numpy.testing.assert_almost_equal((2,2,0), (1.9999999999,2,0), decimal=7, err_msg='', verbose=True)
Numpy很难安装,但是,如果你已经使用它,那将是最合适的。