Există o modalitate de a specifica ce teste pytest să ruleze dintr-un fișier? (Programare, Python, Pytest)

Sharad a intrebat.

Există o modalitate de a selecta pytest teste pentru a le rula dintr-un fișier?De exemplu, un fișier foo.txt care conține o listă de teste care urmează să fie executate:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Sau, există o modalitate de a selecta mai multe teste, fără un model comun în numele testului, din directoare diferite cu pytest?

pytest -k <pattern> permite un singur model.

O opțiune este de a avea un fișier pytest.mark pentru fiecare test, dar cerința mea este de a executa diferite combinații de teste din fișiere diferite.

Există o modalitate de a specifica mai multe modele și un nume de fișier de test pentru fiecare model?

Sau

Există o modalitate de a specifica căile exacte de testare într-un fișier și de a introduce acel fișier ca intrare pentru pytest?

Sau

Există o funcție cârlig care poate fi utilizată în acest scop?

8 răspunsuri
supamaze

Puteți utiliza -k opțiunea pentru a rula cazuri de testare cu diferite modele:

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

Acest lucru va rula cazuri de testare cu numele test_001 și test_un_alt_test deselectarea celorlalte cazuri de testare.

Notă: Acest lucru va selecta orice caz de testare care începe cu test_001 sau test_some_other_test. De exemplu, dacă aveți cazul de testare test_0012 acesta va fi, de asemenea, selectat.

Comentarii

  • Vă mulțumim. Dar dacă există un test cu același nume în foo.py și bar.py (să spunem test_001), se va ajunge să se execute din ambele. –  > Por Sharad.
  • da, orice lucru care se potrivește cu modelul va fi executat, așa cum am menționat în Notă –  > Por supamaze.
  • Dar aceasta este o problemă pentru mine. Aș dori să aleg ce teste să execut din ce fișier. –  > Por Sharad.
  • @NamGVU ` -k <test method name>` -k <test method name>`.  > Por supamaze.
  • Ar trebui să fie py.test path/to/test/file.py -k function_name_test –  > Por LittleZero.
Amritpal Singh

Specificarea testelor / selectarea testelor

Pytest suportă mai multe moduri de a rula și selecta testele din linia de comandă.

Executarea testelor într-un modul

pytest test_mod.py

Rulați testele într-un director

pytest testing/

Rularea testelor prin expresii de cuvinte cheie

pytest -k "MyClass and not method"

Aceasta va rula testele care conțin nume care se potrivesc cu expresia de șir de caractere dată, care poate include operatori Python care utilizează nume de fișiere, nume de clase și nume de funcții ca variabile. Exemplul de mai sus va rula TestMyClass.test_something dar nu și TestMyClass.test_method_simple.

Run tests by node ids (Executați testele după id-uri de nod)

Fiecărui test colectat i se atribuie un id unic nodeid care constă din numele de fișier al modulului urmat de specificatori cum ar fi nume de clase, nume de funcții și parametri din parametrizări, separate prin :: caractere.

Pentru a rula un test specific în cadrul unui modul:

pytest test_mod.py::test_func

Un alt exemplu de specificare a unei metode de testare în linia de comandă:

pytest test_mod.py::TestClass::test_method

Executarea testelor prin expresii de marcare

pytest -m slow

Va rula toate testele care sunt decorate cu expresia @pytest.mark.slow decorator.

Pentru mai multe informații, consultați mărci.

Rularea testelor din pachete

pytest --pyargs pkg.testing

Acest lucru va importa pkg.testing și va utiliza locația din sistemul de fișiere pentru a găsi și a rula testele din.

Sursa: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests

Comentarii

  • test_mod.py::TestClass::test_method a funcționat cel mai bine pentru mine –  > Por StephenGodderidge.
lmiguelvargasf

Răspunsul meu oferă o modalitate de a rula un subset de test în diferite scenarii.

Rulați toate testele dintr-un proiect

pytest

Rulați testele într-un singur director

Pentru a rula toate testele dintr-un singur director, utilizați directorul ca parametru pentrupytest:

pytest tests/my-directory

Run tests in a Single Test File/Modul

Pentru a rula un fișier plin de teste, enumerați fișierul cu calea relativă ca parametru la pytest:

pytest tests/my-directory/test_demo.py

Run a Single Test Function (Executarea unei singure funcții de testare)

Pentru a rula o singură funcție de testare, adăugați :: și numele funcției de testare:

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

-v pentru a putea vedea ce funcție a fost executată.

Executarea unei singure clase de testare

Pentru a rula doar o clasă, procedați la fel ca în cazul funcțiilor și adăugați ::, , apoi numele clasei la parametrul de fișier:

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

Rulați o singură metodă de testare a unei clase de testare

Dacă nu doriți să rulați întreaga clasă de testare, ci doar o singură metodă, adăugați doar un alt parametru :: și numele metodei:

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

Rulați un set de teste pe baza numelui testului

Adresa -k vă permite să introduceți o expresie pentru a rula testele care au anumite nume specificate de expresie ca subșir al numelui testului.Este posibil să folosiți și, , sau, , și nu pentru a crea expresii complexe.

De exemplu, pentru a rula toate funcțiile care au _raises în numele lor:

pytest -v -k _raises

Comentarii

  • Interesant este că se pare că unele dintre acestea se extind și la testele parametrizate, de exemplu, dacă testul dvs. se execută sub numele test_demo.py::test_function[test_parameters_1] atunci puteți da acest lucru în linia de comandă pentru a rula doar această instanță de parametru. –  > Por Ben Farmer.
Peter

Dacă aveți același nume de metodă în două clase diferite și doriți să executați doar una dintre ele, acest lucru funcționează:

pytest tests.py -k 'TestClassName and test_method_name'

Arindam Roychowdhury

Metoda 1: Teste selectate aleatoriu. Lungă și urâtă.

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

Metoda 2 : Utilizați expresii de cuvinte cheie.

Notă: Caut după nume de teste. Același lucru se aplică și la numele TestClass.

Cazul 1: Se va executa ceea ce se găsește mai jos. Deoarece am folosit „OR” .

python -m pytest -k 'test_password_valid or test_no_configuration'

Să spunem că cele două de mai sus sunt de fapt corecte, vor fi rulate 2 teste.

Cazul 2: Acum un nume incorect și un alt nume corect.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Se găsește și se execută doar unul singur.

Cazul 3: Dacă doriți ca toate testele să fie rulate sau niciunul, atunci utilizați AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Ambele vor fi rulate dacă sunt corecte sau nici unul.

Cazul 4: Executați testul numai într-un singur dosar:

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

Cazul 5: Executați testul dintr-un singur fișier.

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

Cazul 6: Executați toate testele cu excepția celui de potrivire.

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

asterio gonzalez

Poate folosind pytest_collect_file() hook puteți analiza conținutul unui fișier .txt o .yaml fișier în care testele sunt specificate așa cum doriți, și să le returnați la nucleul pytest.

Un exemplu frumos este prezentat în fișierul documentația pytest. Cred că este ceea ce căutați.

接口夏季

Conform documentului despre Run tests by node ids (Executarea testelor în funcție de ID-urile nodurilor)

din moment ce aveți toate id-urile de nod în foo.txt, trebuie doar să rulați

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

aceasta este aceeași cu comanda de mai jos (cu conținutul fișierului din întrebare)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

JL Peyret

Iată un posibil răspuns parțial, deoarece permite doar selectarea scripturilor de testare, nu și a testelor individuale din cadrul acestor scripturi.

Și este, de asemenea, limitat de faptul că folosesc modul de compatibilitate moștenit față de unittest scripturi, deci nu garantez că ar funcționa cu pytest nativ.

Iată ce se întâmplă:

  1. creați un nou dicționar, să zicem subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. fiți atenți la importurile care presupun implicit că fișierele sunt în test_directory. A trebuit să repar câteva dintre acestea rulând python foo.py, , din interiorul subset_tests_directory și corectând după caz.

  5. Odată ce scripturile de testare se execută corect, trebuie doar cd subset_tests_directory și pytest acolo. Pytest va prelua doar scripturile pe care le vede.

O altă posibilitate este crearea unei legături simbolice în directorul de testare curent, de exemplu ca ln -s foo.py subset_foo.py apoi pytest subset*.py. Acest lucru ar evita necesitatea de a vă ajusta importurile, dar ar aglomera lucrurile până când veți elimina legăturile simbolice. A funcționat și pentru mine.