Czy istnieje sposób określenia, które testy pytest mają być uruchamiane z pliku?

190

Czy istnieje sposób na wybranie pytesttestów do uruchomienia z pliku? Na przykład plik foo.txtzawierają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.marktestu 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?

Sharad
źródło

Odpowiedzi:

231

Możesz użyć -kopcji, aby uruchomić przypadki testowe z różnymi wzorcami:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

Spowoduje to uruchomienie przypadków testowych o nazwie test_001 i test_some_other_test, co spowoduje usunięcie zaznaczenia pozostałych przypadków testowych.

Uwaga: spowoduje to wybranie dowolnego przypadku testowego zaczynającego się od test_001 lub test_some_other_test . Na przykład, jeśli masz przypadek testowy test_0012 , również zostanie wybrany.

supamaze
źródło
1
Dzięki. Ale jeśli istnieje test o tej samej nazwie w foo.py i bar.py (powiedzmy test_001), zakończy się wykonanie z obu.
Sharad
2
tak, będzie, wszystko, co pasuje do wzorca, zostanie wykonane tak, jak wspomniałem w
notatce
Ale to dla mnie problem. Chciałbym wybrać, które testy mają zostać wykonane z jakiego pliku.
Sharad
@NamGVU `-k <nazwa metody testu>`
supamaze
4
Powinno byćpy.test path/to/test/file.py -k function_name_test
LittleZero
91

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_somethingale nie TestMyClass.test_method_simple.

Uruchom testy według identyfikatorów węzłów

Każdemu zebranemu testowi przypisywany jest unikalny, nodeidktó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.slowdekoratorem.

Aby uzyskać więcej informacji, zobacz oznaczenia .

Uruchom testy z pakietów

pytest --pyargs pkg.testing

Spowoduje to zaimportowanie pkg.testingi 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

Amritpal Singh
źródło
test_mod.py::TestClass::test_method działał najlepiej dla mnie
StephenGodderidge
1
powinien oznaczyć to jako zaakceptowaną odpowiedź
Adam Hughes
13

Jeśli masz tę samą nazwę metody w dwóch różnych klasach i chcesz po prostu uruchomić jedną z nich, działa to:

pytest tests.py -k 'TestClassName and test_method_name'
Piotr
źródło
6

Metoda 1 : Losowo wybrane testy. Długie i brzydkie.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

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”.

python -m pytest -k 'test_password_valid or test_no_configuration'

Powiedzmy, że powyższe dwa są faktycznie poprawne, zostaną przeprowadzone 2 testy.

Przypadek 2: Teraz niepoprawna nazwa i inna poprawna nazwa.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Tylko jeden został znaleziony i uruchomiony.

Przypadek 3 : Jeśli chcesz, aby wszystkie testy zostały uruchomione lub nie ma żadnego, użyj AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Oba zostaną uruchomione, jeśli są poprawne lub żadne.

Przypadek 4: Uruchom test tylko w jednym folderze:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

Przypadek 5: Uruchom test tylko z jednego pliku.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

Przypadek 6: Przeprowadź wszystkie testy z wyjątkiem meczu.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'
Arindam Roychowdhury
źródło
1

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

pytest `cat foo.txt | tr '\n' ' '`

to samo dotyczy poniższego polecenia (z zawartością pliku w pytaniu)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
źródło
1

Moja odpowiedź zawiera sposoby przeprowadzenia podzbioru testów w różnych scenariuszach.

Uruchom wszystkie testy w projekcie

pytest

Uruchom testy w jednym katalogu

Aby uruchomić wszystkie testy z jednego katalogu, użyj katalogu jako parametru do pytest:

pytest tests/my-directory

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:

pytest tests/my-directory/test_demo.py

Uruchom funkcję pojedynczego testu

Aby uruchomić pojedynczą funkcję testową, dodaj ::i nazwę funkcji testowej:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-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:

pytest -v tests/my-directory/test_demo.py::TestClassName

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:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

Uruchom zestaw testów na podstawie nazwy testu

-kOpcja 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:

pytest -v -k _raises
lmiguelvargasf
źródło
0

Może za pomocą pytest_collect_file()hooka możesz przeanalizować zawartość pliku .txto .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.

asterio gonzalez
źródło
0

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 unittestskryptami, więc nie gwarantuje się, że będzie działać z natywnym pytest.

Tutaj idzie:

  1. powiedzmy, stwórz nowy dyktando subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. uważaj na import, który domyślnie zakłada, że ​​pliki są w formacie test_directory. Musiałem naprawić kilka z nich, biegając python foo.pyod wewnątrz subset_tests_directoryi korygując je w razie potrzeby.

  5. Gdy skrypty testowe wykonają się poprawnie, po prostu cd subset_tests_directoryi gotowe pytest. 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.pywtedy pytest 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.

JL Peyret
źródło