Import error running unittest in Python3

11,372

I was confused with imports in Python and how python works with modules.

project/
    module/
        __init__.py
        a.py
        b.py
    test/
        test_a.py
        test_b.py
    main.py

This is my new directories tree. The contains of the files are:

In main.py:

from module.b import Something

In b.py:

from .a import Something

In a.py:

from unittest import TestCase
from module.a import Something

In test_b.py:

from unittest import TestCase
from module.a import Something
from module.b import Something

Like this, it works fine, application and tests.

Share:
11,372
Sergio Rodríguez Calvo
Author by

Sergio Rodríguez Calvo

I am Sergio, from Seville. Since 2014 I have worked in different industries: aeronautics, health interoperability and financial. At this moment, I collaborate in the project of implantation of new architecture oriented to microservices, in the department of technology of ING BANK SPAIN & PORTUGAL, in Madrid. I love doing sports and learning new technologies.

Updated on June 14, 2022

Comments

  • Sergio Rodríguez Calvo
    Sergio Rodríguez Calvo almost 2 years

    I have a problem importing files in Python 3.6. My directories tree is as given below:

    project/
        app/
        ├── __init__.py
        ├── a.py
        └── b.py
        test/
        ├── __init__.py
        ├── test_a.py
        └── test_b.py
    

    It works my application (but, no works the tests) using following import statement in b.py:

    from a import *
    

    But, it does not work my application (but, works the tests) using this other in b.py:

    from .a import *
    

    So, I choose from a import *. Executing test like python3 -m unittest I always get following error:

    E.
    ======================================================================
    ERROR: tests.test_cell (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    ImportError: Failed to import test module: tests.test_cell
    Traceback (most recent call last):
      File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 428, in _find_test_path
        module = self._get_module_from_name(name)
      File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 369, in _get_module_from_name
        __import__(name)
      File "/Users/serrodcal/Repositories/project/tests/test_b.py", line 2, in <module>
        from app.b import *
      File "/Users/serrodcal/Repositories/project/app/b.py", line 1, in <module>
        from a import *
    ModuleNotFoundError: No module named 'a'
    
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    FAILED (errors=1)
    

    In this case, my import statement in test_b.py is as given below:

    from unittest import TestCase
    from app.cell import *
    

    Is there any way to fix this problem?

  • dagrun
    dagrun almost 5 years
    Why should the structure be like this?
  • dbustosp
    dbustosp almost 5 years
    I think you wanted to say: 'In test_a.py' instead of 'In a.py'.
  • dbustosp
    dbustosp almost 5 years
    It is also important to mention that 'module' must be installed in site-packages. Otherwise, you will have to add it to sys.path.