python py.test pytest

python - ¿Hay alguna manera de especificar qué pruebas de Pytest se ejecutan desde un archivo?



py.test (6)

¿Hay alguna manera de seleccionar pruebas de pytest para ejecutar desde un archivo? Por ejemplo, un archivo foo.txt que contiene 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?

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

Una opción es tener un pytest.mark en cada prueba, pero mi requisito es ejecutar diferentes combinaciones de pruebas desde diferentes archivos.

¿Hay alguna manera de especificar múltiples patrones y un nombre de archivo de prueba para cada patrón? ¿O hay una manera de especificar las rutas de prueba exactas en un archivo y alimentar ese archivo como entrada para pytest? ¿O hay una función de enlace que se puede utilizar para este propósito?


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 ejecutará TestMyClass.test_something pero no TestMyClass.test_method_simple .

Ejecute pruebas por ID de nodo

A cada prueba recopilada se le asigna un nodeid único que 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 decorador @pytest.mark.slow .

Para más información ver marks .

Ejecutar pruebas desde paquetes

pytest --pyargs pkg.testing

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

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


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 scripts de unittest , por lo que no garantizo que funcione con pytest nativo.

Aquí va:

  1. crear un nuevo subset_tests_directory , 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 los archivos están en test_directory . Tuve que arreglar varios de ellos ejecutando python foo.py , desde subset_tests_directory y corrigiendo según sea necesario.

  5. Una vez que los scripts de prueba se ejecutan correctamente, solo cd subset_tests_directory y pytest allí. 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.py luego 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.


De acuerdo con 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


Puede usar la opción -k 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á.


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


Tal vez usando el pytest_collect_file() puede analizar el contenido de un archivo .txt o .yaml donde 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.