2008-12-14 5 views
14

Obecnie mój kod jest zorganizowana w następującej strukturze drzewa:Jak zorganizować test Pythona w taki sposób, że mogę uruchomić wszystkie testy w jednym poleceniu?

src/ 
    module1.py 
    module2.py 
    test_module1.py 
    test_module2.py 
    subpackage1/ 
     __init__.py 
     moduleA.py 
     moduleB.py 
     test_moduleA.py 
     test_moduleB.py 

Jeżeli module*.py plików zawiera kod źródłowy i test_module*.py zawiera TestCase s dla danego modułu.

Z następujących comands mogę uruchomić testy zawarte w jednym pliku, na przykład:

$ cd src 
$ nosetests test_filesystem.py 
.................. 
---------------------------------------------------------------------- 
Ran 18 tests in 0.390s 

OK 

jaki sposób można uruchomić wszystkie testy? Próbowałem z nosetests -m 'test_.*', ale to nie działa.

$cd src 
$ nosetests -m 'test_.*' 

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

OK 

Dzięki

Odpowiedz

7

Jeśli wszyscy zaczną z test wtedy właśnie nosetest powinien praca. Nos automatycznie wyszukuje pliki rozpoczynające się od "testu".

+2

Znalazłem problem, nosetests pomiń go, ponieważ są pliki wykonywalne. Naprawiłem resetowanie bitu uprawnień wykonywalnych i usunięcie svn: wykonywalnej właściwości z właściwości subversion. –

+2

Opcja [--exe] (http://packages.python.org/nose/usage.html#cmdoption--exe) zapobiegnie pomijaniu przez nosetesty plików wykonywalnych. –

+0

Prawdopodobnie warto rozważyć przejście do 'nose2' zamiast' nosetest'. https://nose2.readthedocs.io/en/latest/getting_started.html – pds

2

Prawdopodobnie jest gorąco-sporna temat, ale chciałbym zaproponować, aby oddzielić się od testów modułów. Skonfiguruj coś takiego ...

Użyj setup.py, aby zainstalować je w ścieżce systemowej (lub możesz zmodyfikować zmienne środowiskowe, aby uniknąć konieczności "instalacji").

Teraz każdy skrypt Pythona w dowolnym miejscu może uzyskać dostęp do tych modułów, zamiast polegać na znajdowaniu ich w lokalnym katalogu. Umieść swoje testy wszystko z boku tak:

tests/ 
    test_module1.py 
    test_module2.py 
    test_subpackage1_moduleA,py 
    test_subpackage2_moduleB.py 

nie jestem pewien swojej komendzie nosetests, ale teraz, że testy są w tym samym katalogu, to staje się o wiele łatwiej napisać skrypt otoki, że po prostu importuje wszystkie inne testy w tym samym katalogu. Lub jeśli nie jest to możliwe, można przynajmniej uciec z prostym bash pętli, który pobiera pliki testowe jeden po drugim:

#!/bin/bash 
cd tests/ 
for TEST_SCRIPT in test_*.py ; do 
    nosetests -m $TEST_SCRIPT 
done 
+4

Proponuję odzwierciedlenie struktury pakietu programu w katalogu testowym. W przeciwnym razie katalog testowy będzie bałagan, gdy program się powiększy. – deamon

0

dam się Testoob odpowiedź.

Wykonywanie testów w jednym pliku jest jak nos:

testoob test_foo.py 

Aby uruchomić testy w wielu plików można tworzyć apartamenty z kolektorów Testoob (w każdym podpakiecie)

# src/subpackage?/__init__.py 
def suite(): 
    import testoob 
    return testoob.collecting.collect_from_files("test_*.py") 

i

# src/alltests.py 
test_modules = [ 
    'subpackage1.suite', 
    'subpackage2.suite', 
] 

def suite(): 
    import unittest 
    return unittest.TestLoader().loadTestsFromNames(test_modules) 

if __name__ == "__main__": 
    import testoob 
    testoob.main(defaultTest="suite") 

Nie próbowałem Twojego konkretnego scenariusza.

11

Czy oddzielne lub wymieszać i testy modułów to chyba kwestia gustu, chociaż chciałbym zdecydowanie opowiadają się za utrzymywanie ich od siebie (powody konfiguracji, statystyk kod etc).

Kiedy używasz nosetests, upewnij się, że wszystkie katalogi z badań są prawdziwe pakiety:

src/ 
    module1.py 
    module2.py 
    subpackage1/ 
     __init__.py 
     moduleA.py 
     moduleB.py 
tests/ 
    __init__.py 
    test_module1.py 
    test_module2.py 
    subpackage1/ 
     __init__.py 
     test_moduleA.py 
     test_moduleB.py 

ten sposób można po prostu uruchomić nosetests w katalogiem głównym i wszystkie testy zostaną znalezione.Musisz się upewnić, że src/ jest na PYTHONPATH, w przeciwnym razie wszystkie testy zakończą się niepowodzeniem z powodu braku importu.

4

Nie wiem na temat testów nosa, ale można to osiągnąć przy użyciu standardowego modułu unittest. Wystarczy utworzyć plik test_all.py w katalogu głównym, a następnie zaimportować wszystkie moduły testowe. W twoim przypadku:

import unittest 
import test_module1 
import test_module2 
import subpackage1 
if __name__ == "__main__": 
    allsuites = unittest.TestSuite([test_module1.suite(), \ 
           test_module2.suite(), \ 
           subpackage1.test_moduleA.suite(), \ 
           subpackage1.test_moduleB.suite()]) 

każdy moduł należy podać następujące funkcje (przykład z modułem z dwóch testów jednostkowych: Class1 i Class2):

def suite(): 
    """ This defines all the tests of a module""" 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(Class1)) 
    suite.addTest(unittest.makeSuite(Class2)) 
    return suite 
if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(suite()) 
+0

Tego właśnie szukałem, poza tym myślę, że powinieneś pominąć '()' po nazwie każdego zestawu (przynajmniej w Pythonie 2.6.5). –

+0

Python 2.7 potrafi automatycznie znaleźć moduły testowe/pakiety, co wydaje się łatwiejsze do utrzymania niż pamiętanie o dodaniu ich bezpośrednio do test_all.py. Zobacz http://docs.python.org/library/unittest.html#test-discovery –