2013-03-11 13 views
12

Chcę mieć pliki z mojej aplikacji pod folderem/Files, natomiast jednostki testowe w/UnitTests, tak aby wyraźnie oddzielić aplikację i przetestować.Python unittesting: uruchom testy w innym module

Aby móc korzystać z tych samych tras modułów co mainApp.py, utworzyłem testController.py w folderze głównym.

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

Więc jeśli w test_something.py Chcę przetestować jedną funkcję, która jest w /Files/Controllers/blabla.py staram następujące:

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() 


a następnie z pliku testController.py, ja wykonać następujący kod:

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

które wyjścia żadnych uszkodzeń, ale żadne testy wykonywane

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

OK 
[Finished in 0.3s] 


Próbowałem z testem, który nie ma się zależności, a jeśli wykonywany jako „główny” działa, ale kiedy wywołana z zewnątrz, wysyła taki sam:

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

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


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

Pytanie: jak mogę to uruchomić?

Odpowiedz

4

W test_something.py, to zrobić:

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

W testController.py, to zrobić:

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

To jest trochę trochę gadatliwy, ale działa, dziękuję. – bgusach

15

metody unittest.main() patrzy na wszystkich zajęciach unittest.TestCase obecny w kontekście. Musisz więc zaimportować swoje klasy testowe do pliku testController.py i wywołać metodę unittest.main() w kontekście tego pliku.

Więc testController.py plik powinien po prostu wyglądać następująco:

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

Dzięki, ale to nie działa. Wynik jest taki sam: nie wykonuje żadnego testu. – bgusach

+0

Ok mój zły. Musisz zaimportować wszystkie przypadki testowe z pliku test_something. Spróbuj z UnitTests.test_something zaimportuj TestMyUnit (lub *) i powinno działać! – rparent

+0

Działa, dziękuję. – bgusach

0

Istnieje obejście z użyciem subprocess.call(), aby uruchomić testy, takie jak:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
Powiązane problemy