Czy istnieje sposób na wybranie pytest
testów do uruchomienia z pliku? Na przykład plik foo.txt
zawierający listę testów do wykonania:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
A może istnieje sposób na wybranie wielu testów, które nie mają wspólnego wzorca w nazwie testu, z różnych katalogów za pomocą pytest?
pytest -k <pattern>
pozwala na pojedynczy wzór.
Jedną z opcji jest wykonanie pytest.mark
testu przeciw każdemu testowi, ale moim wymaganiem jest uruchomienie różnych kombinacji testów z różnych plików.
Czy istnieje sposób na określenie wielu wzorców i nazwy pliku testowego dla każdego wzorca?
Lub
Czy istnieje sposób, aby określić dokładne ścieżki testowe w pliku i przesłać ten plik jako dane wejściowe pytest
?
Lub
Czy istnieje funkcja haka, którą można wykorzystać do tego celu?
py.test path/to/test/file.py -k function_name_test
Określanie testów / wybór testów
Pytest obsługuje kilka sposobów uruchamiania i wybierania testów z wiersza poleceń.
Uruchom testy w module
pytest test_mod.py
Uruchom testy w katalogu
pytest testing/
Uruchom testy według wyrażeń słów kluczowych
pytest -k "MyClass and not method"
Spowoduje to uruchomienie testów, które zawierają nazwy pasujące do podanego wyrażenia łańcuchowego, które mogą zawierać operatory Pythona, które używają nazw plików, nazw klas i nazw funkcji jako zmiennych. Powyższy przykład będzie działał,
TestMyClass.test_something
ale nieTestMyClass.test_method_simple
.Uruchom testy według identyfikatorów węzłów
Każdemu zebranemu testowi przypisywany jest unikalny,
nodeid
który składa się z nazwy pliku modułu, po której następują specyfikatory, takie jak nazwy klas, nazwy funkcji i parametry z parametryzacji, oddzielone znakiem::
znakami.Aby uruchomić określony test w module:
pytest test_mod.py::test_func
Kolejny przykład określający metodę testową w wierszu poleceń:
pytest test_mod.py::TestClass::test_method
Uruchom testy za pomocą wyrażeń znaczników
pytest -m slow
Przeprowadzi wszystkie testy, które są ozdobione
@pytest.mark.slow
dekoratorem.Aby uzyskać więcej informacji, zobacz oznaczenia .
Uruchom testy z pakietów
pytest --pyargs pkg.testing
Spowoduje to zaimportowanie
pkg.testing
i użycie lokalizacji systemu plików do znajdowania i uruchamiania testów.Źródło: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests
źródło
Jeśli masz tę samą nazwę metody w dwóch różnych klasach i chcesz po prostu uruchomić jedną z nich, działa to:
źródło
Metoda 1 : Losowo wybrane testy. Długie i brzydkie.
Metoda 2: użyj wyrażeń słów kluczowych.
Uwaga: szukam według nazw przypadków testowych. To samo dotyczy nazw TestClass.
Przypadek 1: Poniższe zostaną uruchomione cokolwiek zostanie znalezione. Ponieważ użyliśmy „OR”.
Powiedzmy, że powyższe dwa są faktycznie poprawne, zostaną przeprowadzone 2 testy.
Przypadek 2: Teraz niepoprawna nazwa i inna poprawna nazwa.
Tylko jeden został znaleziony i uruchomiony.
Przypadek 3 : Jeśli chcesz, aby wszystkie testy zostały uruchomione lub nie ma żadnego, użyj AND
Oba zostaną uruchomione, jeśli są poprawne lub żadne.
Przypadek 4: Uruchom test tylko w jednym folderze:
Przypadek 5: Uruchom test tylko z jednego pliku.
Przypadek 6: Przeprowadź wszystkie testy z wyjątkiem meczu.
źródło
Zgodnie z dokumentem o Uruchom testy według identyfikatorów węzłów
ponieważ masz wszystkie identyfikatory węzłów w foo.txt, po prostu uruchom
to samo dotyczy poniższego polecenia (z zawartością pliku w pytaniu)
źródło
Moja odpowiedź zawiera sposoby przeprowadzenia podzbioru testów w różnych scenariuszach.
Uruchom wszystkie testy w projekcie
Uruchom testy w jednym katalogu
Aby uruchomić wszystkie testy z jednego katalogu, użyj katalogu jako parametru do
pytest
:Uruchom testy w pojedynczym pliku / module testowym
Aby uruchomić plik pełen testów, podaj plik ze ścieżką względną jako parametr do
pytest
:Uruchom funkcję pojedynczego testu
Aby uruchomić pojedynczą funkcję testową, dodaj
::
i nazwę funkcji testowej:-v
jest używany, więc możesz zobaczyć, która funkcja została uruchomiona.Uruchom pojedynczą klasę testową
Aby uruchomić tylko klasę, zrób tak, jak zrobiliśmy z funkcjami i dodaj
::
, a następnie nazwę klasy do parametru pliku:Uruchom pojedynczą metodę testową klasy testowej
Jeśli nie chcesz uruchamiać całej klasy testowej, tylko jedną metodę, po prostu dodaj inną
::
i nazwę metody:Uruchom zestaw testów na podstawie nazwy testu
-k
Opcja pozwala przechodzić w wyrażeniu, aby przeprowadzić testy, które mają niektóre nazwy określonych przez wyrażenie jako fragmentu nazwy testu. Możliwe jest użycie i , lub , a nie tworzenie złożonych wyrażeń.Na przykład, aby uruchomić wszystkie funkcje, które mają w nazwie _raises:
źródło
Może za pomocą
pytest_collect_file()
hooka możesz przeanalizować zawartość pliku.txt
o.yaml
, w którym testy są określone tak, jak chcesz, i zwrócić je do jądra pytest.Ładny przykład jest pokazany w dokumentacji pytest . Myślę, że to czego szukasz.
źródło
Oto możliwa częściowa odpowiedź, ponieważ umożliwia ona tylko wybranie skryptów testowych, a nie poszczególnych testów w tych skryptach.
Jest to również ograniczone przez używanie starszego trybu zgodności ze
unittest
skryptami, więc nie gwarantuje się, że będzie działać z natywnym pytest.Tutaj idzie:
subset_tests_directory
.ln -s tests_directory/foo.py
ln -s tests_directory/bar.py
uważaj na import, który domyślnie zakłada, że pliki są w formacie
test_directory
. Musiałem naprawić kilka z nich, biegającpython foo.py
od wewnątrzsubset_tests_directory
i korygując je w razie potrzeby.Gdy skrypty testowe wykonają się poprawnie, po prostu
cd subset_tests_directory
i gotowepytest
. Pytest odbierze tylko te skrypty, które zobaczy.Inną możliwością jest symlinking ciągu bieżącego katalogu testów, powiedzieć, jak
ln -s foo.py subset_foo.py
wtedypytest subset*.py
. Pozwoliłoby to uniknąć konieczności dostosowywania importu, ale zaśmiecałoby wszystko, dopóki nie usuniesz linków symbolicznych. U mnie też zadziałało.źródło