2013-01-19 21 views
0

我的所有单元测试都能在Python 2.6.5中成功运行;当我运行Python 2.7.3时失败。被测试的代码很复杂,涉及大量的浮动工作,并且在转换为Decimal时,通过首先转换为str,就像Python 2.6中所需的那样。单元测试只是从Python 2.6.5更改为Python 2.7.3;与小数相关的

在我开始挖掘之前,我想知道我是否可能有点懒惰,并且看看有人以前看过这个帖子,并且对搜索内容有建议。下面是测试运行的结果:

====================================================================== 
FAIL: test_hor_tpost_winsize_inside_mm (__main__.Test_ShutterCalculator) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "test_ShutterCalculator.py", line 506, in test_hor_tpost_winsize_inside_mm 
    self.assertEqual(o.net_width_closing_tolerance, Decimal("6.4")) 
AssertionError: Decimal('6.3') != Decimal('6.4') 

---------------------------------------------------------------------- 

下面是test_hor_tpost_winsize_inside_mm()单元测试代码:

490  def test_hor_tpost_winsize_inside_mm(self): 
491   """ 
492   Same as above but test mm 
493   """ 
494   o = self.opening 
495   o.unit_of_measure = "millimeters" 
496   o.formula_mode = "winsize" 
497   o.mount = "inside" 
498   o.given_width = Decimal("1117.6") 
499   o.given_height = Decimal("2365.4") 
500   o.louver_spacing = Decimal("101.6") 
501   self.make4SidedFrame("9613", '9613: 2-1/2" Face Deco Z', Decimal("63.5"), Decimal("19.1")) 
502   so1 = o.subopenings[(0,0)] 
503   so1.fold_left = 1 
504   so1.fold_right = 1 
505   self.calc() 
506   self.assertEqual(o.net_width_closing_tolerance, Decimal("6.4")) 
507   self.assertEqual(o.net_height_closing_tolerance, Decimal("6.4")) 
508   self.assertEqual(o.horizontal_shim, Decimal(".125")) # in inches 
509   self.assertEqual(o.vertical_shim, Decimal(".125")) # in inches 
510   self.assertEqual(o.width, Decimal("1069.8")) ## 1070 converted directly from inches 
511   self.assertEqual(o.height, Decimal("2317.6")) ## 2317.8 converted directy from inches 
512   tpost = o.add_hor_tpost() 
513   so2 = o.subopenings[(0,1)] 
514   so2.fold_left = 1 
515   so2.fold_right = 1 
516   self.calc() 
517   #self.cs() 
518   self.assertEqual(o.net_width_closing_tolerance, Decimal("6.4")) 
519   self.assertEqual(o.net_height_closing_tolerance, Decimal("12.7")) 
520   self.assertEqual(o.horizontal_shim, Decimal(".125")) # in inches 
521   self.assertEqual(o.vertical_shim, Decimal(".125")) # in inches 
522   self.assertEqual(o.width, Decimal("1069.8")) ## Rick had 42 but agreed that mine is right 
523   self.assertEqual(o.height, Decimal("2311.3")) 
524   self.assertEqual(so1.width, Decimal("1069.8")) 
525   self.assertEqual(so2.width, Decimal("1069.8")) 
526   self.assertEqual(so1.height, Decimal("1139.7")) ## Rick had 44.8125 but agreed mine is right 
527   self.assertEqual(so2.height, Decimal("1139.7")) 
528   self.assertEqual(tpost.center_pos, Decimal("1182.7")) 
529   top_panel_section = so1.panels[0].sections[(0,0)] 
530   bottom_panel_section = so2.panels[0].sections[(0,0)] 
531   self.assertEqual(top_panel_section.louver_count, 9) 
532   self.assertEqual(bottom_panel_section.louver_count, 9) 
533   self.assertEqual(top_panel_section.top_rail.width, Decimal("112.6")) ## Rick had 4.40625, but given the changes to net 
534   self.assertEqual(bottom_panel_section.bottom_rail.width, Decimal("112.7")) 
535   self.assertEqual(top_panel_section.bottom_rail.width, Decimal("112.7")) 
536   self.assertEqual(bottom_panel_section.top_rail.width, Decimal("112.6")) 

什么来搜索我的代码,找到差异的来源任何提示?

回答

1

Python 2.7引入了对Decimal类和float类型的更改,以帮助提高从字符串转换时的准确性。这可能是变化的根源。

浮点数和字符串之间的转换现在可以在大多数平台上正确舍入。这些转换发生在许多不同的地方:str()在浮点数和复数上;浮动和复杂的构造函数;数字格式;使用marshal,pickle和json模块序列化和反序列化浮点数和复数;在Python代码中解析float和虚文字;和十进制到浮点数转换。

你可以看到变化的细节here,在“其他语言的变化”

+0

我想这是不值得挖掘,因为一切都可能是现在的工作做得更好。浮点数变为四舍五入,并且只有一个十进制精度的地方转换为十进制毫米,而Python现在更准确地做到了这一点,从而解释了我的测试失败。我是否应该更改测试以使值落入+ - .1的范围内?还是应该将代码括起来以期望取决于Python版本的不同精确值? –

+1

就个人而言,我会根据运行的版本来支持代码。你不希望测试中的容忍隐藏一些可能在未来版本中引入的细微错误。 – Steve