Pytanie Jak zorganizować test Pythona w taki sposób, że mogę uruchomić wszystkie testy w jednym poleceniu?


Obecnie mój kod jest zorganizowany w następującej strukturze drzewa:

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

Gdzie module*.py pliki zawierają kod źródłowy i test_module*.py zawiera TestCases dla odpowiedniego modułu.

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

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

OK

Jak mogę 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


14
2017-12-14 16:52


pochodzenie




Odpowiedzi:


Jeśli wszystkie zaczynają się od test to po prostu nosetest powinno działać. Nos automatycznie wyszukuje pliki rozpoczynające się od "testu".


7
2017-12-16 23:28



Znalazłem problem, nosetests pomijają go, ponieważ są plikami wykonywalnymi. Naprawiłem resetowanie bitu uprawnień wykonywalnych i usunięcie svn: wykonywalnej właściwości z właściwości subversion. - Andrea Francia
The --exe opcja zapobiegnie pomijaniu przez nosetesty plików wykonywalnych. - Jesse Merriman
Prawdopodobnie warto zastanowić się nad przeprowadzką nose2 zamiast nosetest. nose2.readthedocs.io/en/latest/getting_started.html - pds


Niezależnie od tego, czy dzielisz testy czy moduły, jest to prawdopodobnie kwestia gustu, chociaż zdecydowanie zalecałbym ich odseparowanie (przyczyny konfiguracji, statystyki kodów itp.).

Kiedy używasz testów typu nosetests, upewnij się, że wszystkie katalogi z testami są prawdziwymi pakietami:

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

W ten sposób możesz po prostu uruchomić nosetests w katalogu toplevel i wszystkie testy zostaną znalezione. Musisz się tego upewnić src/ jest na PYTHONPATHjednak w przeciwnym razie wszystkie testy zakończą się niepowodzeniem z powodu braku importu.


11
2017-12-14 18:41





Nie wiem o testach nosa, ale można to osiągnąć za pomocą standardowego modułu unittest. Musisz tylko utworzyć test_all.py plik w katalogu głównym, a następnie zaimportuj 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ł powinien zapewniać następującą funkcję (przykład z modułem z dwoma testami jednostkowymi: 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())

4
2017-12-15 08:15



Tego właśnie szukałem, oprócz tego, że myślę, że powinieneś pominąć ()po każdej nazwie pakietu (przynajmniej w Pythonie 2.6.5). - Trevor Burnham
Python 2.7 ma sposób na automatyczne znalezienie modułów testowych / pakietów, co wydaje się łatwiejsze do utrzymania niż pamiętanie o dodaniu ich bezpośrednio do test_all.py. Widzieć docs.python.org/library/unittest.html#test-discovery - Eric Smith


Jest to zapewne temat gorączkowo zakwestionowany, ale proponuję, aby oddzielić swoje testy od modułów. Ustaw coś takiego ...

Posługiwać się setup.py zainstalować je w ścieżce systemowej (lub możesz modyfikować zmienne środowiskowe, aby uniknąć konieczności "instalacji").

foo/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py

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. Połóż testy na bok w ten sposób:

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

Nie jestem pewien co do twojego nosetests polecenie, ale teraz, gdy twoje testy znajdują się w tym samym katalogu, znacznie łatwiej jest napisać skrypt otoki, który po prostu importuje wszystkie inne testy w tym samym katalogu. Lub jeśli nie jest to możliwe, możesz przynajmniej uciec prostą bash pętla, która pobiera pliki testowe jeden po drugim:

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

2
2017-12-14 17:37



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


Dam ci Testoob odpowiedź.

Uruchamianie testów w jednym pliku przypomina Nos:

testoob test_foo.py

Aby uruchomić testy w wielu plikach, możesz tworzyć pakiety z kolektorami 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.


0
2017-12-14 18:32