Mam katalog, który zawiera moje testy jednostkowe w języku Python. Każdy moduł testu jednostkowego ma formę testu _ *. Py . Próbuję utworzyć plik o nazwie all_test.py , który, jak się , uruchomi wszystkie pliki w wyżej wymienionym formularzu testowym i zwróci wynik. Do tej pory wypróbowałem dwie metody; oba zawiodły. Pokażę te dwie metody i mam nadzieję, że ktoś wie, jak to zrobić poprawnie.
Podczas mojej pierwszej dzielnej próby pomyślałem: „Jeśli po prostu zaimportuję wszystkie moje moduły testowe do pliku, a następnie unittest.main()
wywołam ten szablon, to zadziała, prawda?” Okazuje się, że się myliłem.
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
if __name__ == "__main__":
unittest.main()
To nie zadziałało, otrzymałem wynik:
$ python all_test.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Przy drugiej próbie pomyślałem, ok, może spróbuję wykonać całą tę testowanie w bardziej „ręczny” sposób. Więc próbowałem to zrobić poniżej:
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite
result = unittest.TestResult()
testSuite.run(result)
print result
#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
unittest.main()
To również nie działało, ale wydaje się tak blisko!
$ python all_test.py
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Wydaje mi się, że mam jakiś pakiet i mogę wykonać wynik. Jestem trochę zaniepokojony faktem, że mówi, że mam run=1
, wydaje się, że tak powinno być run=2
, ale jest to postęp. Ale jak przekazać i wyświetlić wynik jako główny? Lub w jaki sposób mogę go w zasadzie uruchomić, aby móc po prostu uruchomić ten plik, a tym samym uruchomić wszystkie testy jednostkowe w tym katalogu?
źródło
Odpowiedzi:
W Pythonie 2.7 i nowszych wersjach nie musisz pisać nowego kodu ani korzystać z narzędzi innych firm; wykonywanie testu rekurencyjnego za pomocą wiersza poleceń jest wbudowane. Umieść
__init__.py
w katalogu testowym i:Możesz przeczytać więcej w niezbyt udanej dokumentacji Pythona 2.7 lub Pythona 3.x.
źródło
Możesz użyć testera, który zrobiłby to za Ciebie. nos jest na przykład bardzo dobry. Po uruchomieniu znajdzie testy w bieżącym drzewie i je uruchomi.
Zaktualizowano:
Oto kod z moich dni przed nosem. Prawdopodobnie nie chcesz jawnej listy nazw modułów, ale być może reszta przyda ci się.
źródło
W Pythonie 3, jeśli używasz
unittest.TestCase
:__init__.py
plik w swoimtest
katalogu ( musi mieć nazwętest/
)test/
pasują do wzorcatest_*.py
. Mogą znajdować się w podkatalogu podtest/
, a te podkatalogi można nazwać jakkolwiek.Następnie możesz uruchomić wszystkie testy za pomocą:
Gotowy! Rozwiązanie mniej niż 100 linii. Mam nadzieję, że inny początkujący python oszczędza czas, znajdując to.
źródło
Jest to teraz możliwe bezpośrednio z unittest: unittest.TestLoader.discover .
źródło
.... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Dlaczego? Różnica, skąd pochodzi?python file.py
Cóż, studiując nieco powyższy kod (konkretnie używając
TextTestRunner
idefaultTestLoader
), byłem w stanie podejść bardzo blisko. Ostatecznie poprawiłem swój kod, przekazując wszystkie pakiety testowe do konstruktora pojedynczego zestawu, zamiast dodawać je „ręcznie”, co naprawiło moje inne problemy. Oto moje rozwiązanie.Tak, prawdopodobnie łatwiej jest po prostu użyć nosa niż to zrobić, ale jest to poza tym kwestia.
źródło
Jeśli chcesz uruchomić wszystkie testy z różnych klas przypadków testowych i z przyjemnością sprecyzujesz je, możesz to zrobić w następujący sposób:
gdzie
uclid
jest mój projektTestSymbols
iTestPatterns
są podklasamiTestCase
.źródło
TestSuite
akceptuje iterowalność jako argument, możesz skonstruować tę iterowalność w pętli, aby uniknąć powtarzanialoader.loadTestsFromTestCase
.Użyłem tej
discover
metody i przeciążenia,load_tests
aby osiągnąć ten wynik w (minimalnie, jak sądzę) wierszach kodu:Egzekucja na piątki
źródło
Próbowałem różnych podejść, ale wszystkie wydają się wadliwe lub muszę zrobić jakiś kod, to denerwujące. Ale pod Linuksem istnieje dogodny sposób, aby po prostu znaleźć każdy test poprzez określony wzór, a następnie wywołać je jeden po drugim.
i co najważniejsze, zdecydowanie działa.
źródło
W przypadku spakowanej biblioteki lub aplikacji nie chcesz tego robić.
setuptools
zrobi to za ciebie .Po prostu powiedz mu, gdzie jest twój główny pakiet testowy, na przykład:
I biegnij
python setup.py test
.Wykrywanie na podstawie plików może być problematyczne w Pythonie 3, chyba że unikniesz importu względnego w pakiecie testowym, ponieważ
discover
używa importu plików. Mimo że obsługuje opcjonalnetop_level_dir
, ale miałem nieskończone błędy rekurencyjne. Tak więc prostym rozwiązaniem dla niepakowanego kodu jest umieszczenie następującego__init__.py
pakietu testowego (patrz protokół load_tests ).źródło
Używam PyDev / LiClipse i tak naprawdę nie odkryłem, jak uruchomić wszystkie testy na raz z GUI. (edycja: kliknij prawym przyciskiem myszy główny folder testowy i wybierz
Run as -> Python unit-test
Oto moje obecne obejście:
Umieszczam ten kod w module o nazwie
all
w moim katalogu testowym. Jeśli uruchomię ten moduł jak Liittlipse, to wszystkie testy są uruchamiane. Jeśli poproszę o powtórzenie tylko określonych lub nieudanych testów, zostaną uruchomione tylko te testy. Nie przeszkadza mi to także w testowaniu linii poleceń (testy nosa) - jest ignorowany.Konieczna może być zmiana argumentów na w
discover
zależności od konfiguracji projektu.źródło
Na podstawie odpowiedzi Stephena Cagle'a dodałem obsługę zagnieżdżonych modułów testowych.
Kod przeszukuje wszystkie podkatalogi w
.
poszukiwaniu*Tests.py
plików, które są następnie ładowane. Oczekuje, że każda*Tests.py
zawiera pojedynczą klasę,*Tests(unittest.TestCase)
która jest ładowana kolejno i wykonywana jedna po drugiej.Działa to z dowolnym głębokim zagnieżdżaniem katalogów / modułów, ale każdy katalog pomiędzy musi zawierać pusty
__init__.py
przynajmniej plik. Umożliwia to testowi załadowanie zagnieżdżonych modułów przez zastąpienie ukośników (lub odwrotnych ukośników) kropkami (patrzreplace_slash_by_dot
).źródło
To stare pytanie, ale dla mnie teraz (w 2019 r.) Działało:
Wszystkie moje pliki testowe znajdują się w tym samym folderze co pliki źródłowe i kończą się na
_test
.źródło
Ponieważ odkrywanie testów wydaje się być kompletnym przedmiotem, istnieje kilka dedykowanych ram do testowania wykrywania:
Więcej informacji tutaj: https://wiki.python.org/moin/PythonTestingToolsTaxonomy
źródło
Ten skrypt BASH wykona najbardziej niepotrzebny katalog testowy Pythona z DOWOLNEGO systemu plików, bez względu na katalog roboczy, w którym się znajdujesz: katalog roboczy zawsze będzie tam, gdzie ten
test
katalog się znajduje.WSZYSTKIE TESTY, niezależne $ PWD
unittest moduł Pythona jest wrażliwy na bieżący katalog, chyba że powiesz mu gdzie (używając
discover -s
opcji).Jest to przydatne, gdy pozostajesz w katalogu roboczym
./src
lub./example
roboczym i potrzebujesz szybkiego ogólnego testu jednostkowego:WYBRANE TESTY, niezależne $ PWD
Nazywam ten plik narzędziowy
runone.py
i używam go w następujący sposób:Nie ma potrzeby, aby
test/__init__.py
plik obciążał pakiet / obciążenie pamięci podczas produkcji.źródło
Oto moje podejście, tworząc opakowanie do uruchamiania testów z wiersza poleceń:
Dla uproszczenia, proszę wybaczyć moje standardy kodowania inne niż PEP8 .
Następnie możesz utworzyć klasę BaseTest dla typowych komponentów dla wszystkich testów, aby każdy test wyglądał po prostu:
Aby uruchomić, wystarczy podać testy jako część argumentów wiersza poleceń, np .:
źródło