Michael
Michael

Reputation: 42050

How to import tested modules in tests?

I am new at Python and coming from Java background.

Suppose I am developing a Python project with package hello:

hello_python/
  hello/
    hello.py
    __init__.py
  test/
    test_hello1.py
    test_hello2.py

I believe the project structure is correct.

Suppose hello.py contains function do_hello() I want to use in tests. How to import do_hello in tests test_hello1.py and test_hello2.py ?

Upvotes: 1

Views: 455

Answers (1)

ymbirtt
ymbirtt

Reputation: 1666

You've 2 small issues here. Firstly, you're running your test command from the wrong directory, and secondly you've not quite structured your project right.

Usually when I'm developing a python project I try to keep everything focussed around the project's root, which would be hello_python/ in your case. Python has the current working directory on its load path by default, so if you've got a project like this:

hello_python/
  hello/
    hello.py
    __init__.py
  test/
    test_hello1.py
    test_hello2.py


# hello/hello.py
def do_hello():
    return 'hello'

# test/test_hello.py
import unittest2
from hello.hello import do_hello

class HelloTest(unittest2.TestCase):
    def test_hello(self):
        self.assertEqual(do_hello(), 'hello')

if __name__ == '__main__':
    unittest2.main()

Second, test isn't a module right now, since you've missed the __init__.py in that directory. You should have a hierarchy that looks like this:

hello_python/
  hello/
    hello.py
    __init__.py
  test/
    __init__.py    #  <= This is what you were missing
    test_hello1.py
    test_hello2.py

When I try that on my machine, running python -m unittest test.hello_test works fine for me.

You may find that this is still a bit cumbersome. I'd strongly recommend installing nose, which will let you simply invoke nosetests from your project's root to find and execute all your tests automagically - providing you've got correct modules with __init__.pys.

Upvotes: 1

Related Questions