with tutorial framework español djangoproject desde con cero applications python unit-testing python-3.x coverage.py

tutorial - ¿Cómo usar adecuadamente la cobertura.py en Python?



tutorial django (2)

Cobertura busca un archivo .coverage para leer y generar ese informe para usted. Py.test por sí solo no crea uno. Necesitas el complemento py.test para la cobertura:

pip install pytest-cov

Si ya lo tienes, puedes ejecutar ambos a la vez así:

py.test test.py --cov=sample.py

Lo que significa ejecutar el módulo de prueba test.py y grabar / mostrar el informe de cobertura en sample.py .

Si necesita realizar varias pruebas y acumular su cobertura grabada y luego mostrar un informe final, puede ejecutarlo de la siguiente manera:

py.test test.py --cov=sample.py --cov-report= py.test test.py --cov=sample2.py --cov-report= py.test test.py --cov=sample3.py --cov-report=

Lo que significa ejecutar el módulo de prueba test.py y grabar (solo) la cobertura en sample.py , no mostrar un informe.

Ahora puede ejecutar el comando de cobertura por separado para un informe completo:

coverage report -m

El comando anterior simplemente muestra un informe de cobertura formateado basado en el archivo de datos de .coverage acumulados de ejecuciones de prueba anteriores. -m significa mostrar líneas perdidas, es decir, líneas no cubiertas por pruebas:

Name Stmts Miss Cover Missing ----------------------------------------- sample.py 6 0 100%

La cobertura admite más conmutadores como --include y --omit para incluir / excluir archivos usando patrones de ruta. Para obtener más información, consulte sus documentos: https://coverage.readthedocs.io/en/coverage-4.5.1/cmd.html#reporting

Acabo de comenzar a usar el módulo Coverage.py y, por lo tanto, decidí hacer una prueba simple para verificar cómo funciona.

Muestra.py

def sum(num1, num2): return num1 + num2 def sum_only_positive(num1, num2): if num1 > 0 and num2 > 0: return num1 + num2 else: return None

test.py

from sample import sum, sum_only_positive def test_sum(): assert sum(5, 5) == 10 def test_sum_positive_ok(): assert sum_only_positive(2, 2) == 4 def test_sum_positive_fail(): assert sum_only_positive(-1, 2) is None

Como ves, todo mi código está cubierto con pruebas y py.test dice que todos pasan. Espero que Coverage.py muestre una cobertura del 100%. Bueno no.

Bueno, es posible que Coverage.py no vea el archivo test.py, así que copié las funciones de prueba en sample.py archivo sample.py y ejecuté la cobertura nuevamente:

Luego agregué este bloque de código:

if __name__ == "__main__": print(sum(2, 4)) print(sum_only_positive(2, 4)) print(sum_only_positive(-1, 3))

y eliminado todas las funciones de prueba. Después de eso, Coverage.py muestra el 100%:

¿Por que es esto entonces? ¿No debería Coverage.py mostrar la cobertura de prueba de código, no solo la cobertura de ejecución? He leído un F.A.Q. oficial para Coverage.py, pero no puedo encontrar la solución.
Dado que muchos usuarios de SO están familiarizados con las pruebas de código y la cobertura de código, espero que puedan decirme dónde me equivoco.

Solo tengo un pensamiento aquí: Coverage.py puede simplemente ver qué líneas de código no se ejecutan, por lo que debería escribir pruebas para esas líneas. Pero hay líneas que ya se ejecutan pero no están cubiertas con pruebas, por lo que Coverage.py fallará aquí.


Es un poco difícil de analizar a través de sus experimentos, y no ha incluido las líneas de comando que utilizó con cada experimento. Pero: si ejecuta las pruebas con:

python -m py.test test.py

entonces puedes ejecutarlos bajo cobertura.py con:

coverage run -m py.test test.py