2011-11-02 41 views
7

Tôi đang cố gắng viết các bài kiểm tra đơn vị để đảm bảo tính chính xác của các trang trí khác nhau mà tôi đã viết. Đây là sự khởi đầu của mã tôi đang cố gắng viết:Làm thế nào để kiểm tra trang trí hàm Python?

import unittest 

from memoizer import Memoizer 
from strategies.mru import MRU 


@Memoizer(strategy=MRU(maxsize=10)) 
def fib(x): 
    if x < 2: 
    return 1 
    else: 
    return fib(x-1) + fib(x-2) 


class TestMemoizer(unittest.TestCase): 

    def test_simple(self): 
    self.assertEqual(fib(0), 1) 
    self.assertEqual(fib(1), 1) 
    self.assertEqual(fib(10), 89) 


if __name__ == '__main__': 
    unittest.main() 

Trong khi điều này làm việc cho chiến lược MRU tôi đã nêu ở trên, tôi sẽ cần phải trang trí thêm chức năng fib theo nhiều cách khác nhau. (Nhớ lại rằng bởi vì fib gọi fib, thiết lập fib2 = memoize (fib) không ghi nhớ các giá trị trung gian để nó không hoạt động.) Cách chính xác để kiểm tra các trang trí khác là gì?

Trả lời

8

Hãy nhìn vào các bài kiểm tra trong thư viện chuẩn cho ví dụ: http://hg.python.org/cpython/file/3.2/Lib/test/test_functools.py#l553

tôi thường thêm một số thiết bị để chức năng được bọc để tôi có thể giám sát các cuộc gọi.

Thay vì ghi nhớ chức năng kiểm tra ở cấp mô-đun, tôi tạo hàm đã ghi nhớ bên trong phép thử sao cho thử nghiệm mới được tạo cho mỗi thử nghiệm và cho từng biến trang trí.

+0

Ah, phải. Không chắc chắn lý do tại sao nó không vượt qua tâm trí của tôi không sử dụng bất cứ điều gì sau đó mã số. –

+0

Tôi rất muốn xem mã MRU của bạn khi bạn hoàn tất. Hy vọng rằng, bạn sẽ đăng một liên kết. –

+0

Chắc chắn! Mã cho memoizer của tôi là ở đây: https://github.com/Ceasar/memoizer EDIT: Tôi nghĩ mru.py của tôi nên thực sự được gọi là lru.py –

1

gì về khá phức tạp

def mkfib(strategy): 
    @Memoizer(strategy=strategy) 
    def fib(x): 
     if x < 2: 
     return 1 
     else: 
     return fib(x-1) + fib(x-2) 
    return fib 

Bằng cách này bạn có thể làm

fib1 = mkfib(MRU(maxsize=10)) 
self.assertEqual(fib1(0), 1) 
self.assertEqual(fib1(1), 1) 

fib2 = mkfib(MRU(maxsize=10)) # produces another cache 
self.assertEqual(fib2(0), 1) 
self.assertEqual(fib2(1), 1) 
+0

Ý tưởng rất thông minh! –

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