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.

Intento de importación relativa sin paquete principal conocido al realizar pruebas automatizadas.

Mi estructura de carpetas simplificada es la siguiente:
 

projectroot/
    __init__.py
    src/
       __init__.py
       util.py
    tests/
       __init__.py
       test_util.py

En util.py tengo la siguiente función:

def build_format_string(date: bool = True, time: bool = True) -> str:
    format_str = ""
    if date: 
        format_str += "%Y-%m-%d"
    if time:
        if format_str[-1] != " ":
            format_str += " "
        format_str += "%H:%M:%S"
    return format_str

He escrito la función correspondiente test_build_format_string dentro de test_util.py de la siguiente manera:

from ..src.util import build_format_string
import pytest

@pytest.mark.parametrize('date, time, expected', [(True, True, "%Y-%m-%d %H:%M:%S")])
def test_build_format_string(date, time, expected):
    assert type(date) == bool, f"date arg of build_format_string must be boolean, not {type(date)}!"
    assert type(time) == bool, f"time arg of build_format_string must be boolean, not {type(time)}!"
    assert build_format_string(date, time) == expected,  f"""Result of build_format_string when called with date={date} and time={time} 
                                                         must be {expected}; got {build_format_string(date, time)} instead."""

Al ejecutar la prueba automatizada desde la línea de comandos usando python -m pytest test_util.py o py.test test_util.py, obtengo el mensaje de error attempted relative import beyond top-level package, mientras que al ejecutar test_util.py en modo de depuración en mi editor de código, obtengo un error similar attempted relative import with no known parent package.

Ya he leído muchos comentarios en SO sobre este error muy frecuente, pero ahora estoy más confundido que antes. En muchos de ellos, leí que __init__.py debería colocarse en cada carpeta y subcarpeta, pero esto es exactamente lo que tengo aquí; sin embargo, las importaciones relativas no funcionan. Pero sin importar la(s) función(es) ubicada(s) en src.util, no puedo ejecutar mis pruebas automatizadas. ¿Cómo puedo hacer que esto funcione?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error “attempted relative import beyond top-level package” ocurre cuando Python no puede encontrar el paquete raíz. En este caso específico, el error ocurre porque el archivo de prueba está intentando importar una función de un módulo que se encuentra en un directorio diferente.

    Para solucionar este problema, debemos estructurar correctamente nuestro paquete para que Python pueda encontrar el paquete raíz. Se deben seguir los siguientes pasos:

    1. Mover el archivo test_util.py al directorio raíz del proyecto. Queremos que el archivo de prueba esté en el mismo nivel que el directorio src.
    2. Actualizar la declaración de importación en test_util.py a from src.util import build_format_string. Esto permitirá que Python encuentre el módulo util.py ya que se encuentra dentro del directorio src.

    3. Modificar el archivo __init__.py ubicado en el directorio raíz del proyecto para incluir el siguiente código: from .src.util import build_format_string. Esto permitirá que la función build_format_string se pueda utilizar como una importación a nivel de módulo.

    4. Por último, asegurarse de que el entorno virtual, si se está utilizando uno, esté correctamente configurado y activado.

    Una vez que se realicen estos pasos, ejecutar el comando python -m pytest desde el directorio raíz del proyecto debería funcionar, y el archivo test_util.py será detectado y ejecutado.

Comments are closed.