es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python 3.7 pytest coverage marca los bloques “if” sin declaraciones de “else” como no cubiertos.

Cuando ejecuto la prueba, el código en el bloque “if” es llamado y ejecutado. Sin embargo, pytest-coverage lo marca como ausente (la cobertura disminuye).

Está sin cubrir si escribo así:

if some_working_condition:
    do_smth()

Pero si agrego una declaración “else”, marca el bloque “if” como cubierto.

if some_working_condition:
    do_smth()
else:
    print("failed")

Utilizo python==3.7.12, pytest==6.2.5, pytest-cov==3.0.0 y coverage==6.2.

¿Por qué funciona así y cómo puedo resolverlo? No puedo agregar una declaración “else” porque la acción en el “if” debe ejecutarse en una condición específica sin una acción para el “else”.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual agregar una declaración “else” marca el bloque “if” como cubierto es porque pytest-cov considera que un bloque de código está cubierto si se ha recorrido cada posible camino de ejecución. En el ejemplo sin la declaración “else”, existe un camino posible donde “some_working_condition” es False y por lo tanto “do_smth()” no se ejecuta, por lo que se marca como no cubierto. Sin embargo, en el ejemplo con la declaración “else”, ambos caminos de ejecución (donde “some_working_condition” es True y False) llevan a que se ejecute un bloque de código, y por lo tanto se marca como cubierto.

    Una forma de resolver este problema sin agregar una declaración “else” es usar la expresión condicional (también conocida como operador ternario), de la siguiente manera:

    do_smth() if some_working_condition else None
    

    Esto básicamente condensa la declaración “if” en una sola línea, y devuelve None si “some_working_condition” es False. La línea de código sigue considerándose cubierta por pytest-cov ya que se ha recorrido cada posible camino de ejecución.

    Otra opción es agregar un comentario al bloque “if” para indicar que se ha decidido intencionalmente no cubrirlo, de la siguiente manera:

    if some_working_condition:
        do_smth()  # pragma: no cover
    

    El comentario “pragma: no cover” le indica a coverage.py que ignore esa línea al calcular la cobertura de código. Esto puede ser útil en casos en los que se sabe que una línea en particular no se ejecutará en circunstancias normales y no se desea que afecte el porcentaje de cobertura general.

    En última instancia, la mejor opción depende de su caso de uso específico y de los estándares de codificación.

Comments are closed.