python unittest由舍入错误引起的失败

时间:2013-09-13 17:23:17

标签: python unit-testing rounding

我为几何变换构建了类。当我运行单元测试时,由于我的方法中的操作产生的舍入错误,它会失败。

在我的测试中,我比较了应该返回点(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个比较。

1 个答案:

答案 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很难安装,但是,如果你已经使用它,那将是最合适的。