10

I have a very basic question about Python and unittest.

I have a directory structure like this.

Project
   |
   |-lib
      |
      |-__init__.py
      |-class.py
   |
   |-tests
      |
      |-__init__.py
      |-test_class.py

Now this is my content of test_class.py. If I import the lib.class from the root folder it's working fine. But if I import the file from somewhere else it's not working.


import unittest
from lib.class import Class

class TestClass(unittest.TestCase):
    def testClass(self):
            // do some test

def main():
    unittest.main()

if __name__ == '__main__':
    main()

When I run the test I got this error


Traceback (most recent call last):
  File "tests/test_class.py", line 2, in 
    from lib.class import Class
ImportError: No module named lib.class


Not sure how do I import the file from another folder that's not the root folder.

3 Answers 3

10

The better solution is to create a virtualenv and install the project in developer mode. This allows you to modify and execute code without having to re-install it.

virtualenv venv
source venv/bin/activate
pip install -e .

Inside the tests you would now simply include the fqdn.

from project.lib.class import Class

Keep in mind that you will need to use setuptools to properly define the project.

Sign up to request clarification or add additional context in comments.

Comments

5

Modify sys.path to include the Project directory

import sys
sys.path.append('/path/to/Project')

On Linux, you could do

import sys, os
sys.path.append(os.path.abspath(sys.path[0]) + '/../')

and that should include the directory above the running Python testing script, which is the Project folder

Comments

-1

in the setUp method of TestClass

add :

file_path = Path(__file__).parent.parent / 'lib' / 'class.py'

self.assertTrue(file_path.exists())

spec = spec_from_file_location(file_path.name, location=file_path, loader=None, submodule_search_locations=None)

self.module = module_from_spec(spec)

self.module.__spec__.loader.exec_module(self.module)

access:

aclass = self.module.AClass()

or

AClass = self.module.AClass
aclass = AClass()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.