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 TestCase
s 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
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 PYTHONPATH
jednak 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
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
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