2016-04-29 3 views
0

Вот моя структура папок:Как работает python «import» при использовании unittest?

. 
├── mod 
│   └── a.py 
└── tests 
    └── test_a.py 

2 directories, 2 files 

тесты/test_a.py просто выглядит следующим образом:

import unittest 
from mod import a 

class ATestCase(unittest.TestCase): 
    def test_a(self): 
     print(a.a) 

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

Когда я UnitTest, конечно, все в порядке:

$ python -m unittest tests/test_a.py 
1 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 

Однако , когда я просто запускаю тесты/test_a.py в качестве скрипта python, возникает ошибка:

$ python tests/test_a.py 
Traceback (most recent call last): 
    File "tests/test_a.py", line 2, in <module> 
    from mod import a 
ImportError: No module named 'mod' 

Мой вопрос в том, почему, используя unittest, мода становится доступным?

+0

@czheo вы видели этот подобный вопрос http://stackoverflow.com/questions/1896918/running-unittest-with-typical-test-directory-structure Помогло ли это? –

+0

@shafaq Вы имеете в виду модуль unittest, модифицированный «sys.path»? Однако, когда я напечатал sys.path в файле test_a.py, я не нашел, что он изменен. – czheo

+0

Он делает первый путь к элементу [0]. Попробуйте выполнить печать 'print os.path.abspath (sys.path [0])'. Вы увидите, что это даст вам путь к директории 'mod'. Без 'unittest' он перешел бы в' test' каталог. Поэтому '' 'модуль не отслеживается. –

ответ

0

Как уже упоминалось, и обсуждали этот вопрос: Running unittest with typical directory structure

Лучшее решение на мой взгляд использовать UnitTest интерфейс командной строки, которая будет добавить каталог в sys.path так что вам не придется (сделано в классе TestLoader).

Глядя на документацию: sys.path

Как инициализируется при запуске программы, первый пункт этого списка, путь [0], является каталог, содержащий сценарий, который был использован для вызова интерпретатора Python ,

Попробуйте напечатать print os.path.abspath(sys.path[0]) при использовании python -m unittest tests.test_a (в функции/метода), и вы увидите ../mod на вашем пути, и именно поэтому a находится.

Теперь запустите и tests каталог будет на пути, поэтому a не будет находиться.

Смежные вопросы