C'è un modo per specificare quali test Pytest eseguire da un file?


190

C'è un modo per selezionare i pytesttest da eseguire da un file? Ad esempio, un file foo.txtcontenente un elenco di test da eseguire:

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

Oppure, c'è un modo per selezionare più test, senza schema comune nel nome del test, da diverse directory con pytest?

pytest -k <pattern> consente un singolo modello.

Un'opzione è quella di avere un pytest.markcontro ogni test, ma il mio requisito è quello di eseguire diverse combinazioni di test da file diversi.

Esiste un modo per specificare più pattern e un nome di file di prova per ciascun pattern?

O

Esiste un modo per specificare i percorsi di prova esatti in un file e alimentare quel file come input per pytest?

O

Esiste una funzione hook che può essere utilizzata per questo scopo?

Risposte:


231

È possibile utilizzare l' -kopzione per eseguire casi di test con modelli diversi:

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

Verranno eseguiti casi di test con nome test_001 e test_some_other_test deselezionando il resto dei casi di test.

Nota: questo selezionerà qualsiasi caso di test che inizia con test_001 o test_some_other_test . Ad esempio, se si dispone del test case test_0012 , verrà selezionato anche.


1
Grazie. Ma se c'è un test con lo stesso nome in foo.py e bar.py (diciamo test_001), finirà per essere eseguito da entrambi.
Sharad,

2
sì, qualsiasi cosa che corrisponda al modello verrà eseguita come ho già detto nella Nota
supamaze

Ma questo è un problema per me. Vorrei scegliere quali test eseguire da quale file.
Sharad,

@NamGVU `-k <nome metodo>`
supamaze

4
Dovrebbe esserepy.test path/to/test/file.py -k function_name_test
LittleZero,

91

Specifica dei test / selezione dei test

Pytest supporta diversi modi per eseguire e selezionare i test dalla riga di comando.

Esegui i test in un modulo

pytest test_mod.py

Esegui i test in una directory

pytest testing/

Esegui test per espressioni di parole chiave

pytest -k "MyClass and not method"

Questo eseguirà test che contengono nomi che corrispondono all'espressione di stringa fornita, che possono includere operatori Python che utilizzano nomi di file, nomi di classi e nomi di funzioni come variabili. L'esempio sopra verrà eseguito TestMyClass.test_somethingma non TestMyClass.test_method_simple.

Esegui test per ID nodo

Ad ogni test raccolto viene assegnato un unico nodeidche consiste nel nome del modulo seguito da specificatori come nomi di classe, nomi di funzioni e parametri dalla parametrizzazione, separati da ::caratteri.

Per eseguire un test specifico all'interno di un modulo:

pytest test_mod.py::test_func

Un altro esempio che specifica un metodo di test nella riga di comando:

pytest test_mod.py::TestClass::test_method

Esegui test per espressioni marker

pytest -m slow

Eseguirà tutti i test decorati con il @pytest.mark.slowdecoratore.

Per ulteriori informazioni, vedere i segni .

Esegui test dai pacchetti

pytest --pyargs pkg.testing

Ciò importerà pkg.testinge utilizzerà la posizione del suo filesystem per trovare ed eseguire i test da.

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


the test_mod.py::TestClass::test_method ha funzionato meglio per me
StephenGodderidge

1
dovrebbe contrassegnarlo come risposta accettata
Adam Hughes, il

13

Se hai lo stesso nome di metodo in due classi diverse e vuoi solo eseguirne una, funziona:

pytest tests.py -k 'TestClassName and test_method_name'

6

Metodo 1 : test selezionati casualmente. Lungo e brutto.

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

Metodo 2: utilizzare espressioni di parole chiave.

Nota: sto cercando per nomi di testcase. Lo stesso vale per i nomi TestClass.

Caso 1: il seguito verrà eseguito a seconda di quale sia stata trovata. Da quando abbiamo usato 'OR'.

python -m pytest -k 'test_password_valid or test_no_configuration'

Supponiamo che i due precedenti siano effettivamente corretti, verranno eseguiti 2 test.

Caso 2: ora un nome errato e un altro nome corretto.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Ne viene trovato ed eseguito solo uno.

Caso 3 : se si desidera eseguire tutti i test o nessuno, utilizzare AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Entrambi verranno eseguiti se corretti o nessuno.

Caso 4: eseguire il test solo in una cartella:

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

Caso 5: eseguire il test da un solo file.

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

Caso 6: esegui tutti i test tranne la partita.

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

2

La mia risposta fornisce un modo per eseguire un sottoinsieme di test in diversi scenari.

Esegui tutti i test in un progetto

pytest

Esegui i test in un'unica directory

Per eseguire tutti i test da una directory, utilizzare la directory come parametro per pytest:

pytest tests/my-directory

Eseguire i test in un singolo file / modulo di prova

Per eseguire un file pieno di test, elencare il file con il relativo percorso come parametro per pytest:

pytest tests/my-directory/test_demo.py

Esegui una singola funzione di test

Per eseguire una singola funzione di test, aggiungere ::e il nome della funzione di test:

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

-v viene utilizzato in modo da poter vedere quale funzione è stata eseguita.

Esegui una singola classe di test

Per eseguire solo una classe, fai come abbiamo fatto con le funzioni e aggiungi ::, quindi il nome della classe nel parametro file:

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

Esegui un metodo di test singolo di una classe di test

Se non vuoi eseguire tutta una classe di test, solo un metodo, basta aggiungerne un altro ::e il nome del metodo:

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

Eseguire una serie di test in base al nome del test

L' -kopzione consente di passare un'espressione per eseguire test con determinati nomi specificati dall'espressione come sottostringa del nome del test. È possibile usare e , o , e non creare espressioni complesse.

Ad esempio, per eseguire tutte le funzioni che hanno _raise nel loro nome:

pytest -v -k _raises

1

Secondo il documento su Esegui test per ID nodo

poiché hai tutti gli ID nodo in foo.txt, esegui semplicemente

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

questo è lo stesso con il comando seguente (con il contenuto del file nella domanda)

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

0

Forse usando pytest_collect_file()hook puoi analizzare il contenuto di un file .txto .yamldove i test sono specificati come desideri e restituirli al core pytest.

Un bell'esempio è mostrato nella documentazione di Pytest . Penso a quello che stai cercando.


0

Ecco una possibile risposta parziale, perché consente solo di selezionare gli script di test, non i singoli test all'interno di tali script.

Ed è anche limitato dal mio utilizzo della modalità di compatibilità legacy rispetto agli unittestscript, quindi non garantire che funzionerebbe con Pytest nativo.

Ecco qui:

  1. creare un nuovo dictory, diciamo subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. fare attenzione alle importazioni che implicitamente presuppongono che i file siano presenti test_directory. Ho dovuto risolvere alcuni di questi correndo python foo.py, dall'interno subset_tests_directorye correggendo secondo necessità.

  5. Una volta che gli script di test eseguito correttamente, solo cd subset_tests_directorye pytestlà. Pytest raccoglierà solo gli script che vede.

Un'altra possibilità è il collegamento simbolico all'interno della directory di test corrente, diciamo come ln -s foo.py subset_foo.pyallora pytest subset*.py. Ciò eviterebbe la necessità di regolare le importazioni, ma ingombrerebbe le cose fino a quando non si rimuovessero i collegamenti simbolici. Ha funzionato anche per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.