2013-03-11 14 views
12

Ich möchte die Dateien meiner Anwendung unter dem Ordner/Dateien haben, während die Test Units in/UnitTests, so dass ich App und Test klar getrennt habe.Python UnitTesting: Tests in einem anderen Modul ausführen

Um die gleichen Modulrouten wie mainApp.py verwenden zu können, habe ich eine testController.py im Stammordner erstellt.

mainApp.py 
testController.py 
Files 
    |__init__.py 
    |Controllers 
    | blabla.py 
    | ... 
UnitTests 
    |__init__.py 
    |test_something.py 

Also, wenn in test_something.py ich eine Funktion testen möchten, die in /Files/Controllers/blabla.py ist, versuche ich folgendes:

import unittest 
import Files.Controllers.blabla as blabla 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(blabla.some_function()) 


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


Und dann aus der Datei testController.py, ausführen ich den folgenden Code:

import TestUnits.test_something as my_test 
my_test.unittest.main() 

, die keine Ausfälle gibt, aber keine Tests ausgeführt

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 
[Finished in 0.3s] 


Ich habe mit einem Test versucht, die keine Abhängigkeiten hat, und wenn sie ausgeführt werden als „Haupt“ funktioniert, aber wenn von außen genannt, gibt die gleiche:

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(tested_unit()) 


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

Frage: Wie bekomme ich das zur Arbeit?

Antwort

4

In test_something.py, dies zu tun:

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(TestMyUnit, 'test')) 
    return suite 

In testController.py, dies tun:

from TestUnits import test_something 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(test_something.suite()) 
    return suite 

if __name__ == '__main__': 
    unittest.main(defaultTest='suite') 
+0

Dies ist ein wenig bisschen ausführlich, aber es funktioniert, danke. – bgusach

15

Die Methode unittest.main() betrachtet die alle unittest.TestCase Klassen im Kontext vorhanden. Sie müssen also nur Ihre Testklassen in Ihre testController.py-Datei importieren und unittest.main() im Kontext dieser Datei aufrufen.

So Ihre Datei testController.py sollte einfach wie folgt aussehen:

import unittest  
from UnitTests.test_something import * 
unittest.main() 
+0

Danke, aber es funktioniert nicht. Das Ergebnis ist das gleiche: es führt keinen Test aus. – bgusach

+0

Ok mein Schlechter. Sie müssen alle Testfälle aus test_something Datei importieren. Versuchen Sie mit UnitTests.test_something TestMyUnit (oder *) importieren und es sollte funktionieren! – rparent

+0

Es funktioniert, danke. – bgusach

0

Es gibt eine Problemumgehung der Verwendung subprocess.call() zum Ausführen von Tests, wie zB:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
Verwandte Themen