Problèmes projet : ModuleNotFoundError

Bonjour,

Dans un de mes derniers projets (pour un de mes cours), en voulant faire du tests unitaires j’ai importé une de mes classes pour y faire des tests unitaires, et en lançant un test unitaire basique j’ai eu l’erreur suivante :

Traceback (most recent call last):
  File "....\flopbox\tests\test_auth.py", line 1, in <module>
    from src.flopbox.authentification import FlopBoxAuth
ModuleNotFoundError: No module named 'src'

Je tourne sur Python 3.10.6, et pour le moment durant mes projets python, j’ai été confronté toujours à ce problème. J’ai écumé pas mal les forums sur ce souci, et le seul qui fonctionnait c’est de mettre des fichiers __init__.py à chaque profondeur de mon projet.
Sauf que pour ce projet, cette solution sans que je trouve comment régler.

J’ai lu qu’utiliser les fichiers __init__.py ne devraient pas se faire pour ma version Python d’installé mais je n’ai trouvé que ça qui ne fonctionnait.

Si quelqu’un pourrait m’expliquer plus en détail ce qui ne va pas pour que je ne fasse plus l’erreur à l’avenir, je serai ravie.

Dans ce cadre-ci la structure de mon projet était :

.
└── project
    └── src
        ├── flopbox
            ├── __init__.py
            ├── flopbox_alias.py
            ├── flopbox_api.py
            ├── ftp_handler.py
            └── main.py
    └── tests
            ├── __init__.py
            └── test_auth.py

Dans mon fichier de test unitaire j’ai :

from src.flopbox.authentification import FlopBoxAuth
import unittest

class TestString(unittest.TestCase):
    def test_should_capitalize_string(self):
        string = "hello"
        expected_value = "Hello"
        self.assertEqual(string.capitalize(), expected_value)

if __name__ == "__main__":
    unittest.main()

Sachant que j’ai ce problème peu importe où je souhaite placer le package tests et peu importe si j’ajoute les fichiers __init__.py ou non. Egalement là je ne crée pas d’instance de ma classe dans les fichiers tests mais en le faisant ou non dans mes essais pour régler ceci.
J’ai tenté de changer mon import mais cela me rendait une autre erreur ImportError: attempted relative import with no known parent package.

Je suis encore débutante dans l’utilisation de Python en mode projet, je suis ouverte à toute critique (mauvais termes, mauvaises utilisations, non-respect de certaines conventions) afin de m’améliorer. :slight_smile:

Salut,

Je pense qu’il s’agit d’un problème de répertoires d’installation : le projet n’est pas vraiment installé et n’est donc importable que depuis certains répertoires.

Je te conseille la lecture de ce message pour comprendre comment corriger ça : organisation projet python • Forum • Zeste de Savoir

1 « J'aime »

Une alternative à l’installation du code est d’avoir le dossier courant dans les chemins de recherche de Python.

Un bon moyen pour avoir le dossier actuel dans sys.path est de lancer tes tests avec python -m plutôt qu’avec python tests/test_auth.py.

Ça t’économise aussi d’écrire un main (pytest/unittest vont trouver tous seuls tes tests puisque tu les as bien nommés).

Ici j’utilise pytest et j’ai souvent recours à python -m pytest au lieu de pytest, juste pour ça.

Aussi je n’utilise pas de dossier src ce qui rend mes imports plus légers dans mes tests (en effet “src” n’est pas un module …).

L’argument pour utiliser un dossier src/ c’est justement pour « ne pas avoir un import qui marche “par surprise” en dev mais pas une fois installé »… “à cause” de ce -m qui rajoute le dossier courant à sys.path… y’a deux écoles quoi :smiling_face:

1 « J'aime »