2013-04-24 30 views
6

Liên quan đến Python unit testing code which calls OS/Module level python functions. Trong thử nghiệm đơn vị của tôi, tôi quá tải một số cuộc gọi hệ thống python để có được các bài kiểm tra của tôi để điều khiển các đường dẫn khác nhau của một mô-đun. Kỹ thuật này được gọi là Khỉ Patch (trong câu hỏi liên quan) để kiểm tra cách ly.Kiểm tra đơn vị Python ghi đè các chức năng mức mô-đun

Tôi hơi lo lắng về những gì xảy ra khi tôi chạy thử nghiệm Python song song nói như trong "Mũi". Điều gì xảy ra khi hai thử nghiệm được chạy song song và cả hai đều muốn giả lập phương thức os.path.exists?

Có cách nào để ghi đè có chọn lọc một chức năng hệ thống hoặc mô-đun trong ngữ cảnh thử nghiệm của tôi không?

Lấy ví dụ sau

fixture.py (say that is the module under test) 

def my_func(): 
    some_stuff 

test_fixture.py (say this is my test case) 


class MyTest(unittest.TestCase): 

    def test_mine(self): 
     fixture.my_func = my_new_func 
     fixture.execute_some_func_that_calls_my_func() 
     #What happens if another test is executing at the same time and accesses 
     #my_func I don't want it to start executing my_new_func? 

Trả lời

4

Tôi không biết nếu đó là cách tốt nhất, nhưng tôi thường sử dụng try ... finally khi tôi đang làm điều này trong các thử nghiệm, để thiết lập sau đó khôi phục những thay đổi trong mỗi kiểm tra.

Một ví dụ ngắn gọn về điều này:

class TestRawInput(unittest.TestCase): 

    def test_raw_input(self): 
     orig_raw_input = raw_input 
     try: 
      raw_input = lambda _: 'Alice' 
      self.assertEquals(raw_input(), 'Alice') 
     finally: 
      raw_input = orig_raw_input 

Một thay thế có thể là để tạo ra một người quản lý bối cảnh để làm điều này, nếu đó là một hoạt động phổ biến trong các thử nghiệm.

+0

tên_getter ở đây là gì? Nó là mô-đun mà lớp TestNameGetter cư trú? –

+0

Có, xin lỗi, tôi đã sử dụng câu trả lời tại http://stackoverflow.com/questions/14956825/python-unit-testing-code-which-calls-os-module-level-python-functions làm ví dụ. Hãy để tôi cập nhật ví dụ của mình để rõ ràng hơn. –

+0

Vì vậy, điều gì sẽ xảy ra khi HAI thử nghiệm đang thực hiện song song mà nhấn cùng một mô-đun name_getter và nếu cả hai đều muốn các hàm raw_input khác nhau? Điều này vẫn hoạt động? –

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