¿Hay alguna manera de seleccionar pytest
pruebas para ejecutar desde un archivo? Por ejemplo, un archivo que foo.txt
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?
pytest -k <pattern>
permite un solo patrón.
Una opción es tener un pytest.mark
contra 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?
py.test path/to/test/file.py -k function_name_test
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_something
pero noTestMyClass.test_method_simple
.Ejecutar pruebas por ID de nodo
A cada prueba recopilada se le asigna un nombre único
nodeid
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
@pytest.mark.slow
decorador.Para más información ver marcas .
Ejecutar pruebas desde paquetes
pytest --pyargs pkg.testing
Esto importará
pkg.testing
y 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
fuente
Si tiene el mismo nombre de método en dos clases diferentes y solo desea ejecutar una de ellas, esto funciona:
fuente
Método 1 : pruebas seleccionadas al azar. Largo y feo.
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'.
Digamos que los dos anteriores son realmente correctos, se ejecutarán 2 pruebas.
Caso 2: ahora un nombre incorrecto y otro nombre correcto.
Solo se encuentra uno y se ejecuta.
Caso 3 : si desea que se ejecuten todas las pruebas o ninguna, entonces use AND
Ambos se ejecutarán si son correctos o ninguno.
Caso 4: Ejecute la prueba solo en una carpeta:
Caso 5: Ejecute la prueba desde un solo archivo.
Caso 6: Ejecute todas las pruebas excepto el partido.
fuente
Según el documento sobre Ejecutar pruebas por ID de nodo
ya que tiene todos los identificadores de nodo en foo.txt, simplemente ejecute
Esto es lo mismo con el siguiente comando (con el contenido del archivo en la pregunta)
fuente
Mi respuesta proporciona una forma de ejecutar un subconjunto de pruebas en diferentes escenarios.
Ejecute todas las pruebas en un proyecto
Ejecutar pruebas en un solo directorio
Para ejecutar todas las pruebas desde un directorio, use el directorio como parámetro para
pytest
: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
: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:-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: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:Ejecute un conjunto de pruebas basadas en el nombre de la prueba
La
-k
opció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:
fuente
Tal vez usando
pytest_collect_file()
hook 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.
fuente
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
unittest
scripts, por lo que no garantizo que funcione con pytest nativo.Aquí va:
subset_tests_directory
.ln -s tests_directory/foo.py
ln -s tests_directory/bar.py
tenga cuidado con las importaciones que suponen implícitamente que hay archivos
test_directory
. Tuve que arreglar varios de ellos corriendopython foo.py
, desde dentrosubset_tests_directory
y corrigiendo según fuera necesario.Una vez que los scripts de prueba ejecutar correctamente, tal
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
entoncespytest 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.fuente