2013-04-24 17 views
6

Bezogen auf Python unit testing code which calls OS/Module level python functions. Während meines Komponententests überhöhere ich einige Python-Systemaufrufe, um meine Tests dazu zu bringen, verschiedene Pfade eines Moduls zu steuern. Diese Technik namens Monkey Patch (in der verwandten Frage) für Tests isoliert.Python-Unit-Test überschreibt Module Level-Funktionen

Ich bin ein bisschen besorgt darüber, was passiert, wenn ich Python-Tests parallel laufen lasse wie in "Nose". Was passiert, wenn zwei Tests parallel ausgeführt werden und beide die os.path.exists-Methode vortäuschen möchten?

Gibt es eine Möglichkeit, eine System- oder Modulfunktion im Kontext meines Tests selektiv zu überschreiben?

Nehmen Sie das folgende Beispiel für

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? 

Antwort

4

Ich weiß nicht, ob es der beste Weg ist, aber ich verwenden in der Regel try ... finally wenn ich dies in Tests mache, um während jeder einstellen dann wiederherstellen Änderungen Prüfung.

Ein kurzes Beispiel dafür:

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 

Eine Alternative könnte sein, einen Kontext-Manager zu erstellen, dies zu tun, wenn es in den Tests eine gemeinsame Operation ist.

+0

Was ist der Name_getter hier? Ist es das Modul, in dem sich die Klasse TestNameGetter befindet? –

+0

Ja, tut mir leid, ich habe die Antwort unter http://StackOverflow.com/questions/14956825/python-unit-testing-code-which-calls-os-module-level-python-functions als Beispiel verwendet. Lassen Sie mich mein Beispiel aktualisieren, um klarer zu sein. –

+0

Ja was passiert, wenn ZWEI Tests parallel ausgeführt werden, die das selbe name_getter Modul treffen und wenn beide verschiedene raw_input Funktionen haben wollen? Funktioniert das noch? –