python py.test coverage.py

python - Usar py.test con cobertura no incluye importaciones



coverage.py (4)

Para Jedi , queremos generar nuestra cobertura de prueba . Hay una pregunta relacionada en stackoverflow, pero no ayudó.

Estamos utilizando py.test como corredor de prueba. Sin embargo, no podemos agregar las importaciones y otras cosas "importadas" al informe. Por ejemplo, __init__.py siempre se informa como descubierto:

Name Stmts Miss Cover -------------------------------------------------- jedi/__init__ 5 5 0% [..]

Claramente, este archivo se está importando y, por lo tanto, debe informarse como probado.

Comenzamos pruebas como esta [*]:

py.test --cov jedi

Como puede ver, estamos usando pytest-coverage .

Entonces, ¿cómo es posible contar correctamente la cobertura de archivos como __init__.py ?

[*] También intentamos comenzar la prueba sin --doctest-modules (eliminado de pytest.ini ) y activar el módulo de cobertura anteriormente por py.test -p pytest_cov --cov jedi . Ninguno de ellos trabaja.

He ofrecido una recompensa. Por favor, intenta arreglarlo dentro de Jedi. Está disponible públicamente.


@hynekcer me dio la idea correcta. Pero, básicamente, la solución más fácil se encuentra en otro lugar:

Deshazte de pytest-cov !

Utilizar

coverage run --source jedi -m py.test coverage report

¡¡¡en lugar!!! De esta forma, solo está ejecutando una cobertura en su configuración py.test actual, ¡que funciona perfectamente bien! También es filosóficamente el camino correcto: haga que cada programa haga una cosa bien: py.test ejecuta pruebas y la coverage verifica la cobertura del código.

Ahora esto puede sonar como una diatriba, pero realmente. pytest-cov no ha estado funcionando correctamente desde hace un tiempo. Algunas pruebas fallaron, solo porque lo usamos.

A partir de 2014 , pytest-cov parece haber cambiado de manos. py.test --cov jedi test parece ser un comando útil nuevamente (mira los comentarios). Sin embargo, no es necesario que lo use. Pero en combinación con xdist puede acelerar sus informes de cobertura.


En mi caso, todas las pruebas se ejecutan, pero la cobertura fue 0%.

La solución fue:

$ export PYTHONPATH="."

Después de que los resultados fueron correctos.

En los últimos problemas py.test problemas con el comando py.test tenía problemas para importar algo y la configuración de PYTHONPATH env var fue la solución. A mí también me funcionó esta vez.

Mi verdadero ejemplo con awslogs

Primero con PYTHONPATH unset:

$ py.test --cov=awslogs tests/ ========================================= test session starts ========================================= platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile: plugins: cov-2.2.0 collected 11 items tests/test_it.py ...........Coverage.py warning: No data was collected. --------------------------- coverage: platform linux2, python 2.7.9-final-0 --------------------------- Name Stmts Miss Cover ------------------------------------------- awslogs/__init__.py 2 2 0% awslogs/bin.py 85 85 0% awslogs/core.py 143 143 0% awslogs/exceptions.py 12 12 0% ------------------------------------------- TOTAL 242 242 0% ====================================== 11 passed in 0.38 seconds ======================================

La cobertura resultante es 0%.

Luego configuro el PYTHONPATH :

$ export PYTHONPATH="."

y vuelva a ejecutar la prueba:

$ py.test --cov=awslogs tests/ ========================================= test session starts ========================================= platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile: plugins: cov-2.2.0 collected 11 items tests/test_it.py ........... --------------------------- coverage: platform linux2, python 2.7.9-final-0 --------------------------- Name Stmts Miss Cover ------------------------------------------- awslogs/__init__.py 2 0 100% awslogs/bin.py 85 9 89% awslogs/core.py 143 12 92% awslogs/exceptions.py 12 2 83% ------------------------------------------- TOTAL 242 23 90% ====================================== 11 passed in 0.44 seconds ======================================

Ahora es la cobertura 90%.

ADVERTENCIA : La manipulación de PYTHONPATH puede tener efectos secundarios extraños. Actualmente me encuentro con el problema, ese paquete basado en pbr está creando un directorio de huevo cuando se construye distribuible y si PYTHONPATH está configurado en ".", Automáticamente considera que el paquete relacionado con el huevo está instalado. Por esta razón, dejé de usar pytest-cov y sigo los consejos para usar la herramienta de coverage .


Tuve este problema con py.test, la cobertura y el plugin django. Al parecer, los archivos del modelo se importan antes de que se inicie la cobertura. Ni siquiera funcionó la "cobertura de p" para la carga temprana del plugin de cobertura.

Lo arreglé (¿feo?) Al eliminar el módulo de modelos de sys.modules y volver a importarlo en el archivo de prueba que prueba el modelo:

import sys del sys.modules[''project.my_app.models''] from project.my_app import models def test_my_model(): ...


Arregle la cobertura de la prueba al 94% con este parche que simplifica las dependencias de importación y con el comando:

py.test --cov jedi test # or py.test --cov jedi test --cov-report=html # + a listing with red uncovered lines

Las líneas descubiertas están solo en comandos condicionales o en algunas funciones menos utilizadas, pero todos los encabezados están completamente cubiertos.

El problema era que la prueba de configuración de test/conftest.py sí importaba prematuramente por dependencias de casi todos los archivos del proyecto. El archivo de prueba también define opciones de línea de comando adicionales y configuraciones que se deben establecer antes de ejecutar la prueba. Por lo tanto, creo que el complemento pytest_cov funciona correctamente si ignora todo lo que se importó junto con este archivo, aunque es un problema. También __init__.py y settings.py del informe porque son simples y con la cobertura completa, pero también se importan prematuramente en la dependencia de conftest.