¿Hay alguna manera de especificar qué pruebas de pytest se ejecutan desde un archivo?

190

¿Hay alguna manera de seleccionar pytestpruebas para ejecutar desde un archivo? Por ejemplo, un archivo que foo.txtcontiene una lista de pruebas a ejecutar:

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

¿O hay una manera de seleccionar múltiples pruebas, que no tienen un patrón común en el nombre de la prueba, de diferentes directorios con pytest?

pytest -k <pattern> permite un solo patrón.

Una opción es tener un pytest.markcontra cada prueba, pero mi requisito es ejecutar una combinación diferente de pruebas de diferentes archivos.

¿Hay alguna manera de especificar múltiples patrones y un nombre de archivo de prueba para cada patrón?

O

¿Hay alguna manera de especificar las rutas de prueba exactas en un archivo y alimentar ese archivo como entrada pytest?

O

¿Existe una función de enlace que se pueda utilizar para este propósito?

Sharad
fuente

Respuestas:

231

Puede usar la -kopción para ejecutar casos de prueba con diferentes patrones:

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

Esto ejecutará casos de prueba con el nombre test_001 y test_some_other_test deseleccionando el resto de los casos de prueba.

Nota: Esto seleccionará cualquier caso de prueba que comience con test_001 o test_some_other_test . Por ejemplo, si tiene el caso de prueba test_0012 , también se seleccionará.

supamaze
fuente
1
Gracias. Pero si hay una prueba con el mismo nombre en foo.py y bar.py (digamos test_001), terminará ejecutándose desde ambos.
Sharad
2
sí, cualquier cosa que coincida con el patrón se ejecutará como he mencionado en la Nota
supamaze
Pero eso es un problema para mí. Me gustaría elegir qué pruebas ejecutar desde qué archivo.
Sharad
@NamGVU `-k <nombre del método de prueba>`
supamaze
44
Debería serpy.test path/to/test/file.py -k function_name_test
LittleZero
91

Especificar pruebas / seleccionar pruebas

Pytest admite varias formas de ejecutar y seleccionar pruebas desde la línea de comandos.

Ejecutar pruebas en un módulo

pytest test_mod.py

Ejecutar pruebas en un directorio

pytest testing/

Ejecutar pruebas por expresiones de palabras clave

pytest -k "MyClass and not method"

Esto ejecutará pruebas que contienen nombres que coinciden con la expresión de cadena dada, que puede incluir operadores de Python que usan nombres de archivos, nombres de clases y nombres de funciones como variables. El ejemplo anterior se ejecutará TestMyClass.test_somethingpero no TestMyClass.test_method_simple.

Ejecutar pruebas por ID de nodo

A cada prueba recopilada se le asigna un nombre único nodeidque consiste en el nombre de archivo del módulo seguido de especificadores como nombres de clase, nombres de función y parámetros de parametrización, separados por ::caracteres.

Para ejecutar una prueba específica dentro de un módulo:

pytest test_mod.py::test_func

Otro ejemplo que especifica un método de prueba en la línea de comando:

pytest test_mod.py::TestClass::test_method

Ejecutar pruebas por expresiones de marcador

pytest -m slow

Ejecutará todas las pruebas que están decoradas con el @pytest.mark.slowdecorador.

Para más información ver marcas .

Ejecutar pruebas desde paquetes

pytest --pyargs pkg.testing

Esto importará pkg.testingy usará su ubicación del sistema de archivos para buscar y ejecutar pruebas.

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

Amritpal Singh
fuente
test_mod.py::TestClass::test_method funcionó mejor para mí
StephenGodderidge
1
debería marcar esto como respuesta aceptada
Adam Hughes
13

Si tiene el mismo nombre de método en dos clases diferentes y solo desea ejecutar una de ellas, esto funciona:

pytest tests.py -k 'TestClassName and test_method_name'
Peter
fuente
6

Método 1 : pruebas seleccionadas al azar. Largo y feo.

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

Método 2: usar expresiones de palabras clave.

Nota: Estoy buscando por nombres de casos de prueba. Lo mismo se aplica a los nombres de TestClass.

Caso 1: lo siguiente se ejecutará lo que se encuentre. Como hemos usado 'OR'.

python -m pytest -k 'test_password_valid or test_no_configuration'

Digamos que los dos anteriores son realmente correctos, se ejecutarán 2 pruebas.

Caso 2: ahora un nombre incorrecto y otro nombre correcto.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Solo se encuentra uno y se ejecuta.

Caso 3 : si desea que se ejecuten todas las pruebas o ninguna, entonces use AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Ambos se ejecutarán si son correctos o ninguno.

Caso 4: Ejecute la prueba solo en una carpeta:

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

Caso 5: Ejecute la prueba desde un solo archivo.

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

Caso 6: Ejecute todas las pruebas excepto el partido.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'
Arindam Roychowdhury
fuente
1

Según el documento sobre Ejecutar pruebas por ID de nodo

ya que tiene todos los identificadores de nodo en foo.txt, simplemente ejecute

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

Esto es lo mismo con el siguiente comando (con el contenido del archivo en la pregunta)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
fuente
1

Mi respuesta proporciona una forma de ejecutar un subconjunto de pruebas en diferentes escenarios.

Ejecute todas las pruebas en un proyecto

pytest

Ejecutar pruebas en un solo directorio

Para ejecutar todas las pruebas desde un directorio, use el directorio como parámetro para pytest:

pytest tests/my-directory

Ejecute pruebas en un solo archivo / módulo de prueba

Para ejecutar un archivo lleno de pruebas, enumere el archivo con la ruta relativa como parámetro para pytest:

pytest tests/my-directory/test_demo.py

Ejecute una función de prueba única

Para ejecutar una sola función de prueba, agregue ::y el nombre de la función de prueba:

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

-v se usa para que pueda ver qué función se ejecutó.

Ejecute una clase de prueba única

Para ejecutar solo una clase, haga lo que hicimos con las funciones y agregue ::, luego el nombre de la clase al parámetro del archivo:

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

Ejecutar un método de prueba único de una clase de prueba

Si no desea ejecutar toda una clase de prueba, solo un método, simplemente agregue otro ::y el nombre del método:

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

Ejecute un conjunto de pruebas basadas en el nombre de la prueba

La -kopción le permite pasar una expresión para ejecutar pruebas que tienen ciertos nombres especificados por la expresión como una subcadena del nombre de la prueba. Es posible usar y , o , y no crear expresiones complejas.

Por ejemplo, para ejecutar todas las funciones que tienen _raises en su nombre:

pytest -v -k _raises
lmiguelvargasf
fuente
0

Tal vez usando pytest_collect_file()hook puede analizar el contenido de un archivo .txto .yamldonde las pruebas se especifican como desee y devolverlas al núcleo de pytest.

Un buen ejemplo se muestra en la documentación de pytest . Pienso lo que estás buscando.

asterio gonzalez
fuente
0

Aquí hay una posible respuesta parcial, porque solo permite seleccionar los scripts de prueba, no las pruebas individuales dentro de esos scripts.

Y también está limitado por mi uso del modo de compatibilidad heredado frente a los unittestscripts, por lo que no garantizo que funcione con pytest nativo.

Aquí va:

  1. crear un nuevo diccionario, digamos subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. tenga cuidado con las importaciones que suponen implícitamente que hay archivos test_directory. Tuve que arreglar varios de ellos corriendo python foo.py, desde dentro subset_tests_directoryy corrigiendo según fuera necesario.

  5. Una vez que los scripts de prueba ejecutar correctamente, tal cd subset_tests_directoryy pytestallí. Pytest solo recogerá los scripts que ve.

Otra posibilidad es hacer enlaces simbólicos dentro de su directorio de prueba actual, digamos como ln -s foo.py subset_foo.pyentonces pytest subset*.py. Eso evitaría la necesidad de ajustar sus importaciones, pero desordenaría las cosas hasta que elimine los enlaces simbólicos. Me funcionó a mi también.

JL Peyret
fuente