2013-04-24 13 views
6

Podobne do Python unit testing code which calls OS/Module level python functions. Podczas testowania mojego urządzenia przeładowuję niektóre wywołania systemowe Pythona, aby moje testy prowadziły różne ścieżki modułu. Ta technika nazywa się Patch Małp (w pokrewnym pytaniu) do testów w izolacji.Testowanie jednostek Pythona nadrzędnych funkcji poziomu modułu

Trochę martwię się, co się stanie, gdy równolegle przeprowadzę testy w Pythonie, np. W "Nosie". Co się stanie, gdy dwa testy zostaną uruchomione równolegle i obydwa będą próbowały wyśmiać metodę os.path.exists?

Czy istnieje sposób selektywnego zastępowania funkcji systemu lub modułu w kontekście mojego testu?

Weźmy następujący przykład

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? 

Odpowiedz

4

Nie wiem, czy to najlepszy sposób, ale zazwyczaj używają try ... finally gdy robię to w testach, w celu ustalenia następnie przywrócenia podczas każdej zmiany test.

Krótka tego przykładem:

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 

Alternatywą mogłoby być stworzenie menedżera kontekstowe ten sposób, jeśli jest to wspólne działanie w testach.

+0

jaka jest nazwa name_getter? Czy jest to moduł, w którym znajduje się klasa TestNameGetter? –

+0

Tak, przykro mi, użyłem odpowiedzi na http://stackoverflow.com/questions/14956825/python-unit-testing-code-which-calls-os-module-level-python-functions jako przykład. Pozwól mi zaktualizować mój przykład, aby być jaśniejszym. –

+0

Tak, więc co się dzieje, gdy DWIE testy są wykonywane równolegle, które trafiają w ten sam moduł name_getter i czy obie mają inne funkcje raw_input? Czy to nadal działa? –