2010-06-11 3 views
5

다른 것들 중에서 float 값을 포함하는 튜플을 반환하는 함수가 있습니다. 일반적으로 나는 이들을 비교하기 위해 assertAlmostEquals을 사용하지만 튜플에서는 작동하지 않습니다. 또한 튜플에는 다른 데이터 유형도 포함됩니다. 현재 튜플의 모든 요소를 ​​개별적으로 주장하고 있지만 이러한 튜플 목록에 너무 많이 포함됩니다. 그런 경우에 대한 주장을 쓰는 좋은 방법이 있습니까? 이 기능을 고려해 float을 가진 튜플에 대한 테스트 어설 션

def f(a): 
    return [(1.0/x, x * 2) for x in a] 

가 지금은 그것에 대한 테스트를 작성하려면 : 1.0/2의 결과가 정확히 0.5하지 않기 때문에

def testF(self): 
    self.assertEqual(f(range(1,3)), [(1.0, 2), (0.5, 4)]) 

이 실패합니다. 누구나 읽을 수있는 방식으로 그러한 주장을 작성하는 좋은 방법을 추천 할 수 있습니까?

: 실제로 1.0/2은 정확히 0.5이지만 내 의미를 갖습니다.

+0

실제로 0.5는 'double'에 대해 정확히 나타낼 수 있습니다. – kennytm

+0

그걸 알아 냈어.하지만 너는 내가 바라는 일반적인 요지를 얻는다. –

답변

7

음이 지퍼의 부부와 함께 함수를 포주에 대한 방법 :

def testF(self): 
    for tuple1, tuple2 in zip(f(range(1,3)), [(1.0, 2), (0.5, 4)]): 
     for val1, val2 in zip(tuple1, tuple2): 
      if type(val2) is float: 
       self.assertAlmostEquals(val1, val2, 5) 
      else: 
       self.assertEquals(val1, val2) 

여기 내 전제는 그것이이다 하나의 루프에서 여러개의 assert를 사용하여 break가 발생한 정확한 값을 얻고, all()으로 단일 assert를 사용하는 것이 더 좋다.

ps. assertAlmostEquals를 사용하려는 다른 숫자 유형이있는 경우 위의 if를 다음과 같이 변경할 수 있습니다. if type(val2) in [float, decimal.Decimal]:

2

과거에는 복잡한 데이터 형식에 대한 유효성을 설정하고 assert(IsFooValid(foo))을 사용하는 사용자 지정 함수를 작성했습니다. 유효 함수는 단순히 true/false를 반환 할 수 있지만 일반적으로 적절한 메시지가있는 AssertionError를 발생시키는 것이 좋습니다.

3

아마도 재귀 함수를 정의 할 것입니다.

from collections import Iterable; 

def recursiveAssertAlmostEqual(testCase, first, second, *args, **kwargs): 
    if isinstance(first, Iterable) and isinstance(second, Iterable): 
     for a, b in zip(first, second): 
     recursiveAssertAlmostEqual(testCase, a, b, *args, **kwargs) 
    else: 
     testCase.assertAlmostEqual(first, second, *args, **kwargs) 

(가 (1, 2)[1, 2]가 동일한 주장 않습니다.)