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:
-
crear un nuevo
subset_tests_directory
, digamossubset_tests_directory
. -
ln -s tests_directory/foo.py
-
ln -s tests_directory/bar.py
-
tenga cuidado con las importaciones que suponen implícitamente que los archivos están en
test_directory
. Tuve que arreglar varios de ellos ejecutandopython foo.py
, desdesubset_tests_directory
y corrigiendo según sea necesario. -
Una vez que los scripts de prueba se ejecutan correctamente, solo
cd subset_tests_directory
ypytest
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.