2010-06-11 15 views
5

Tôi có hàm trả về bộ tuple, trong số các giá trị khác có chứa giá trị float. Thông thường tôi sử dụng assertAlmostEquals để so sánh chúng, nhưng điều này không làm việc với bộ dữ liệu. Ngoài ra, tuple cũng chứa các kiểu dữ liệu khác. Hiện tại, tôi đang khẳng định mọi phần tử của bộ dữ liệu riêng lẻ, nhưng điều đó lại quá nhiều đối với một danh sách các bộ dữ liệu như vậy. Có cách nào tốt để viết xác nhận cho các trường hợp như vậy không? Xem xét chức năng này:Kiểm tra xác nhận đối với bộ dữ liệu có phao nổi

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

Bây giờ tôi muốn viết một bài kiểm tra cho nó:

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

này sẽ thất bại vì kết quả của 1.0/2 là không chính xác 0.5. Bất cứ ai có thể giới thiệu một cách tốt để viết như một khẳng định trong một cách có thể đọc được?

Chỉnh sửa: Trên thực tế 1.0/2 chính xác là 0.5, nhưng bạn hiểu ý nghĩa của tôi.

+0

Trên thực tế 0,5 là chính xác có thể biểu thị cho 'double'. – kennytm

+0

Chỉ cần tìm ra rằng quá - nhưng bạn có được điểm chung tôi hy vọng. –

Trả lời

7

Vâng thế nào về mối lái lên chức năng của bạn với vài kéo khóa:

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) 

tiền đề của tôi ở đây là nó tốt hơn để sử dụng nhiều xác nhận trong một vòng lặp để có được các giá trị chính xác mà nó phá vỡ, so với sử dụng một khẳng định duy nhất với tất cả().

ps. Nếu bạn có các loại số khác mà bạn muốn sử dụng assertAlmostEquals cho, bạn có thể thay đổi nếu ở trên, ví dụ: if type(val2) in [float, decimal.Decimal]:

2

Điều tôi đã làm trước đây là viết một hàm tùy chỉnh thiết lập tính hợp lệ cho loại dữ liệu phức tạp và sau đó sử dụng assert(IsFooValid(foo)). Hàm hợp lệ có thể đơn giản trả về true/false, nhưng nó thường tốt hơn cho nó để tăng AssertionError với một thông báo thích hợp.

3

Tôi có thể sẽ xác định hàm đệ quy.

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) 

(Lưu ý rằng nó sẽ khẳng định (1, 2)[1, 2] đều bình đẳng.)

Các vấn đề liên quan