2016-07-04 6 views
4

ich zur Zeit meine Tests wie folgt ausgeführt werden:Filtertests nach entdecken

tests = unittest.TestLoader().discover('tests') 
unittest.TextTestRunner().run(tests) 

Jetzt habe ich einen bestimmten Test zu wissen, seinen Namen ausgeführt werden soll (wie test_valid_user), nicht aber seine Klasse zu kennen. Wenn es mehr als einen Test mit diesem Namen gibt, würde ich alle diese Tests durchführen. Gibt es eine Möglichkeit, Tests nach discover zu filtern?

Oder vielleicht gibt es andere Lösungen für dieses Problem (bitte beachten Sie, dass es nicht von der Kommandozeile aus erfolgen sollte)?

Antwort

2

Sie können die unittest.loader.TestLoader.testMethodPrefix verwenden Instanzvariable, um den Testmethodenfilter nach einem anderen p zu ändern refix als "test".

Sagen Sie bitte ein tests Verzeichnis mit diesem König von Unit-Tests haben:

import unittest 


class MyTest(unittest.TestCase): 
    def test_suite_1(self): 
     self.assertFalse("test_suite_1") 

    def test_suite_2(self): 
     self.assertFalse("test_suite_2") 

    def test_other(self): 
     self.assertFalse("test_other") 

Sie können Ihre eigene discover Funktion schreiben zu entdecken, nur Testfunktionen, die mit „test_suite_“, zum Beispiel:

import unittest 


def run_suite(): 
    loader = unittest.TestLoader() 
    loader.testMethodPrefix = "test_suite_" 
    suite = loader.discover("tests") 
    result = unittest.TestResult() 
    suite.run(result) 
    for test, info in result.failures: 
     print(info) 


if __name__ == '__main__': 
    run_suite() 

Bemerkung: Das Argument "Tests" in der discover Methode ist ein Verzeichnispfad, so dass Sie möglicherweise einen vollständigen Pfad schreiben müssen.

Als Ergebnis erhalten Sie:

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 8, in test_suite_1 
    self.assertFalse("test_suite_1") 
AssertionError: 'test_suite_1' is not false 

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 11, in test_suite_2 
    self.assertFalse("test_suite_2") 
AssertionError: 'test_suite_2' is not false 
0

Es gibt zwei Möglichkeiten, um eine einzelne Testmethode auszuführen:

Befehlszeile:

$ python -m unittest test_module.TestClass.test_method 

Mit Python-Skript:

import unittest 

class TestMyCode(unittest.TestCase): 

    def setUp(self): 
     pass 

    def test_1(self): 
     self.assertTrue(True) 

    def test_2(self): 
     self.assertTrue(True) 

if __name__ == '__main__': 
    testSuite = unittest.TestSuite() 
    testSuite.addTest(TestMyCode('test_1')) 
    runner=unittest.TextTestRunner() 
    runner.run(testSuite) 

Ausgang:

------------------------------------------------ ------------

Ran-1-Test in 0.000s

OK

1

einem anderen einfachen Weg wäre py.test mit der -k Option zu verwenden, die einen Test tut Name Keyword-Scan. Es werden alle Tests ausgeführt, deren Name mit dem Keyword-Ausdruck übereinstimmt.

Obwohl das die Befehlszeile verwendet, die Sie nicht wollten, können Sie die Befehlszeile nicht aus Ihrem Code aufrufen, indem Sie subprocess.call verwenden, um alle Argumente dynamisch zu übergeben.

Beispiel: Angenommen, Sie die folgenden Tests haben:

def test_user_gets_saved(self): pass 
def test_user_gets_deleted(self): pass 
def test_user_can_cancel(self): pass 

Sie können py.test von cli nennen:

$ py.test -k "test_user" 

Oder von Code:

return_code = subprocess.call('py.test -k "test_user"', shell=True)